From 0247c2561b0a981514b758a0537293436b9cb01a Mon Sep 17 00:00:00 2001 From: jottakka Date: Tue, 28 Oct 2025 15:17:11 -0300 Subject: [PATCH] [MOAR][Pylon] Pylon Starter Toolkit (#658) Co-authored-by: Francisco Liberal --- toolkits/pylon_api/.pre-commit-config.yaml | 20 + toolkits/pylon_api/.ruff.toml | 50 + toolkits/pylon_api/LICENSE | 21 + toolkits/pylon_api/Makefile | 54 + toolkits/pylon_api/README.md | 26 + toolkits/pylon_api/pylon_api/__init__.py | 0 .../pylon_api/pylon_api/moar/openapi.json | 27137 ++++++++++++++++ toolkits/pylon_api/pylon_api/moar/pylon.json | 12264 +++++++ .../pylon_api/pylon_api/tools/__init__.py | 5176 +++ .../pylon_api/tools/request_body_schemas.py | 42 + .../wrapper_tools/CreateAccountActivity.json | 251 + .../wrapper_tools/CreateAccountHighlight.json | 171 + .../CreateAiResponseForIssue.json | 171 + .../wrapper_tools/CreateCustomField.json | 268 + .../wrapper_tools/CreateIssueNote.json | 219 + .../wrapper_tools/CreateIssueReply.json | 285 + .../wrapper_tools/CreateIssueThread.json | 137 + .../CreateKnowledgeBaseArticle.json | 529 + .../wrapper_tools/CreateMilestone.json | 203 + .../wrapper_tools/CreateNewAccount.json | 450 + .../wrapper_tools/CreateNewCollection.json | 203 + .../wrapper_tools/CreateNewContact.json | 276 + .../wrapper_tools/CreateNewIssue.json | 520 + .../wrapper_tools/CreateNewProject.json | 335 + .../pylon_api/wrapper_tools/CreateNewTag.json | 154 + .../wrapper_tools/CreateNewTeam.json | 137 + .../wrapper_tools/CreateRouteRedirect.json | 203 + .../pylon_api/wrapper_tools/CreateTask.json | 376 + .../CreateTrainingDataConfig.json | 137 + .../wrapper_tools/DeleteAccount.json | 104 + .../wrapper_tools/DeleteAccountHighlight.json | 137 + .../wrapper_tools/DeleteArticle.json | 137 + .../wrapper_tools/DeleteContact.json | 104 + .../wrapper_tools/DeleteExistingProject.json | 104 + .../wrapper_tools/DeleteExistingTag.json | 104 + .../pylon_api/wrapper_tools/DeleteIssue.json | 104 + .../wrapper_tools/DeleteMilestone.json | 104 + .../pylon_api/wrapper_tools/DeleteTask.json | 104 + .../DeleteTrainingDataDocuments.json | 170 + .../pylon_api/wrapper_tools/FetchAllTags.json | 69 + .../wrapper_tools/FetchTeamList.json | 69 + .../wrapper_tools/GetAccountInfo.json | 104 + .../wrapper_tools/GetAccountList.json | 137 + .../wrapper_tools/GetAllContacts.json | 69 + .../wrapper_tools/GetAllCustomFields.json | 104 + .../wrapper_tools/GetCollectionById.json | 137 + .../wrapper_tools/GetContactById.json | 170 + .../wrapper_tools/GetCustomActivityTypes.json | 69 + .../wrapper_tools/GetCustomField.json | 104 + .../pylon_api/wrapper_tools/GetIssueById.json | 104 + .../wrapper_tools/GetIssueFollowers.json | 104 + .../wrapper_tools/GetIssueMessages.json | 104 + .../wrapper_tools/GetIssueStatuses.json | 69 + .../wrapper_tools/GetIssueThreads.json | 104 + .../wrapper_tools/GetIssuesList.json | 137 + .../wrapper_tools/GetKnowledgeBaseById.json | 104 + .../wrapper_tools/GetKnowledgeBases.json | 69 + .../wrapper_tools/GetOrganizationDetails.json | 69 + .../pylon_api/wrapper_tools/GetTagById.json | 104 + .../pylon_api/wrapper_tools/GetTeamById.json | 104 + .../wrapper_tools/GetTicketForm.json | 104 + .../wrapper_tools/GetTicketForms.json | 69 + .../pylon_api/wrapper_tools/GetUserById.json | 104 + .../pylon_api/wrapper_tools/GetUserRoles.json | 69 + .../pylon_api/wrapper_tools/ImportIssue.json | 578 + .../wrapper_tools/ImportMessagesToIssue.json | 253 + .../wrapper_tools/ImportNewContact.json | 260 + .../wrapper_tools/LinkExternalIssue.json | 187 + .../ListCollectionsInKnowledgeBase.json | 104 + .../wrapper_tools/ListTrainingData.json | 69 + .../pylon_api/wrapper_tools/ListUsers.json | 69 + .../wrapper_tools/RedactMessage.json | 137 + .../RetrieveTrainingDataConfiguration.json | 104 + .../wrapper_tools/SearchAccounts.json | 268 + .../wrapper_tools/SearchContacts.json | 268 + .../wrapper_tools/SearchIssuesByFilters.json | 268 + .../wrapper_tools/SearchUsersByEmail.json | 268 + .../pylon_api/wrapper_tools/SnoozeIssue.json | 155 + .../wrapper_tools/UpdateAccount.json | 467 + .../wrapper_tools/UpdateAccountHighlight.json | 203 + .../wrapper_tools/UpdateArticle.json | 448 + .../wrapper_tools/UpdateContactInfo.json | 309 + .../wrapper_tools/UpdateCustomField.json | 269 + .../wrapper_tools/UpdateExistingTag.json | 170 + .../wrapper_tools/UpdateExistingTeam.json | 170 + .../pylon_api/wrapper_tools/UpdateIssue.json | 333 + .../wrapper_tools/UpdateIssueFollowers.json | 203 + .../wrapper_tools/UpdateMilestone.json | 170 + .../wrapper_tools/UpdateMultipleAccounts.json | 236 + .../wrapper_tools/UpdateProject.json | 482 + .../pylon_api/wrapper_tools/UpdateTask.json | 376 + .../wrapper_tools/UpdateUserProfile.json | 170 + toolkits/pylon_api/pyproject.toml | 60 + toolkits/pylon_api/tests/__init__.py | 0 94 files changed, 60491 insertions(+) create mode 100644 toolkits/pylon_api/.pre-commit-config.yaml create mode 100644 toolkits/pylon_api/.ruff.toml create mode 100644 toolkits/pylon_api/LICENSE create mode 100644 toolkits/pylon_api/Makefile create mode 100644 toolkits/pylon_api/README.md create mode 100644 toolkits/pylon_api/pylon_api/__init__.py create mode 100644 toolkits/pylon_api/pylon_api/moar/openapi.json create mode 100644 toolkits/pylon_api/pylon_api/moar/pylon.json create mode 100644 toolkits/pylon_api/pylon_api/tools/__init__.py create mode 100644 toolkits/pylon_api/pylon_api/tools/request_body_schemas.py create mode 100644 toolkits/pylon_api/pylon_api/wrapper_tools/CreateAccountActivity.json create mode 100644 toolkits/pylon_api/pylon_api/wrapper_tools/CreateAccountHighlight.json create mode 100644 toolkits/pylon_api/pylon_api/wrapper_tools/CreateAiResponseForIssue.json create mode 100644 toolkits/pylon_api/pylon_api/wrapper_tools/CreateCustomField.json create mode 100644 toolkits/pylon_api/pylon_api/wrapper_tools/CreateIssueNote.json create mode 100644 toolkits/pylon_api/pylon_api/wrapper_tools/CreateIssueReply.json create mode 100644 toolkits/pylon_api/pylon_api/wrapper_tools/CreateIssueThread.json create mode 100644 toolkits/pylon_api/pylon_api/wrapper_tools/CreateKnowledgeBaseArticle.json create mode 100644 toolkits/pylon_api/pylon_api/wrapper_tools/CreateMilestone.json create mode 100644 toolkits/pylon_api/pylon_api/wrapper_tools/CreateNewAccount.json create mode 100644 toolkits/pylon_api/pylon_api/wrapper_tools/CreateNewCollection.json create mode 100644 toolkits/pylon_api/pylon_api/wrapper_tools/CreateNewContact.json create mode 100644 toolkits/pylon_api/pylon_api/wrapper_tools/CreateNewIssue.json create mode 100644 toolkits/pylon_api/pylon_api/wrapper_tools/CreateNewProject.json create mode 100644 toolkits/pylon_api/pylon_api/wrapper_tools/CreateNewTag.json create mode 100644 toolkits/pylon_api/pylon_api/wrapper_tools/CreateNewTeam.json create mode 100644 toolkits/pylon_api/pylon_api/wrapper_tools/CreateRouteRedirect.json create mode 100644 toolkits/pylon_api/pylon_api/wrapper_tools/CreateTask.json create mode 100644 toolkits/pylon_api/pylon_api/wrapper_tools/CreateTrainingDataConfig.json create mode 100644 toolkits/pylon_api/pylon_api/wrapper_tools/DeleteAccount.json create mode 100644 toolkits/pylon_api/pylon_api/wrapper_tools/DeleteAccountHighlight.json create mode 100644 toolkits/pylon_api/pylon_api/wrapper_tools/DeleteArticle.json create mode 100644 toolkits/pylon_api/pylon_api/wrapper_tools/DeleteContact.json create mode 100644 toolkits/pylon_api/pylon_api/wrapper_tools/DeleteExistingProject.json create mode 100644 toolkits/pylon_api/pylon_api/wrapper_tools/DeleteExistingTag.json create mode 100644 toolkits/pylon_api/pylon_api/wrapper_tools/DeleteIssue.json create mode 100644 toolkits/pylon_api/pylon_api/wrapper_tools/DeleteMilestone.json create mode 100644 toolkits/pylon_api/pylon_api/wrapper_tools/DeleteTask.json create mode 100644 toolkits/pylon_api/pylon_api/wrapper_tools/DeleteTrainingDataDocuments.json create mode 100644 toolkits/pylon_api/pylon_api/wrapper_tools/FetchAllTags.json create mode 100644 toolkits/pylon_api/pylon_api/wrapper_tools/FetchTeamList.json create mode 100644 toolkits/pylon_api/pylon_api/wrapper_tools/GetAccountInfo.json create mode 100644 toolkits/pylon_api/pylon_api/wrapper_tools/GetAccountList.json create mode 100644 toolkits/pylon_api/pylon_api/wrapper_tools/GetAllContacts.json create mode 100644 toolkits/pylon_api/pylon_api/wrapper_tools/GetAllCustomFields.json create mode 100644 toolkits/pylon_api/pylon_api/wrapper_tools/GetCollectionById.json create mode 100644 toolkits/pylon_api/pylon_api/wrapper_tools/GetContactById.json create mode 100644 toolkits/pylon_api/pylon_api/wrapper_tools/GetCustomActivityTypes.json create mode 100644 toolkits/pylon_api/pylon_api/wrapper_tools/GetCustomField.json create mode 100644 toolkits/pylon_api/pylon_api/wrapper_tools/GetIssueById.json create mode 100644 toolkits/pylon_api/pylon_api/wrapper_tools/GetIssueFollowers.json create mode 100644 toolkits/pylon_api/pylon_api/wrapper_tools/GetIssueMessages.json create mode 100644 toolkits/pylon_api/pylon_api/wrapper_tools/GetIssueStatuses.json create mode 100644 toolkits/pylon_api/pylon_api/wrapper_tools/GetIssueThreads.json create mode 100644 toolkits/pylon_api/pylon_api/wrapper_tools/GetIssuesList.json create mode 100644 toolkits/pylon_api/pylon_api/wrapper_tools/GetKnowledgeBaseById.json create mode 100644 toolkits/pylon_api/pylon_api/wrapper_tools/GetKnowledgeBases.json create mode 100644 toolkits/pylon_api/pylon_api/wrapper_tools/GetOrganizationDetails.json create mode 100644 toolkits/pylon_api/pylon_api/wrapper_tools/GetTagById.json create mode 100644 toolkits/pylon_api/pylon_api/wrapper_tools/GetTeamById.json create mode 100644 toolkits/pylon_api/pylon_api/wrapper_tools/GetTicketForm.json create mode 100644 toolkits/pylon_api/pylon_api/wrapper_tools/GetTicketForms.json create mode 100644 toolkits/pylon_api/pylon_api/wrapper_tools/GetUserById.json create mode 100644 toolkits/pylon_api/pylon_api/wrapper_tools/GetUserRoles.json create mode 100644 toolkits/pylon_api/pylon_api/wrapper_tools/ImportIssue.json create mode 100644 toolkits/pylon_api/pylon_api/wrapper_tools/ImportMessagesToIssue.json create mode 100644 toolkits/pylon_api/pylon_api/wrapper_tools/ImportNewContact.json create mode 100644 toolkits/pylon_api/pylon_api/wrapper_tools/LinkExternalIssue.json create mode 100644 toolkits/pylon_api/pylon_api/wrapper_tools/ListCollectionsInKnowledgeBase.json create mode 100644 toolkits/pylon_api/pylon_api/wrapper_tools/ListTrainingData.json create mode 100644 toolkits/pylon_api/pylon_api/wrapper_tools/ListUsers.json create mode 100644 toolkits/pylon_api/pylon_api/wrapper_tools/RedactMessage.json create mode 100644 toolkits/pylon_api/pylon_api/wrapper_tools/RetrieveTrainingDataConfiguration.json create mode 100644 toolkits/pylon_api/pylon_api/wrapper_tools/SearchAccounts.json create mode 100644 toolkits/pylon_api/pylon_api/wrapper_tools/SearchContacts.json create mode 100644 toolkits/pylon_api/pylon_api/wrapper_tools/SearchIssuesByFilters.json create mode 100644 toolkits/pylon_api/pylon_api/wrapper_tools/SearchUsersByEmail.json create mode 100644 toolkits/pylon_api/pylon_api/wrapper_tools/SnoozeIssue.json create mode 100644 toolkits/pylon_api/pylon_api/wrapper_tools/UpdateAccount.json create mode 100644 toolkits/pylon_api/pylon_api/wrapper_tools/UpdateAccountHighlight.json create mode 100644 toolkits/pylon_api/pylon_api/wrapper_tools/UpdateArticle.json create mode 100644 toolkits/pylon_api/pylon_api/wrapper_tools/UpdateContactInfo.json create mode 100644 toolkits/pylon_api/pylon_api/wrapper_tools/UpdateCustomField.json create mode 100644 toolkits/pylon_api/pylon_api/wrapper_tools/UpdateExistingTag.json create mode 100644 toolkits/pylon_api/pylon_api/wrapper_tools/UpdateExistingTeam.json create mode 100644 toolkits/pylon_api/pylon_api/wrapper_tools/UpdateIssue.json create mode 100644 toolkits/pylon_api/pylon_api/wrapper_tools/UpdateIssueFollowers.json create mode 100644 toolkits/pylon_api/pylon_api/wrapper_tools/UpdateMilestone.json create mode 100644 toolkits/pylon_api/pylon_api/wrapper_tools/UpdateMultipleAccounts.json create mode 100644 toolkits/pylon_api/pylon_api/wrapper_tools/UpdateProject.json create mode 100644 toolkits/pylon_api/pylon_api/wrapper_tools/UpdateTask.json create mode 100644 toolkits/pylon_api/pylon_api/wrapper_tools/UpdateUserProfile.json create mode 100644 toolkits/pylon_api/pyproject.toml create mode 100644 toolkits/pylon_api/tests/__init__.py diff --git a/toolkits/pylon_api/.pre-commit-config.yaml b/toolkits/pylon_api/.pre-commit-config.yaml new file mode 100644 index 00000000..0560d056 --- /dev/null +++ b/toolkits/pylon_api/.pre-commit-config.yaml @@ -0,0 +1,20 @@ +files: ^(pylon_api/|tests/|pyproject\.toml|Makefile) +repos: + - repo: https://github.com/pre-commit/pre-commit-hooks + rev: "v4.4.0" + hooks: + - id: check-case-conflict + - id: check-merge-conflict + - id: check-toml + - id: check-yaml + - id: end-of-file-fixer + exclude: ^pylon_api/tools/__init__\.py$ + - id: trailing-whitespace + exclude: ^pylon_api/tools/__init__\.py$ + + - repo: https://github.com/astral-sh/ruff-pre-commit + rev: v0.6.7 + hooks: + - id: ruff + args: [--fix] + - id: ruff-format diff --git a/toolkits/pylon_api/.ruff.toml b/toolkits/pylon_api/.ruff.toml new file mode 100644 index 00000000..2c273ff6 --- /dev/null +++ b/toolkits/pylon_api/.ruff.toml @@ -0,0 +1,50 @@ +target-version = "py311" +line-length = 100 +fix = true + +# Exclude large auto-generated files from all checks +exclude = [ + "pylon_api/tools/__init__.py", + "pylon_api/tools/request_body_schemas.py", +] + +[lint] +select = [ + # flake8-2020 + "YTT", + # flake8-bandit + "S", + # flake8-bugbear + "B", + # flake8-builtins + "A", + # flake8-comprehensions + "C4", + # flake8-debugger + "T10", + # flake8-simplify + "SIM", + # isort + "I", + # mccabe + "C90", + # pycodestyle + "E", "W", + # pyflakes + "F", + # pygrep-hooks + "PGH", + # pyupgrade + "UP", + # ruff + "RUF", + # tryceratops + "TRY", +] + +[lint.per-file-ignores] +"**/tests/*" = ["S101"] + +[format] +preview = true +skip-magic-trailing-comma = false diff --git a/toolkits/pylon_api/LICENSE b/toolkits/pylon_api/LICENSE new file mode 100644 index 00000000..dfbb8b76 --- /dev/null +++ b/toolkits/pylon_api/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2025, Arcade AI + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/toolkits/pylon_api/Makefile b/toolkits/pylon_api/Makefile new file mode 100644 index 00000000..86da492a --- /dev/null +++ b/toolkits/pylon_api/Makefile @@ -0,0 +1,54 @@ +.PHONY: help + +help: + @echo "🛠️ github Commands:\n" + @grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | sort | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-30s\033[0m %s\n", $$1, $$2}' + +.PHONY: install +install: ## Install the uv environment and install all packages with dependencies + @echo "🚀 Creating virtual environment and installing all packages using uv" + @uv sync --active --all-extras --no-sources + @if [ -f .pre-commit-config.yaml ]; then uv run --no-sources pre-commit install; fi + @echo "✅ All packages and dependencies installed via uv" + +.PHONY: install-local +install-local: ## Install the uv environment and install all packages with dependencies with local Arcade sources + @echo "🚀 Creating virtual environment and installing all packages using uv" + @uv sync --active --all-extras + @if [ -f .pre-commit-config.yaml ]; then uv run pre-commit install; fi + @echo "✅ All packages and dependencies installed via uv" +.PHONY: build +build: clean-build ## Build wheel file using poetry + @echo "🚀 Creating wheel file" + uv build + +.PHONY: clean-build +clean-build: ## clean build artifacts + @echo "🗑️ Cleaning dist directory" + rm -rf dist + +.PHONY: test +test: ## Test the code with pytest + @echo "🚀 Testing code: Running pytest" + @uv run --no-sources pytest -W ignore -v --cov --cov-config=pyproject.toml --cov-report=xml + +.PHONY: coverage +coverage: ## Generate coverage report + @echo "coverage report" + @uv run --no-sources coverage report + @echo "Generating coverage report" + @uv run --no-sources coverage html + +.PHONY: bump-version +bump-version: ## Bump the version in the pyproject.toml file by a patch version + @echo "🚀 Bumping version in pyproject.toml" + uv version --no-sources --bump patch + +.PHONY: check +check: ## Run code quality tools. + @if [ -f .pre-commit-config.yaml ]; then\ + echo "🚀 Linting code: Running pre-commit";\ + uv run --no-sources pre-commit run -a;\ + fi + @echo "🚀 Static type checking: Running mypy" + @uv run --no-sources mypy --config-file=pyproject.toml diff --git a/toolkits/pylon_api/README.md b/toolkits/pylon_api/README.md new file mode 100644 index 00000000..0c3fc7e4 --- /dev/null +++ b/toolkits/pylon_api/README.md @@ -0,0 +1,26 @@ +
+ +
+ +
+ Python version + License + PyPI version +
+ + +
+
+ +# Arcade pylon_api Toolkit +Tools that enable LLMs to interact directly with the pylon API. +## Features + +- The pylon_api toolkit does not have any features yet. + +## Development + +Read the docs on how to create a toolkit [here](https://docs.arcade.dev/home/build-tools/create-a-toolkit) diff --git a/toolkits/pylon_api/pylon_api/__init__.py b/toolkits/pylon_api/pylon_api/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/toolkits/pylon_api/pylon_api/moar/openapi.json b/toolkits/pylon_api/pylon_api/moar/openapi.json new file mode 100644 index 00000000..0c9bcd20 --- /dev/null +++ b/toolkits/pylon_api/pylon_api/moar/openapi.json @@ -0,0 +1,27137 @@ +{ + "components": { + "responses": { + "AddIssueFollowersResponse": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AddIssueFollowersResponseBody" + } + } + }, + "description": "" + }, + "CreateAccountHighlightResponse": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateAccountHighlightResponseBody" + } + } + }, + "description": "" + }, + "CreateAccountResponse": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateAccountResponseBody" + } + } + }, + "description": "" + }, + "CreateActivityResponse": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateActivityResponseBody" + } + } + }, + "description": "" + }, + "CreateArticleResponse": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateArticleResponseBody" + } + } + }, + "description": "" + }, + "CreateAttachmentResponse": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateAttachmentResponseBody" + } + } + }, + "description": "" + }, + "CreateCallRecordingResponse": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateCallRecordingResponseBody" + } + } + }, + "description": "" + }, + "CreateCollectionResponse": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateCollectionResponseBody" + } + } + }, + "description": "" + }, + "CreateContactResponse": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateContactResponseBody" + } + } + }, + "description": "" + }, + "CreateCustomFieldResponse": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateCustomFieldResponseBody" + } + } + }, + "description": "" + }, + "CreateIssueAIResponseResponse": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateIssueAIResponseResponseBody" + } + } + }, + "description": "" + }, + "CreateIssueNoteResponse": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateIssueNoteResponseBody" + } + } + }, + "description": "" + }, + "CreateIssueReplyResponse": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateIssueReplyResponseBody" + } + } + }, + "description": "" + }, + "CreateIssueResponse": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateIssueResponseBody" + } + } + }, + "description": "" + }, + "CreateIssueThreadResponse": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateIssueThreadResponseBody" + } + } + }, + "description": "" + }, + "CreateMilestoneResponse": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateMilestoneResponseBody" + } + } + }, + "description": "" + }, + "CreateMilestoneResponseBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Milestone" + } + } + }, + "description": "", + "headers": { + "request_id": { + "description": "The request ID for tracking.", + "schema": { + "type": "string" + } + } + } + }, + "CreateProjectResponse": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateProjectResponseBody" + } + } + }, + "description": "" + }, + "CreateProjectResponseBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Project" + } + } + }, + "description": "", + "headers": { + "request_id": { + "description": "The request ID for tracking.", + "schema": { + "type": "string" + } + } + } + }, + "CreateRouteRedirectResponse": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateRouteRedirectResponseBody" + } + } + }, + "description": "" + }, + "CreateTagResponse": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateTagResponseBody" + } + } + }, + "description": "" + }, + "CreateTaskResponse": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateTaskResponseBody" + } + } + }, + "description": "" + }, + "CreateTaskResponseBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Task" + } + } + }, + "description": "", + "headers": { + "request_id": { + "description": "The request ID for tracking.", + "schema": { + "type": "string" + } + } + } + }, + "CreateTeamResponse": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateTeamResponseBody" + } + } + }, + "description": "" + }, + "CreateTrainingDataResponse": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateTrainingDataResponseBody" + } + } + }, + "description": "" + }, + "DeleteAccountHighlightResponse": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DeleteAccountHighlightResponseBody" + } + } + }, + "description": "", + "headers": { + "Body": { + "schema": { + "type": "object" + } + } + } + }, + "DeleteAccountResponse": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DeleteAccountResponseBody" + } + } + }, + "description": "" + }, + "DeleteArticleResponse": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DeleteArticleResponseBody" + } + } + }, + "description": "" + }, + "DeleteContactResponse": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DeleteContactResponseBody" + } + } + }, + "description": "" + }, + "DeleteIssueResponse": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DeleteIssueResponseBody" + } + } + }, + "description": "" + }, + "DeleteMilestoneResponse": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DeleteMilestoneResponseBody" + } + } + }, + "description": "" + }, + "DeleteProjectResponse": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DeleteProjectResponseBody" + } + } + }, + "description": "" + }, + "DeleteTagResponse": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DeleteTagResponseBody" + } + } + }, + "description": "" + }, + "DeleteTaskResponse": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DeleteTaskResponseBody" + } + } + }, + "description": "" + }, + "DeleteTrainingDataDocumentsResponse": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DeleteTrainingDataDocumentsResponseBody" + } + } + }, + "description": "" + }, + "ErrorApiResponse": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorApiResponseBody" + } + } + }, + "description": "" + }, + "GetAccountResponse": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GetAccountResponseBody" + } + } + }, + "description": "" + }, + "GetAccountsResponse": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GetAccountsResponseBody" + } + } + }, + "description": "" + }, + "GetActivityTypesResponse": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GetActivityTypesResponseBody" + } + } + }, + "description": "" + }, + "GetArticleResponse": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GetArticleResponseBody" + } + } + }, + "description": "" + }, + "GetArticlesResponse": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GetArticlesResponseBody" + } + } + }, + "description": "" + }, + "GetCollectionResponse": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GetCollectionResponseBody" + } + } + }, + "description": "" + }, + "GetCollectionsResponse": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GetCollectionsResponseBody" + } + } + }, + "description": "" + }, + "GetContactResponse": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GetContactResponseBody" + } + } + }, + "description": "" + }, + "GetContactsResponse": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GetContactsResponseBody" + } + } + }, + "description": "" + }, + "GetCustomFieldResponse": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GetCustomFieldResponseBody" + } + } + }, + "description": "" + }, + "GetCustomFieldsResponse": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GetCustomFieldsResponseBody" + } + } + }, + "description": "" + }, + "GetIssueFollowersResponse": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GetIssueFollowersResponseBody" + } + } + }, + "description": "" + }, + "GetIssueMessagesResponse": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GetIssueMessagesResponseBody" + } + } + }, + "description": "" + }, + "GetIssueResponse": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GetIssueResponseBody" + } + } + }, + "description": "" + }, + "GetIssueStatusesResponse": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GetIssueStatusesResponseBody" + } + } + }, + "description": "" + }, + "GetIssueThreadsResponse": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GetIssueThreadsResponseBody" + } + } + }, + "description": "" + }, + "GetIssuesResponse": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GetIssuesResponseBody" + } + } + }, + "description": "" + }, + "GetKnowledgeBaseResponse": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GetKnowledgeBaseResponseBody" + } + } + }, + "description": "" + }, + "GetKnowledgeBasesResponse": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GetKnowledgeBasesResponseBody" + } + } + }, + "description": "" + }, + "GetMeResponse": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GetMeResponseBody" + } + } + }, + "description": "" + }, + "GetTagResponse": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GetTagResponseBody" + } + } + }, + "description": "" + }, + "GetTagsResponse": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GetTagsResponseBody" + } + } + }, + "description": "" + }, + "GetTeamResponse": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GetTeamResponseBody" + } + } + }, + "description": "" + }, + "GetTeamsResponse": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GetTeamsResponseBody" + } + } + }, + "description": "" + }, + "GetTicketFormResponse": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GetTicketFormResponseBody" + } + } + }, + "description": "" + }, + "GetTicketFormsResponse": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GetTicketFormsResponseBody" + } + } + }, + "description": "" + }, + "GetTrainingDataResponse": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GetTrainingDataResponseBody" + } + } + }, + "description": "" + }, + "GetUserResponse": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GetUserResponseBody" + } + } + }, + "description": "" + }, + "GetUserRolesResponse": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GetUserRolesResponseBody" + } + } + }, + "description": "" + }, + "GetUsersResponse": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GetUsersResponseBody" + } + } + }, + "description": "" + }, + "ImportContactResponse": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ImportContactResponseBody" + } + } + }, + "description": "" + }, + "ImportIssueResponse": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ImportIssueResponseBody" + } + } + }, + "description": "" + }, + "ImportMessagesResponse": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ImportMessagesResponseBody" + } + } + }, + "description": "" + }, + "LinkExternalIssueResponse": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/LinkExternalIssueResponseBody" + } + } + }, + "description": "" + }, + "ListTrainingDataResponse": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ListTrainingDataResponseBody" + } + } + }, + "description": "" + }, + "RedactMessageResponse": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RedactMessageResponseBody" + } + } + }, + "description": "" + }, + "SearchAccountsResponse": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SearchAccountsResponseBody" + } + } + }, + "description": "" + }, + "SearchContactsResponse": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SearchContactsResponseBody" + } + } + }, + "description": "" + }, + "SearchIssuesResponse": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SearchIssuesResponseBody" + } + } + }, + "description": "" + }, + "SearchUsersResponse": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SearchUsersResponseBody" + } + } + }, + "description": "" + }, + "SnoozeIssueResponse": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SnoozeIssueResponseBody" + } + } + }, + "description": "" + }, + "TrainingDataUploadResponse": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TrainingDataUploadResponseBody" + } + } + }, + "description": "", + "headers": { + "Body": { + "schema": { + "type": "object" + } + } + } + }, + "UpdateAccountHighlightResponse": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateAccountHighlightResponseBody" + } + } + }, + "description": "" + }, + "UpdateAccountResponse": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateAccountResponseBody" + } + } + }, + "description": "" + }, + "UpdateAccountsResponse": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateAccountsResponseBody" + } + } + }, + "description": "" + }, + "UpdateArticleResponse": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateArticleResponseBody" + } + } + }, + "description": "" + }, + "UpdateContactResponse": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateContactResponseBody" + } + } + }, + "description": "" + }, + "UpdateCustomFieldResponse": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateCustomFieldResponseBody" + } + } + }, + "description": "" + }, + "UpdateIssueResponse": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateIssueResponseBody" + } + } + }, + "description": "" + }, + "UpdateMilestoneResponse": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateMilestoneResponseBody" + } + } + }, + "description": "" + }, + "UpdateMilestoneResponseBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Milestone" + } + } + }, + "description": "", + "headers": { + "request_id": { + "description": "The request ID for tracking.", + "schema": { + "type": "string" + } + } + } + }, + "UpdateProjectResponse": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateProjectResponseBody" + } + } + }, + "description": "" + }, + "UpdateProjectResponseBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Project" + } + } + }, + "description": "", + "headers": { + "request_id": { + "description": "The request ID for tracking.", + "schema": { + "type": "string" + } + } + } + }, + "UpdateTagResponse": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateTagResponseBody" + } + } + }, + "description": "" + }, + "UpdateTaskResponse": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateTaskResponseBody" + } + } + }, + "description": "" + }, + "UpdateTaskResponseBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Task" + } + } + }, + "description": "", + "headers": { + "request_id": { + "description": "The request ID for tracking.", + "schema": { + "type": "string" + } + } + } + }, + "UpdateTeamResponse": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateTeamResponseBody" + } + } + }, + "description": "" + }, + "UpdateUserResponse": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateUserResponseBody" + } + } + }, + "description": "" + }, + "UploadAccountFileResponse": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UploadAccountFileResponseBody" + } + } + }, + "description": "" + }, + "UploadTrainingDataFileContentResponse": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TrainingDataUploadResponseBody" + } + } + }, + "description": "" + } + }, + "schemas": { + "Account": { + "properties": { + "channels": { + "description": "Channels associated with the account.", + "items": { + "$ref": "#/components/schemas/Channel" + }, + "type": "array", + "x-go-name": "Channels" + }, + "created_at": { + "description": "The creation time of the account.", + "type": "string", + "x-go-name": "CreatedAt" + }, + "crm_settings": { + "$ref": "#/components/schemas/CRMSettings" + }, + "custom_fields": { + "additionalProperties": { + "$ref": "#/components/schemas/CustomFieldValue" + }, + "description": "Custom fields associated with the account.", + "type": "object", + "x-go-name": "CustomFields" + }, + "domain": { + "description": "The primary domain of the account.", + "type": "string", + "x-go-name": "Domain" + }, + "domains": { + "description": "The list of domains associated with the account.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Domains" + }, + "external_ids": { + "description": "External IDs associated with the account.", + "items": { + "$ref": "#/components/schemas/ExternalID" + }, + "type": "array", + "x-go-name": "ExternalIDs" + }, + "id": { + "description": "The ID of the account.", + "type": "string", + "x-go-name": "ID" + }, + "latest_customer_activity_time": { + "description": "The time of the latest customer activity.", + "type": "string", + "x-go-name": "LatestCustomerActivityTime" + }, + "name": { + "description": "The name of the account.", + "type": "string", + "x-go-name": "Name" + }, + "owner": { + "$ref": "#/components/schemas/MiniUser" + }, + "primary_domain": { + "description": "The primary domain of the account.", + "type": "string", + "x-go-name": "PrimaryDomain" + }, + "tags": { + "description": "Tags associated with the account.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Tags" + }, + "type": { + "description": "The type of the account.", + "type": "string", + "x-go-name": "Type" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "AccountHighlight": { + "properties": { + "account_id": { + "description": "The ID of the account this highlight belongs to.", + "type": "string", + "x-go-name": "AccountID" + }, + "content_html": { + "description": "The HTML content of the highlight.", + "type": "string", + "x-go-name": "ContentHTML" + }, + "created_at": { + "description": "The timestamp of when the highlight was created.", + "type": "string", + "x-go-name": "CreatedAt" + }, + "expires_at": { + "description": "The timestamp of when the highlight expires, if set.", + "type": "string", + "x-go-name": "ExpiresAt" + }, + "id": { + "description": "The ID of the account highlight.", + "type": "string", + "x-go-name": "ID" + }, + "updated_at": { + "description": "The timestamp of when the highlight was last updated.", + "type": "string", + "x-go-name": "UpdatedAt" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "ActivityType": { + "properties": { + "icon_url": { + "description": "The icon url of the activity type.", + "type": "string", + "x-go-name": "IconURL" + }, + "id": { + "description": "The ID of the activity type.", + "type": "string", + "x-go-name": "ID" + }, + "label": { + "description": "The label of the activity type.", + "type": "string", + "x-go-name": "Label" + }, + "slug": { + "description": "The slug of the activity type.", + "type": "string", + "x-go-name": "Slug" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "AddIssueFollowersRequestBody": { + "properties": { + "contact_ids": { + "description": "The IDs of contacts to add as followers.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "ContactIDs" + }, + "operation": { + "description": "Operation to perform. Use \"add\" to add followers (default) or \"remove\" to remove followers.", + "type": "string", + "x-go-name": "Operation" + }, + "user_ids": { + "description": "The IDs of users to add as followers.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "UserIDs" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + }, + "AddIssueFollowersResponseBody": { + "properties": { + "data": { + "description": "The data payload of the response.", + "items": { + "$ref": "#/components/schemas/Follower" + }, + "type": "array", + "x-go-name": "Data" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + }, + "Article": { + "properties": { + "current_published_content_html": { + "description": "The current published content of the article in HTML.", + "type": "string", + "x-go-name": "CurrentPublishedContentHTML" + }, + "id": { + "description": "The ID of the article.", + "type": "string", + "x-go-name": "ID" + }, + "identifier": { + "description": "The identifier of the article", + "type": "string", + "x-go-name": "Identifier" + }, + "is_published": { + "description": "IsPublished indicates if the article is published.", + "type": "boolean", + "x-go-name": "IsPublished" + }, + "last_published_at": { + "description": "The last published at time of the article.", + "type": "string", + "x-go-name": "LastPublishedAt" + }, + "slug": { + "description": "The slug of the article.", + "type": "string", + "x-go-name": "Slug" + }, + "title": { + "description": "The name of the article.", + "type": "string", + "x-go-name": "Title" + }, + "url": { + "description": "The URL of the article.", + "type": "string", + "x-go-name": "URL" + }, + "visibility_config": { + "$ref": "#/components/schemas/VisibilityConfig" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "ArticleTranslationInput": { + "properties": { + "body_html": { + "description": "The translated HTML body of the article.", + "type": "string", + "x-go-name": "BodyHTML" + }, + "language": { + "description": "The language code of the translation. Supported language codes can be found in https://docs.usepylon.com/pylon-docs/knowledge-base/translation#supported-language-codes.", + "type": "string", + "x-go-name": "Language" + }, + "title": { + "description": "The translated title of the article.", + "type": "string", + "x-go-name": "Title" + } + }, + "required": [ + "body_html", + "language", + "title" + ], + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + }, + "Attachment": { + "properties": { + "description": { + "description": "The description of the attachment.", + "type": "string", + "x-go-name": "Description" + }, + "id": { + "description": "The ID of the attachment.", + "type": "string", + "x-go-name": "ID" + }, + "name": { + "description": "The name of the attachment.", + "type": "string", + "x-go-name": "Name" + }, + "url": { + "description": "The URL of the attachment.", + "type": "string", + "x-go-name": "URL" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "CRMDetails": { + "properties": { + "id": { + "description": "The ID of the CRM for that source.", + "type": "string", + "x-go-name": "ID" + }, + "source": { + "description": "The source of the CRM.", + "type": "string", + "x-go-name": "Source" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "CRMSettings": { + "properties": { + "details": { + "description": "List of all CRM details for the account.", + "items": { + "$ref": "#/components/schemas/CRMDetails" + }, + "type": "array", + "x-go-name": "Details" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "CSATResponse": { + "properties": { + "comment": { + "description": "The comment of the CSAT response.", + "type": "string", + "x-go-name": "Comment" + }, + "score": { + "description": "The score of the CSAT response.", + "format": "int64", + "type": "integer", + "x-go-name": "Score" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "CallRecording": { + "properties": { + "id": { + "description": "The ID of the call recording.", + "type": "string", + "x-go-name": "ID" + }, + "url": { + "description": "The URL of the call recording.", + "type": "string", + "x-go-name": "URL" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "Channel": { + "properties": { + "channel_id": { + "description": "The ID of the channel. If this is a Microsoft Teams channel, the ID must be in the format of `{team_id}|{channel_id}`.", + "type": "string", + "x-go-name": "ChannelID" + }, + "is_primary": { + "description": "Whether this channel is the primary channel for the account.", + "type": "boolean", + "x-go-name": "IsPrimary" + }, + "mirror_to": { + "$ref": "#/components/schemas/MirrorChannel" + }, + "source": { + "description": "The source, which can be one of `[\"slack\", \"microsoft_teams\", \"discord\"]`.", + "type": "string", + "x-go-name": "Source" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "Collection": { + "properties": { + "created_at": { + "description": "The created at time of the collection.", + "type": "string", + "x-go-name": "CreatedAt" + }, + "description": { + "description": "The description of the collection.", + "type": "string", + "x-go-name": "Description" + }, + "id": { + "description": "The ID of the collection.", + "type": "string", + "x-go-name": "ID" + }, + "parent_collection_id": { + "description": "The ID of the parent collection.", + "type": "string", + "x-go-name": "ParentCollectionID" + }, + "slug": { + "description": "The slug of the collection.", + "type": "string", + "x-go-name": "Slug" + }, + "title": { + "description": "The name of the collection.", + "type": "string", + "x-go-name": "Title" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "Contact": { + "properties": { + "account": { + "$ref": "#/components/schemas/MiniAccount" + }, + "avatar_url": { + "description": "Avatar URL of the contact.", + "type": "string", + "x-go-name": "AvatarURL" + }, + "custom_fields": { + "additionalProperties": { + "$ref": "#/components/schemas/CustomFieldValue" + }, + "description": "Custom field values associated with the issue.", + "type": "object", + "x-go-name": "CustomFields" + }, + "email": { + "description": "The primary email of the contact, if it exists.", + "type": "string", + "x-go-name": "Email" + }, + "emails": { + "description": "The list of all emails of the contact.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Emails" + }, + "id": { + "description": "The ID of the contact.", + "type": "string", + "x-go-name": "ID" + }, + "name": { + "description": "The name of the contact.", + "type": "string", + "x-go-name": "Name" + }, + "portal_role": { + "description": "Portal role assigned to the contact.\n\n* no_access PortalRoleNoAccess\n\n* member PortalRoleMember\n\n* admin PortalRoleAdmin", + "enum": [ + "no_access", + "member", + "admin" + ], + "type": "string", + "x-go-enum-desc": "no_access PortalRoleNoAccess\nmember PortalRoleMember\nadmin PortalRoleAdmin", + "x-go-name": "PortalRole" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "CreateAccountHighlightRequestBody": { + "properties": { + "content_html": { + "description": "The HTML content for this highlight.", + "type": "string", + "x-go-name": "ContentHTML" + }, + "expires_at": { + "description": "Optional RFC3339 timestamp of when this highlight will expire.", + "type": "string", + "x-go-name": "ExpiresAt" + } + }, + "required": [ + "content_html" + ], + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + }, + "CreateAccountHighlightResponseBody": { + "properties": { + "data": { + "$ref": "#/components/schemas/AccountHighlight" + }, + "request_id": { + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + }, + "CreateAccountRequest": { + "properties": { + "channels": { + "description": "An array of channels to be linked to this account.", + "items": { + "$ref": "#/components/schemas/Channel" + }, + "type": "array", + "x-go-name": "Channels" + }, + "custom_fields": { + "description": "An array of custom fields to be used on this account.", + "items": { + "$ref": "#/components/schemas/CustomFieldValue" + }, + "type": "array", + "x-go-name": "CustomFields" + }, + "domain": { + "description": "Deprecated. Please use Domains and PrimaryDomain instead.", + "type": "string", + "x-go-name": "Domain" + }, + "domains": { + "description": "The domains of the account, without any leading scheme, for example stripe.com. Must specify one domain as primary.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Domains" + }, + "external_ids": { + "description": "An array of external IDs to be used on this account. If provided, the accounts external IDs will be updated to the given external IDs.", + "items": { + "$ref": "#/components/schemas/ExternalID" + }, + "type": "array", + "x-go-name": "ExternalIDs" + }, + "logo_url": { + "description": "The logo URL of the account. Must be a square .png, .jpg or .jpeg.", + "type": "string", + "x-go-name": "LogoURL" + }, + "name": { + "description": "The name of the account.", + "type": "string", + "x-go-name": "Name" + }, + "owner_id": { + "description": "The ID of the owner of the account.", + "type": "string", + "x-go-name": "OwnerID" + }, + "primary_domain": { + "description": "Must be in the list of domains. If there are any domains, there must be exactly one primary domain.", + "type": "string", + "x-go-name": "PrimaryDomain" + }, + "tags": { + "description": "An array of strings to use as tags on this account. If provided, the accounts tags will be updated to the given tags.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Tags" + } + }, + "required": [ + "name" + ], + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + }, + "CreateAccountResponseBody": { + "properties": { + "data": { + "$ref": "#/components/schemas/Account" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + }, + "CreateActivityRequest": { + "properties": { + "body_html": { + "description": "Optional HTML content to display in the activity.", + "type": "string", + "x-go-name": "BodyHTML" + }, + "contact_id": { + "description": "Optional contact ID of the actor of the activity.", + "type": "string", + "x-go-name": "ContactID" + }, + "happened_at": { + "description": "Timestamp (RFC3339) of when the activity happened. Defaults to the current time if empty.", + "type": "string", + "x-go-name": "HappenedAt" + }, + "link": { + "description": "Optional link to add to the activity.", + "type": "string", + "x-go-name": "Link" + }, + "link_text": { + "description": "Optional link text to display on the activity. Defaults to \"Open link\" if not provided. Applies only if a link is provided.", + "type": "string", + "x-go-name": "LinkText" + }, + "slug": { + "description": "The slug of the activity to create.", + "type": "string", + "x-go-name": "Slug" + }, + "user_id": { + "description": "Optional user ID of the actor of the activity.", + "type": "string", + "x-go-name": "UserID" + } + }, + "required": [ + "slug" + ], + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + }, + "CreateActivityResponseBody": { + "properties": { + "data": { + "$ref": "#/components/schemas/CreateActivityResponseData" + }, + "request_id": { + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + }, + "CreateActivityResponseData": { + "properties": { + "success": { + "type": "boolean", + "x-go-name": "Success" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + }, + "CreateArticleRequestBody": { + "properties": { + "author_user_id": { + "description": "The ID of the user attributed as the author of the article.", + "type": "string", + "x-go-name": "AuthorUserId" + }, + "body_html": { + "description": "The HTML body of the article.", + "type": "string", + "x-go-name": "BodyHTML" + }, + "collection_id": { + "description": "The id of the collection associated to the article", + "type": "string", + "x-go-name": "CollectionID" + }, + "is_published": { + "description": "Whether the article should be published. Defaults to false.", + "type": "boolean", + "x-go-name": "IsPublished" + }, + "is_unlisted": { + "description": "Whether the article can only be accessible only via direct link. Defaults to false.", + "type": "boolean", + "x-go-name": "IsUnlisted" + }, + "slug": { + "description": "The slug of the article. Defaults to a slug based on the title.", + "type": "string", + "x-go-name": "Slug" + }, + "title": { + "description": "The title of the article.", + "type": "string", + "x-go-name": "Title" + }, + "translations": { + "description": "Translations of the article content in different languages", + "items": { + "$ref": "#/components/schemas/ArticleTranslationInput" + }, + "type": "array", + "x-go-name": "Translations" + }, + "visibility_config": { + "$ref": "#/components/schemas/VisibilityConfig" + } + }, + "required": [ + "author_user_id", + "body_html", + "title" + ], + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + }, + "CreateArticleResponseBody": { + "properties": { + "data": { + "$ref": "#/components/schemas/Article" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + }, + "CreateAttachmentResponseBody": { + "properties": { + "data": { + "$ref": "#/components/schemas/Attachment" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + }, + "CreateCallRecordingMessageRequest": { + "properties": { + "message_at_ms": { + "description": "The timestamp of the message in milliseconds from the start of the recording.", + "format": "int64", + "type": "integer", + "x-go-name": "MessageAtMs" + }, + "message_content": { + "description": "The content of the message.", + "type": "string", + "x-go-name": "MessageContent" + }, + "speaker_email": { + "description": "The email of the speaker.", + "type": "string", + "x-go-name": "SpeakerEmail" + }, + "speaker_name": { + "description": "The name of the speaker.", + "type": "string", + "x-go-name": "SpeakerName" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + }, + "CreateCallRecordingRequest": { + "properties": { + "app_type": { + "description": "The app type of the call recording.", + "type": "string", + "x-go-name": "AppType" + }, + "call_recording_messages": { + "description": "The structured messages for custom call integration.", + "items": { + "$ref": "#/components/schemas/CreateCallRecordingMessageRequest" + }, + "type": "array", + "x-go-name": "CallRecordingMessages" + }, + "end_time": { + "description": "The end time of the call recording in the format of 2025-01-01T00:00:00Z.", + "type": "string", + "x-go-name": "EndTime" + }, + "participant_emails": { + "description": "The emails of all participants in the call recording.", + "type": "string", + "x-go-name": "ParticipantEmails" + }, + "primary_user_email": { + "description": "The email of the primary user in the call recording.", + "type": "string", + "x-go-name": "PrimaryUserEmail" + }, + "recording_id": { + "description": "The external ID of the call recording.", + "type": "string", + "x-go-name": "RecordingID" + }, + "recording_url": { + "description": "The URL of the call recording.", + "type": "string", + "x-go-name": "RecordingURL" + }, + "start_time": { + "description": "The start time of the call recording in the format of 2025-01-01T00:00:00Z.", + "type": "string", + "x-go-name": "StartTime" + }, + "title": { + "description": "The title of the call recording.", + "type": "string", + "x-go-name": "Title" + } + }, + "required": [ + "app_type" + ], + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + }, + "CreateCallRecordingResponseBody": { + "properties": { + "data": { + "$ref": "#/components/schemas/CallRecording" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + }, + "CreateCollectionRequestBody": { + "properties": { + "description": { + "description": "Description of the collection.", + "type": "string", + "x-go-name": "Description" + }, + "parent_collection_id": { + "description": "The id of the collection associated to the article", + "type": "string", + "x-go-name": "ParentCollectionID" + }, + "slug": { + "description": "The slug of the collection. Defaults to a slug based on the title.", + "type": "string", + "x-go-name": "Slug" + }, + "title": { + "description": "The title of the collection.", + "type": "string", + "x-go-name": "Title" + } + }, + "required": [ + "title" + ], + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + }, + "CreateCollectionResponseBody": { + "properties": { + "data": { + "$ref": "#/components/schemas/Collection" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + }, + "CreateContactRequestBody": { + "properties": { + "account_external_id": { + "description": "The external ID of the account that this contact belongs to. Cannot be used together with account_id.", + "type": "string", + "x-go-name": "AccountExternalID" + }, + "account_id": { + "description": "The account that this contact belongs to.", + "type": "string", + "x-go-name": "AccountID" + }, + "avatar_url": { + "description": "The avatar URL of the contact. Must be a square .png, .jpg or .jpeg.", + "type": "string", + "x-go-name": "AvatarUrl" + }, + "custom_fields": { + "description": "An array of custom fields to be applied to this contact.", + "items": { + "$ref": "#/components/schemas/CustomFieldValue" + }, + "type": "array", + "x-go-name": "CustomFields" + }, + "email": { + "description": "The email of the contact.", + "type": "string", + "x-go-name": "Email" + }, + "name": { + "description": "The name of the contact.", + "type": "string", + "x-go-name": "Name" + }, + "portal_role": { + "description": "The portal role to assign to the contact. If not provided uses the default portal role from the portal settings.\n\n* no_access PortalRoleNoAccess\n\n* member PortalRoleMember\n\n* admin PortalRoleAdmin", + "enum": [ + "no_access", + "member", + "admin" + ], + "type": "string", + "x-go-enum-desc": "no_access PortalRoleNoAccess\nmember PortalRoleMember\nadmin PortalRoleAdmin", + "x-go-name": "PortalRole" + } + }, + "required": [ + "name" + ], + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + }, + "CreateContactResponseBody": { + "properties": { + "data": { + "$ref": "#/components/schemas/Contact" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + }, + "CreateCustomFieldRequestBody": { + "properties": { + "default_value": { + "description": "The default value for single-valued custom fields.", + "type": "string", + "x-go-name": "DefaultValue" + }, + "default_values": { + "description": "The default values for multi-valued custom fields.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "DefaultValues" + }, + "description": { + "description": "The description of the custom field.", + "type": "string", + "x-go-name": "Description" + }, + "label": { + "description": "The label of the custom field.", + "type": "string", + "x-go-name": "Label" + }, + "object_type": { + "description": "The object type of the custom field. Can be \"account\", \"issue\", or \"contact\"", + "type": "string", + "x-go-name": "ObjectType" + }, + "select_options": { + "description": "The list options of the select custom field. This is only present for select and multiselect custom fields.", + "items": { + "$ref": "#/components/schemas/CustomFieldDefinitionSelectOption" + }, + "type": "array", + "x-go-name": "SelectOptions" + }, + "slug": { + "description": "The slug of the custom field.", + "type": "string", + "x-go-name": "Slug" + }, + "type": { + "description": "The type of the custom field. Can be one of `text`, `number`, `decimal`, `boolean`, `date`, `datetime`, `user`, `url`, `select`, or `multiselect`.", + "type": "string", + "x-go-name": "Type" + } + }, + "required": [ + "label", + "object_type", + "type" + ], + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + }, + "CreateCustomFieldResponseBody": { + "properties": { + "data": { + "$ref": "#/components/schemas/CustomFieldDefinition" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + }, + "CreateIssueAIResponseRequestBody": { + "properties": { + "ai_agent_id": { + "description": "The ID of the AI agent to use to create the AI response.", + "type": "string", + "x-go-name": "AIAgentID" + }, + "post_as_internal_note": { + "description": "Whether to post the AI response as an internal note on the issue.", + "type": "boolean", + "x-go-name": "PostAsInternalNote" + } + }, + "required": [ + "ai_agent_id" + ], + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + }, + "CreateIssueAIResponseResponseBody": { + "properties": { + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + }, + "response_html": { + "description": "The HTML content of the AI response.", + "type": "string", + "x-go-name": "ResponseHTML" + }, + "response_valid": { + "description": "Whether the AI was able to answer the question.", + "type": "boolean", + "x-go-name": "ResponseValid" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + }, + "CreateIssueNoteRequestBody": { + "properties": { + "attachment_urls": { + "description": "An array of attachment URLs to attach to this issue.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "AttachmentURLs" + }, + "body_html": { + "description": "The body of the message in HTML.", + "type": "string", + "x-go-name": "BodyHTML" + }, + "message_id": { + "description": "The ID of the message to reply to. This message must be an internal note. You can find this from the GET /issues/{id}/messages endpoint. Either this or thread_id must be provided.", + "type": "string", + "x-go-name": "MessageID" + }, + "thread_id": { + "description": "The ID of the thread to post the note to. You can find this from the GET /issues/{id}/threads endpoint. Either this or message_id must be provided.", + "type": "string", + "x-go-name": "ThreadID" + }, + "user_id": { + "description": "Optional user ID to post the message as. If not provided, the API token user will be used.", + "type": "string", + "x-go-name": "UserID" + } + }, + "required": [ + "body_html" + ], + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + }, + "CreateIssueNoteResponseBody": { + "properties": { + "data": { + "$ref": "#/components/schemas/CreateIssueNoteResponseData" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + }, + "CreateIssueNoteResponseData": { + "properties": { + "id": { + "description": "The ID of the message.", + "type": "string", + "x-go-name": "ID" + }, + "issue_id": { + "description": "The ID of the issue.", + "type": "string", + "x-go-name": "IssueID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + }, + "CreateIssueReplyEmailInfo": { + "properties": { + "bcc_emails": { + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "BccEmails" + }, + "cc_emails": { + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "CcEmails" + }, + "to_emails": { + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "ToEmails" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + }, + "CreateIssueReplyRequestBody": { + "properties": { + "attachment_urls": { + "description": "An array of attachment URLs to attach to this issue.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "AttachmentURLs" + }, + "body_html": { + "description": "The body of the message in HTML.", + "type": "string", + "x-go-name": "BodyHTML" + }, + "contact_id": { + "description": "Optional contact ID to post the message as. Only one of user_id or contact_id can be provided.", + "type": "string", + "x-go-name": "ContactID" + }, + "email_info": { + "$ref": "#/components/schemas/CreateIssueReplyEmailInfo" + }, + "message_id": { + "description": "The ID of the message to reply to.", + "type": "string", + "x-go-name": "MessageID" + }, + "user_id": { + "description": "Optional user ID to post the message as. Only one of user_id or contact_id can be provided.", + "type": "string", + "x-go-name": "UserID" + } + }, + "required": [ + "body_html", + "message_id" + ], + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + }, + "CreateIssueReplyResponseBody": { + "properties": { + "data": { + "$ref": "#/components/schemas/CreateIssueReplyResponseData" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + }, + "CreateIssueReplyResponseData": { + "properties": { + "id": { + "description": "The ID of the message.", + "type": "string", + "x-go-name": "ID" + }, + "issue_id": { + "description": "The ID of the issue.", + "type": "string", + "x-go-name": "IssueID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + }, + "CreateIssueRequest": { + "properties": { + "account_id": { + "description": "The account that this issue belongs to.", + "type": "string", + "x-go-name": "AccountID" + }, + "assignee_id": { + "description": "The user the issue should be assigned to.", + "type": "string", + "x-go-name": "AssigneeID" + }, + "attachment_urls": { + "description": "An array of attachment URLs to attach to this issue.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "AttachmentURLs" + }, + "body_html": { + "description": "The HTML content of the body of the issue.", + "type": "string", + "x-go-name": "BodyHTML" + }, + "contact_id": { + "description": "Optional contact ID to post the message as. Only one of user_id or contact_id can be provided.", + "type": "string", + "x-go-name": "ContactID" + }, + "created_at": { + "description": "Timestamp of when the issue was created. If not specified, the current time will be used. (RFC3339)", + "type": "string", + "x-go-name": "CreatedAt" + }, + "custom_fields": { + "description": "An array of custom fields to be used on this issue.", + "items": { + "$ref": "#/components/schemas/CustomFieldValue" + }, + "type": "array", + "x-go-name": "CustomFields" + }, + "destination_metadata": { + "$ref": "#/components/schemas/DestinationMetadata" + }, + "priority": { + "description": "The priority of the issue. Can be one of: urgent, high, medium, or low.", + "type": "string", + "x-go-name": "Priority" + }, + "requester_avatar_url": { + "description": "The URL of an avatar of the requester.", + "type": "string", + "x-go-name": "RequesterAvatarUrl" + }, + "requester_email": { + "description": "The email of the user that this issue is on behalf of. Include one of requester_id or requester_email to create an issue with a requester.", + "type": "string", + "x-go-name": "RequesterEmail" + }, + "requester_id": { + "description": "The requester that this issue is on behalf of. Include one of requester_id or requester_email to create an issue with a requester.", + "type": "string", + "x-go-name": "RequesterID" + }, + "requester_name": { + "description": "The full name of the user that this issue is on behalf of.", + "type": "string", + "x-go-name": "RequesterName" + }, + "tags": { + "description": "An array of strings to use as tags on this issue. If provided, the issue tags will be updated to the given tags.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Tags" + }, + "team_id": { + "description": "The ID of the team this issue should be assigned to.", + "type": "string", + "x-go-name": "TeamID" + }, + "title": { + "description": "The title of the issue.", + "type": "string", + "x-go-name": "Title" + }, + "user_id": { + "description": "Optional user ID to post the message as. Only one of user_id or contact_id can be provided.", + "type": "string", + "x-go-name": "UserID" + } + }, + "required": [ + "body_html", + "title" + ], + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + }, + "CreateIssueResponseBody": { + "properties": { + "data": { + "$ref": "#/components/schemas/Issue" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + }, + "CreateIssueThreadRequestBody": { + "properties": { + "name": { + "description": "The name of the thread.", + "type": "string", + "x-go-name": "Name" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + }, + "CreateIssueThreadResponseBody": { + "properties": { + "data": { + "$ref": "#/components/schemas/IssueThread" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + }, + "CreateMilestoneResponseBody": { + "properties": { + "data": { + "$ref": "#/components/schemas/Milestone" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + }, + "CreateProjectResponseBody": { + "properties": { + "data": { + "$ref": "#/components/schemas/Project" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + }, + "CreateRouteRedirectRequestBody": { + "properties": { + "from_path": { + "description": "The path to redirect from.", + "type": "string", + "x-go-name": "FromPath" + }, + "language": { + "description": "Language of the object to redirect to. If not specified, the default language of the knowledge base will be used.", + "type": "string", + "x-go-name": "Language" + }, + "object_id": { + "description": "The ID of the object to redirect to.", + "type": "string", + "x-go-name": "ObjectID" + }, + "object_type": { + "description": "The type of the object to redirect to. This must be \"article\".", + "type": "string", + "x-go-name": "ObjectType" + } + }, + "required": [ + "from_path", + "object_id", + "object_type" + ], + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + }, + "CreateRouteRedirectResponseBody": { + "properties": { + "data": { + "$ref": "#/components/schemas/RouteRedirect" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + }, + "CreateTagRequestBody": { + "properties": { + "hex_color": { + "description": "The hex code of the tag's color.", + "type": "string", + "x-go-name": "HexColor" + }, + "object_type": { + "description": "The object type of the associated object. Can be \"account\", \"issue\", or \"contact\".", + "type": "string", + "x-go-name": "ObjectType" + }, + "value": { + "description": "The tag value.", + "type": "string", + "x-go-name": "Value" + } + }, + "required": [ + "object_type", + "value" + ], + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + }, + "CreateTagResponseBody": { + "properties": { + "data": { + "$ref": "#/components/schemas/Tag" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + }, + "CreateTaskResponseBody": { + "properties": { + "data": { + "$ref": "#/components/schemas/Task" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + }, + "CreateTeamRequestBody": { + "properties": { + "name": { + "description": "The name of the team.", + "type": "string", + "x-go-name": "Name" + }, + "user_ids": { + "description": "The list of user IDs to add to the team.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "UserIDs" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + }, + "CreateTeamResponseBody": { + "properties": { + "data": { + "$ref": "#/components/schemas/Team" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + }, + "CreateTrainingDataRequestBody": { + "properties": { + "training_data_name": { + "description": "The name of the training data container.", + "type": "string", + "x-go-name": "TrainingDataName" + }, + "visibility": { + "description": "The visibility of the training data. Defaults to \"everyone\".\n\nValid values: \"everyone\", \"user_only\", \"ai_agent_only\"", + "type": "string", + "x-go-name": "Visibility" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + }, + "CreateTrainingDataResponseBody": { + "properties": { + "data": { + "$ref": "#/components/schemas/TrainingData" + }, + "request_id": { + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + }, + "CustomFieldDefinition": { + "properties": { + "created_at": { + "description": "When the custom field was created.", + "type": "string", + "x-go-name": "CreatedAt" + }, + "default_value": { + "description": "The default value for single-valued custom fields.", + "type": "string", + "x-go-name": "DefaultValue" + }, + "default_values": { + "description": "The default values for multi-valued custom fields.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "DefaultValues" + }, + "description": { + "description": "The description of the custom field.", + "type": "string", + "x-go-name": "Description" + }, + "id": { + "description": "The ID of the custom field.", + "type": "string", + "x-go-name": "ID" + }, + "is_read_only": { + "description": "Whether the custom field is read only. Fields synced from apps and integrations are read-only.", + "type": "boolean", + "x-go-name": "IsReadOnly" + }, + "label": { + "description": "The label of the custom field.", + "type": "string", + "x-go-name": "Label" + }, + "number_metadata": { + "$ref": "#/components/schemas/NumberMetadata" + }, + "object_type": { + "description": "The type of object this custom field is for. Can be \"account\", \"issue\", or \"contact\".", + "type": "string", + "x-go-name": "ObjectType" + }, + "select_metadata": { + "$ref": "#/components/schemas/SelectMetadata" + }, + "slug": { + "description": "The slug of the custom field.", + "type": "string", + "x-go-name": "Slug" + }, + "source": { + "description": "The source of the custom field.", + "type": "string", + "x-go-name": "Source" + }, + "type": { + "description": "The type of the custom field.", + "type": "string", + "x-go-name": "Type" + }, + "updated_at": { + "description": "When the custom field was last updated.", + "type": "string", + "x-go-name": "UpdatedAt" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "CustomFieldDefinitionSelectOption": { + "properties": { + "label": { + "description": "The label of the option.", + "type": "string", + "x-go-name": "Label" + }, + "slug": { + "description": "The slug of the option.", + "type": "string", + "x-go-name": "Slug" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "CustomFieldValue": { + "properties": { + "slug": { + "description": "The slug of the custom field.", + "type": "string", + "x-go-name": "Slug" + }, + "value": { + "description": "The value of the custom field. Only to be used for single-valued custom fields. If unset, the custom field will be unset. If the custom field is a select field, the value must be the select option slug, which you can find from the GET /custom-fields endpoint.", + "type": "string", + "x-go-name": "Value" + }, + "values": { + "description": "The values of the custom field. Only to be used for multi-valued custom fields (ex. multiselect). If unset, the custom field will be unset. If the custom field is a multiselect field, the values must be the select option slugs which you can find from the GET /custom-fields endpoint.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Values" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "DeleteAccountHighlightResponseBody": { + "properties": { + "data": { + "$ref": "#/components/schemas/DeleteAccountHighlightResponseData" + }, + "request_id": { + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + }, + "DeleteAccountHighlightResponseData": { + "properties": { + "success": { + "type": "boolean", + "x-go-name": "Success" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + }, + "DeleteAccountResponseBody": { + "properties": { + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + }, + "DeleteArticleResponseBody": { + "properties": { + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + }, + "DeleteContactResponseBody": { + "properties": { + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + }, + "DeleteIssueResponseBody": { + "properties": { + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + }, + "DeleteMilestoneResponseBody": { + "properties": { + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + }, + "DeleteProjectResponseBody": { + "properties": { + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + }, + "DeleteTagResponseBody": { + "properties": { + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + }, + "DeleteTaskResponseBody": { + "properties": { + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + }, + "DeleteTrainingDataDocumentsResponseBody": { + "properties": { + "deleted_count": { + "format": "int64", + "type": "integer", + "x-go-name": "DeletedCount" + }, + "request_id": { + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + }, + "DestinationMetadata": { + "description": "You can configure the issue to contact the requester via email, Slack, in-app chat, or not at all.\n\nIf a destination other than `internal` is specified, a message with the issue's BodyHTML will be delivered to the requester. If you don't wish to immediately contact the requester, you can specify the `internal` destination.", + "properties": { + "chat_widget_app_id": { + "description": "The ID of the chat widget app to use for in-app chat.", + "type": "string", + "x-go-name": "ChatWidgetAppID" + }, + "destination": { + "description": "The destination type of the issue. Can be \"email\", \"slack\", \"in_app_chat\", or \"internal\". Defaults to \"internal\".\n\n* slack APIIssueDestinationSlack Deliver to the issue's account's Slack channel.\n\n* email APIIssueDestinationEmail Deliver messages to the issue requester via email.\n\n* in_app_chat APIIssueDestinationChatWidget Deliver messages to the issue requester via in-app chat.\n\n* internal APIIssueDestinationInternal Keep the issue internal and don't contact the requester at all.", + "enum": [ + "slack", + "email", + "in_app_chat", + "internal" + ], + "type": "string", + "x-go-enum-desc": "slack APIIssueDestinationSlack Deliver to the issue's account's Slack channel.\nemail APIIssueDestinationEmail Deliver messages to the issue requester via email.\nin_app_chat APIIssueDestinationChatWidget Deliver messages to the issue requester via in-app chat.\ninternal APIIssueDestinationInternal Keep the issue internal and don't contact the requester at all.", + "x-go-name": "Destination" + }, + "email": { + "description": "The email that emails to the requester will be sent from. You must configure an email app in Pylon with this address.", + "type": "string", + "x-go-name": "Email" + }, + "email_bccs": { + "description": "Emails that will be BCCed on emails to the requester.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "EmailBCCs" + }, + "email_ccs": { + "description": "Emails that will be CCed on emails to the requester.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "EmailCCs" + } + }, + "title": "DestinationMetadata specifies if/how communication will be delivered to the customer.", + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "EmailMessageInfo": { + "properties": { + "bcc_emails": { + "description": "The email addresses of the BCC recipients of the message.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "BccEmails" + }, + "cc_emails": { + "description": "The email addresses of the CC recipients of the message.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "CcEmails" + }, + "from_email": { + "description": "The email address of the sender of the message.", + "type": "string", + "x-go-name": "FromEmail" + }, + "to_emails": { + "description": "The email addresses of the recipients of the message.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "ToEmails" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "ErrorApiResponseBody": { + "properties": { + "errors": { + "description": "The list of errors.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Errors" + }, + "exists_id": { + "description": "The ID of the object that already exists if this is a duplicate object error.", + "type": "string", + "x-go-name": "ExistsID" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "ExternalID": { + "properties": { + "external_id": { + "description": "The external ID. Must be unique per object type (ex. account).", + "type": "string", + "x-go-name": "ExternalID" + }, + "label": { + "description": "The label of the external ID. Must be unique per object.", + "type": "string", + "x-go-name": "Label" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "ExternalIssue": { + "properties": { + "external_id": { + "description": "The external ID of the external issue.\n\nJira: ID of the issue (autoincrementing number from 10000).\n\nGitHub: Owner/Repo/IssueID.\n\nLinear: ID of the issue (UUID).\n\nAsana: ID of the task (Long number).", + "type": "string", + "x-go-name": "ExternalID" + }, + "link": { + "description": "Link to the product issue.", + "type": "string", + "x-go-name": "Link" + }, + "source": { + "description": "The source of the external issue.", + "type": "string", + "x-go-name": "Source" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "Filter": { + "properties": { + "field": { + "description": "The field for this filter. For allowed fields, see the documentation for\n\nthe specific endpoint you are using.\n\nFor non-compound filters (any operators other than \"and\" or \"or\"),\n\nField must be set, along with either Value or Values, depending on the operator.", + "type": "string", + "x-go-name": "Field" + }, + "operator": { + "description": "The operator for this filter.\n\n* equals FilterOperatorEquals Matches objects that are exactly equal to the value in the field.\n\n* not_equals FilterOperatorNotEquals Matches objects that are not exactly equal to the value in the field.\n\n* contains FilterOperatorContains For a multi-valued field, such as tags, this operator will match objects that contain any of the values in the field.\n\n* does_not_contain FilterOperatorDoesNotContain For a multi-valued field, such as tags, this operator will match objects that do not contain any of the values in the field.\n\n* in FilterOperatorIn Matches objects if the field is one of several possible values, as specified in the values array.\n\n* not_in FilterOperatorNotIn Matches objects if the field is none of several possible values, as specified in the values array.\n\n* and FilterOperatorAnd Matches objects only if all subfilters match.\n\n* or FilterOperatorOr Matches objects if any subfilter matches.\n\n* time_is_after FilterOperatorTimeIsAfter Matches objects if the field is after the given time.\n\n* time_is_before FilterOperatorTimeIsBefore Matches objects if the field is before the given time.\n\n* time_range FilterOperatorTimeRange Matches objects if the field is between the given times.\n\n* string_contains FilterOperatorStringContains Matches objects if the field contains the given string.\n\n* string_does_not_contain FilterOperatorStringDoesNotContain Matches objects if the field does not contain the given string.\n\n* is_set FilterOperatorIsSet FilterOperatorIsSet matches objects if the field is set.\n\n* is_unset FilterOperatorIsUnset FilterOperatorIsUnset matches objects if the field is unset.", + "enum": [ + "equals", + "not_equals", + "contains", + "does_not_contain", + "in", + "not_in", + "and", + "or", + "time_is_after", + "time_is_before", + "time_range", + "string_contains", + "string_does_not_contain", + "is_set", + "is_unset" + ], + "type": "string", + "x-go-enum-desc": "equals FilterOperatorEquals Matches objects that are exactly equal to the value in the field.\nnot_equals FilterOperatorNotEquals Matches objects that are not exactly equal to the value in the field.\ncontains FilterOperatorContains For a multi-valued field, such as tags, this operator will match objects that contain any of the values in the field.\ndoes_not_contain FilterOperatorDoesNotContain For a multi-valued field, such as tags, this operator will match objects that do not contain any of the values in the field.\nin FilterOperatorIn Matches objects if the field is one of several possible values, as specified in the values array.\nnot_in FilterOperatorNotIn Matches objects if the field is none of several possible values, as specified in the values array.\nand FilterOperatorAnd Matches objects only if all subfilters match.\nor FilterOperatorOr Matches objects if any subfilter matches.\ntime_is_after FilterOperatorTimeIsAfter Matches objects if the field is after the given time.\ntime_is_before FilterOperatorTimeIsBefore Matches objects if the field is before the given time.\ntime_range FilterOperatorTimeRange Matches objects if the field is between the given times.\nstring_contains FilterOperatorStringContains Matches objects if the field contains the given string.\nstring_does_not_contain FilterOperatorStringDoesNotContain Matches objects if the field does not contain the given string.\nis_set FilterOperatorIsSet FilterOperatorIsSet matches objects if the field is set.\nis_unset FilterOperatorIsUnset FilterOperatorIsUnset matches objects if the field is unset.", + "x-go-name": "Operator" + }, + "subfilters": { + "description": "Sub-filters for this filter. Valid only when operator is \"and\" or \"or\".\n\nThe maximum allowed depth for a tree of filters is 3.", + "items": { + "$ref": "#/components/schemas/Filter" + }, + "type": "array", + "x-go-name": "Subfilters" + }, + "value": { + "description": "The value for this filter. Only used for single-valued operators\n\n(\"equals\", \"not_equals\", \"contains\", \"does_not_contain\")", + "type": "string", + "x-go-name": "Value" + }, + "values": { + "description": "The values for this filter. Only used for multi-valued operators (\"in\", \"not_in\").", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Values" + } + }, + "required": [ + "field", + "operator" + ], + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "Follower": { + "properties": { + "id": { + "description": "The ID of the follower. Either a user or contact ID.", + "type": "string", + "x-go-name": "ID" + }, + "type": { + "description": "The type of follower. Either \"user\" or \"contact\".\n\n* user FollowerTypeUser\n\n* contact FollowerTypeContact", + "enum": [ + "user", + "contact" + ], + "type": "string", + "x-go-enum-desc": "user FollowerTypeUser\ncontact FollowerTypeContact", + "x-go-name": "Type" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "GetAccountResponseBody": { + "properties": { + "data": { + "$ref": "#/components/schemas/Account" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + }, + "GetAccountsResponseBody": { + "properties": { + "data": { + "description": "The data payload of the response.", + "items": { + "$ref": "#/components/schemas/Account" + }, + "type": "array", + "x-go-name": "Data" + }, + "pagination": { + "$ref": "#/components/schemas/Pagination" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + }, + "GetActivityTypesResponseBody": { + "properties": { + "data": { + "description": "The data payload of the response.", + "items": { + "$ref": "#/components/schemas/ActivityType" + }, + "type": "array", + "x-go-name": "Data" + }, + "pagination": { + "$ref": "#/components/schemas/Pagination" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + }, + "GetArticleResponseBody": { + "properties": { + "data": { + "$ref": "#/components/schemas/Article" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + }, + "GetArticlesResponseBody": { + "properties": { + "data": { + "description": "The data payload of the response.", + "items": { + "$ref": "#/components/schemas/Article" + }, + "type": "array", + "x-go-name": "Data" + }, + "pagination": { + "$ref": "#/components/schemas/Pagination" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + }, + "GetCollectionResponseBody": { + "properties": { + "data": { + "$ref": "#/components/schemas/Collection" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + }, + "GetCollectionsResponseBody": { + "properties": { + "data": { + "description": "The data payload of the response.", + "items": { + "$ref": "#/components/schemas/Collection" + }, + "type": "array", + "x-go-name": "Data" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + }, + "GetContactResponseBody": { + "properties": { + "data": { + "$ref": "#/components/schemas/Contact" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + }, + "GetContactsResponseBody": { + "properties": { + "data": { + "description": "The data payload of the response.", + "items": { + "$ref": "#/components/schemas/Contact" + }, + "type": "array", + "x-go-name": "Data" + }, + "pagination": { + "$ref": "#/components/schemas/Pagination" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + }, + "GetCustomFieldResponseBody": { + "properties": { + "data": { + "$ref": "#/components/schemas/CustomFieldDefinition" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + }, + "GetCustomFieldsResponseBody": { + "properties": { + "data": { + "description": "The data payload of the response.", + "items": { + "$ref": "#/components/schemas/CustomFieldDefinition" + }, + "type": "array", + "x-go-name": "Data" + }, + "pagination": { + "$ref": "#/components/schemas/Pagination" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + }, + "GetIssueFollowersResponseBody": { + "properties": { + "data": { + "description": "The data payload of the response.", + "items": { + "$ref": "#/components/schemas/Follower" + }, + "type": "array", + "x-go-name": "Data" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + }, + "GetIssueMessagesResponseBody": { + "properties": { + "data": { + "description": "The data payload of the response.", + "items": { + "$ref": "#/components/schemas/Message" + }, + "type": "array", + "x-go-name": "Data" + }, + "pagination": { + "$ref": "#/components/schemas/Pagination" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + }, + "GetIssueResponseBody": { + "properties": { + "data": { + "$ref": "#/components/schemas/Issue" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + }, + "GetIssueStatusesResponseBody": { + "properties": { + "data": { + "description": "The data payload of the response.", + "items": { + "$ref": "#/components/schemas/IssueStatus" + }, + "type": "array", + "x-go-name": "Data" + }, + "pagination": { + "$ref": "#/components/schemas/Pagination" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + }, + "GetIssueThreadsResponseBody": { + "properties": { + "data": { + "description": "The data payload of the response.", + "items": { + "$ref": "#/components/schemas/IssueThread" + }, + "type": "array", + "x-go-name": "Data" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + }, + "GetIssuesResponseBody": { + "properties": { + "data": { + "description": "The data payload of the response.", + "items": { + "$ref": "#/components/schemas/Issue" + }, + "type": "array", + "x-go-name": "Data" + }, + "pagination": { + "$ref": "#/components/schemas/Pagination" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + }, + "GetKnowledgeBaseResponseBody": { + "properties": { + "data": { + "$ref": "#/components/schemas/KnowledgeBase" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + }, + "GetKnowledgeBasesResponseBody": { + "properties": { + "data": { + "description": "The data payload of the response.", + "items": { + "$ref": "#/components/schemas/KnowledgeBase" + }, + "type": "array", + "x-go-name": "Data" + }, + "pagination": { + "$ref": "#/components/schemas/Pagination" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + }, + "GetMeResponseBody": { + "properties": { + "data": { + "$ref": "#/components/schemas/Me" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + }, + "GetTagResponseBody": { + "properties": { + "data": { + "$ref": "#/components/schemas/Tag" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + }, + "GetTagsResponseBody": { + "properties": { + "data": { + "description": "The data payload of the response.", + "items": { + "$ref": "#/components/schemas/Tag" + }, + "type": "array", + "x-go-name": "Data" + }, + "pagination": { + "$ref": "#/components/schemas/Pagination" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + }, + "GetTeamResponseBody": { + "properties": { + "data": { + "$ref": "#/components/schemas/Team" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + }, + "GetTeamsResponseBody": { + "properties": { + "data": { + "description": "The data payload of the response.", + "items": { + "$ref": "#/components/schemas/Team" + }, + "type": "array", + "x-go-name": "Data" + }, + "pagination": { + "$ref": "#/components/schemas/Pagination" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + }, + "GetTicketFormResponseBody": { + "properties": { + "data": { + "$ref": "#/components/schemas/TicketForm" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + }, + "GetTicketFormsResponseBody": { + "properties": { + "data": { + "description": "The data payload of the response.", + "items": { + "$ref": "#/components/schemas/TicketForm" + }, + "type": "array", + "x-go-name": "Data" + }, + "pagination": { + "$ref": "#/components/schemas/Pagination" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + }, + "GetTrainingDataResponseBody": { + "properties": { + "data": { + "$ref": "#/components/schemas/TrainingData" + }, + "request_id": { + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + }, + "GetUserResponseBody": { + "properties": { + "data": { + "$ref": "#/components/schemas/User" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + }, + "GetUserRolesResponseBody": { + "properties": { + "data": { + "description": "The data payload of the response.", + "items": { + "$ref": "#/components/schemas/UserRole" + }, + "type": "array", + "x-go-name": "Data" + }, + "pagination": { + "$ref": "#/components/schemas/Pagination" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + }, + "GetUsersResponseBody": { + "properties": { + "data": { + "description": "The data payload of the response.", + "items": { + "$ref": "#/components/schemas/User" + }, + "type": "array", + "x-go-name": "Data" + }, + "pagination": { + "$ref": "#/components/schemas/Pagination" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + }, + "ImportContactRequestBody": { + "properties": { + "account_id": { + "description": "The account that this contact belongs to.", + "type": "string", + "x-go-name": "AccountID" + }, + "avatar_url": { + "description": "The avatar URL of the contact. Must be a square .png, .jpg or .jpeg.", + "type": "string", + "x-go-name": "AvatarUrl" + }, + "custom_fields": { + "description": "An array of custom fields to be applied to this contact.", + "items": { + "$ref": "#/components/schemas/CustomFieldValue" + }, + "type": "array", + "x-go-name": "CustomFields" + }, + "email": { + "description": "The email of the contact.", + "type": "string", + "x-go-name": "Email" + }, + "name": { + "description": "The name of the contact.", + "type": "string", + "x-go-name": "Name" + }, + "portal_role": { + "description": "The portal role to assign to the contact. If not provided uses the default portal role from the portal settings.\n\n* no_access PortalRoleNoAccess\n\n* member PortalRoleMember\n\n* admin PortalRoleAdmin", + "enum": [ + "no_access", + "member", + "admin" + ], + "type": "string", + "x-go-enum-desc": "no_access PortalRoleNoAccess\nmember PortalRoleMember\nadmin PortalRoleAdmin", + "x-go-name": "PortalRole" + } + }, + "required": [ + "email", + "name" + ], + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + }, + "ImportContactResponseBody": { + "properties": { + "data": { + "$ref": "#/components/schemas/Contact" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + }, + "ImportExternalIssue": { + "properties": { + "external_issue_id": { + "description": "The ID of the external issue in the source system.", + "type": "string", + "x-go-name": "ExternalIssueID" + }, + "source": { + "description": "The source system of the external issue (e.g., \"linear\", \"asana\", \"jira\", \"github\").", + "type": "string", + "x-go-name": "Source" + } + }, + "required": [ + "external_issue_id", + "source" + ], + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + }, + "ImportIssueExternalRefs": { + "properties": { + "intercom_conversation_id": { + "description": "The Intercom conversation ID associated with this issue, if any.", + "type": "string", + "x-go-name": "IntercomConversationID" + }, + "zendesk_ticket_id": { + "description": "The Zendesk ticket ID associated with this issue, if any.", + "type": "string", + "x-go-name": "ZendeskTicketID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + }, + "ImportIssueMessage": { + "properties": { + "attachment_urls": { + "description": "An array of attachment URLs to attach to this message.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "AttachmentURLs" + }, + "body_html": { + "description": "The HTML content of the message.", + "type": "string", + "x-go-name": "BodyHTML" + }, + "contact_id": { + "description": "The contact that sent the message. Only one of user_id or contact_id can be specified.", + "type": "string", + "x-go-name": "ContactID" + }, + "created_at": { + "description": "CreatedAt is the time the message was created (RFC3339).", + "type": "string", + "x-go-name": "CreatedAt" + }, + "is_private": { + "description": "Whether the message is private.", + "type": "boolean", + "x-go-name": "IsPrivate" + }, + "user_id": { + "description": "The user that sent the message. Only one of user_id or contact_id can be specified.", + "type": "string", + "x-go-name": "UserID" + } + }, + "required": [ + "body_html", + "is_private" + ], + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + }, + "ImportIssueRequest": { + "properties": { + "account_id": { + "description": "AccountID that the issue should belong to.", + "type": "string", + "x-go-name": "AccountID" + }, + "assignee_id": { + "description": "UserID that the issue should be assigned to.", + "type": "string", + "x-go-name": "AssigneeID" + }, + "attachment_urls": { + "description": "An array of attachment URLs to attach to this issue.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "AttachmentURLs" + }, + "created_at": { + "description": "CreatedAt is the time the issue was created (RFC3339).", + "type": "string", + "x-go-name": "CreatedAt" + }, + "custom_fields": { + "description": "An array of custom fields to be used on this issue.", + "items": { + "$ref": "#/components/schemas/CustomFieldValue" + }, + "type": "array", + "x-go-name": "CustomFields" + }, + "external_issues": { + "description": "External issues to link to this issue.", + "items": { + "$ref": "#/components/schemas/ImportExternalIssue" + }, + "type": "array", + "x-go-name": "ExternalIssues" + }, + "external_refs": { + "$ref": "#/components/schemas/ImportIssueExternalRefs" + }, + "first_response_time": { + "description": "FirstResponseTime is the time the issue was first responded to (RFC3339).", + "type": "string", + "x-go-name": "FirstResponseTime" + }, + "messages": { + "description": "Messages to be imported for this issue. At least one message is required.", + "items": { + "$ref": "#/components/schemas/ImportIssueMessage" + }, + "type": "array", + "x-go-name": "Messages" + }, + "requester_id": { + "description": "ContactID that the issue should be on behalf of.", + "type": "string", + "x-go-name": "RequesterID" + }, + "resolution_time": { + "description": "ResolutionTime is the time the issue was resolved (RFC3339).", + "type": "string", + "x-go-name": "ResolutionTime" + }, + "state": { + "description": "The state of the issue. Can be one of new, waiting_on_you, waiting_on_customer, on_hold, closed, or a custom status.", + "type": "string", + "x-go-name": "State" + }, + "tags": { + "description": "An array of strings to use as tags on this issue.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Tags" + }, + "team_id": { + "description": "TeamID that the issue should be assigned to.", + "type": "string", + "x-go-name": "TeamID" + }, + "title": { + "description": "The title of the issue.", + "type": "string", + "x-go-name": "Title" + }, + "updated_at": { + "description": "UpdatedAt is the time the issue was last updated (RFC3339).", + "type": "string", + "x-go-name": "UpdatedAt" + } + }, + "required": [ + "messages", + "state", + "title" + ], + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + }, + "ImportIssueResponseBody": { + "properties": { + "data": { + "$ref": "#/components/schemas/Issue" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + }, + "ImportMessagesRequest": { + "properties": { + "messages": { + "description": "Messages to be imported for this issue. At least one message is required.", + "items": { + "$ref": "#/components/schemas/ImportIssueMessage" + }, + "type": "array", + "x-go-name": "Messages" + } + }, + "required": [ + "messages" + ], + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + }, + "ImportMessagesResponseBody": { + "properties": { + "data": { + "$ref": "#/components/schemas/Issue" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + }, + "Issue": { + "properties": { + "account": { + "$ref": "#/components/schemas/MiniAccount" + }, + "assignee": { + "$ref": "#/components/schemas/MiniUser" + }, + "attachment_urls": { + "description": "The attachment URLs attached to this issue, if any.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "AttachmentURLs" + }, + "body_html": { + "description": "The body of the issue in HTML format.", + "type": "string", + "x-go-name": "BodyHTML" + }, + "business_hours_first_response_seconds": { + "description": "The business hours time in seconds it took for the first response to the issue, if any.", + "format": "int64", + "type": "integer", + "x-go-name": "BusinessHoursFirstResponseSeconds" + }, + "business_hours_resolution_seconds": { + "description": "The business hours time in seconds it took for the issue to be resolved, if any.", + "format": "int64", + "type": "integer", + "x-go-name": "BusinessHoursResolutionSeconds" + }, + "chat_widget_info": { + "$ref": "#/components/schemas/IssueChatWidgetInfo" + }, + "created_at": { + "description": "The time the issue was created.", + "type": "string", + "x-go-name": "CreatedAt" + }, + "csat_responses": { + "description": "The CSAT responses of the issue, if any.", + "items": { + "$ref": "#/components/schemas/CSATResponse" + }, + "type": "array", + "x-go-name": "CSATResponses" + }, + "custom_fields": { + "additionalProperties": { + "$ref": "#/components/schemas/CustomFieldValue" + }, + "description": "Custom field values associated with the issue.", + "type": "object", + "x-go-name": "CustomFields" + }, + "customer_portal_visible": { + "description": "Whether the issue is visible in the customer portal.", + "type": "boolean", + "x-go-name": "CustomerPortalVisible" + }, + "external_issues": { + "description": "The external issues associated with the issue, if any.", + "items": { + "$ref": "#/components/schemas/ExternalIssue" + }, + "type": "array", + "x-go-name": "ExternalIssues" + }, + "first_response_seconds": { + "description": "The time in seconds it took for the first response to the issue, if any.", + "format": "int64", + "type": "integer", + "x-go-name": "FirstResponseSeconds" + }, + "first_response_time": { + "description": "The time of the first response to the issue, if any.", + "type": "string", + "x-go-name": "FirstResponseTime" + }, + "id": { + "description": "The ID of the issue.", + "type": "string", + "x-go-name": "ID" + }, + "latest_message_time": { + "description": "The time of the latest message in the issue.", + "type": "string", + "x-go-name": "LatestMessageTime" + }, + "link": { + "description": "The link to the issue in Pylon.", + "type": "string", + "x-go-name": "Link" + }, + "number": { + "description": "The number of the issue.", + "format": "int64", + "type": "integer", + "x-go-name": "Number" + }, + "number_of_touches": { + "description": "The number of times the issue has been touched.", + "format": "int64", + "type": "integer", + "x-go-name": "NumberOfTouches" + }, + "requester": { + "$ref": "#/components/schemas/MiniContact" + }, + "resolution_seconds": { + "description": "The time in seconds it took for the issue to be resolved, if any.", + "format": "int64", + "type": "integer", + "x-go-name": "ResolutionSeconds" + }, + "resolution_time": { + "description": "The time of the resolution of the issue, if any.", + "type": "string", + "x-go-name": "ResolutionTime" + }, + "slack": { + "$ref": "#/components/schemas/SlackInfo" + }, + "snoozed_until_time": { + "description": "The time the issue was snoozed until in RFC3339 format, if any.", + "type": "string", + "x-go-name": "SnoozedUntilTime" + }, + "source": { + "description": "The source of the issue.\n\n* slack IssueSourceSlack\n\n* microsoft_teams IssueSourceMicrosoftTeams\n\n* microsoft_teams_chat IssueSourceMicrosoftTeamsChat\n\n* chat_widget IssueSourceChatWidget\n\n* email IssueSourceEmail\n\n* manual IssueSourceManual\n\n* form IssueSourceForm\n\n* discord IssueSourceDiscord", + "enum": [ + "slack", + "microsoft_teams", + "microsoft_teams_chat", + "chat_widget", + "email", + "manual", + "form", + "discord" + ], + "type": "string", + "x-go-enum-desc": "slack IssueSourceSlack\nmicrosoft_teams IssueSourceMicrosoftTeams\nmicrosoft_teams_chat IssueSourceMicrosoftTeamsChat\nchat_widget IssueSourceChatWidget\nemail IssueSourceEmail\nmanual IssueSourceManual\nform IssueSourceForm\ndiscord IssueSourceDiscord", + "x-go-name": "Source" + }, + "state": { + "description": "The state of the issue. This could be one of `[\"new\", \"waiting_on_you\", \"waiting_on_customer\", \"on_hold\", \"closed\"] or a custom status slug.", + "type": "string", + "x-go-name": "State" + }, + "tags": { + "description": "Tags associated with the issue.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Tags" + }, + "team": { + "$ref": "#/components/schemas/MiniTeam" + }, + "title": { + "description": "The title of the issue.", + "type": "string", + "x-go-name": "Title" + }, + "type": { + "description": "The type of the issue.\n\n* Conversation IssueTypeConversation\n\n* Ticket IssueTypeTicket", + "enum": [ + "Conversation", + "Ticket" + ], + "type": "string", + "x-go-enum-desc": "Conversation IssueTypeConversation\nTicket IssueTypeTicket", + "x-go-name": "Type" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "IssueChatWidgetInfo": { + "properties": { + "page_url": { + "description": "The URL of the page that the user was on when they started the chat widget issue.", + "type": "string", + "x-go-name": "PageURL" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "IssueStatus": { + "properties": { + "category": { + "description": "The category of the issue status.", + "type": "string", + "x-go-name": "Category" + }, + "is_archived": { + "description": "Indicates if the issue status is archived.", + "type": "boolean", + "x-go-name": "IsArchived" + }, + "is_default_status": { + "description": "Indicates if the issue status is a default status.", + "type": "boolean", + "x-go-name": "IsDefaultStatus" + }, + "label": { + "description": "The label of the issue status.", + "type": "string", + "x-go-name": "Label" + }, + "slug": { + "description": "The slug of the issue status.", + "type": "string", + "x-go-name": "Slug" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "IssueThread": { + "description": "If a channel ID is set, this thread is being synced with a chat platform", + "properties": { + "channel_id": { + "description": "The ID of the channel that the thread belongs to, if the thread is being synced with a chat platform.", + "type": "string", + "x-go-name": "ChannelID" + }, + "id": { + "description": "The ID of the thread.", + "type": "string", + "x-go-name": "ID" + }, + "issue_id": { + "description": "The issue ID that the thread belongs to.", + "type": "string", + "x-go-name": "IssueID" + }, + "name": { + "description": "The name of the thread.", + "type": "string", + "x-go-name": "Name" + }, + "source": { + "description": "The source of the thread.", + "type": "string", + "x-go-name": "Source" + }, + "thread_id": { + "description": "The ID of the thread that the thread belongs to, if the thread is being synced with a chat platform. A thread ID for Slack would be the thread timestamp.", + "type": "string", + "x-go-name": "ThreadID" + } + }, + "title": "IssueThread is a thread of notes on an issue, meaning that they are for internal discussions and are not visible to the customer. Threads can be created manually through the UI or from triggers.", + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "KnowledgeBase": { + "properties": { + "default_language": { + "description": "The default language of the knowledge base.", + "type": "string", + "x-go-name": "DefaultLanguage" + }, + "id": { + "description": "The ID of the knowledge base.", + "type": "string", + "x-go-name": "ID" + }, + "slug": { + "description": "The slug of the knowledge base.", + "type": "string", + "x-go-name": "Slug" + }, + "supported_languages": { + "description": "The list of supported languages for the knowledge base.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "SupportedLanguages" + }, + "title": { + "description": "The name of the knowledge base.", + "type": "string", + "x-go-name": "Title" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "LinkExternalIssueRequestBody": { + "properties": { + "external_issue_id": { + "description": "The ID of the external issue in the source system.", + "type": "string", + "x-go-name": "ExternalIssueID" + }, + "operation": { + "description": "Operation to perform. Use \"link\" to link issues (default) or \"unlink\" to unlink issues.", + "type": "string", + "x-go-name": "Operation" + }, + "source": { + "description": "The source system of the external issue (e.g., \"linear\", \"asana\", \"jira\", \"github\").", + "type": "string", + "x-go-name": "Source" + } + }, + "required": [ + "external_issue_id", + "source" + ], + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + }, + "LinkExternalIssueResponseBody": { + "properties": { + "data": { + "$ref": "#/components/schemas/Issue" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + }, + "ListTrainingDataResponseBody": { + "properties": { + "data": { + "items": { + "$ref": "#/components/schemas/TrainingData" + }, + "type": "array", + "x-go-name": "Data" + }, + "request_id": { + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + }, + "Me": { + "properties": { + "id": { + "description": "The ID of the organization.", + "type": "string", + "x-go-name": "ID" + }, + "name": { + "description": "The name of the organization.", + "type": "string", + "x-go-name": "Name" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + }, + "Message": { + "properties": { + "author": { + "$ref": "#/components/schemas/MessageAuthor" + }, + "email_info": { + "$ref": "#/components/schemas/EmailMessageInfo" + }, + "file_urls": { + "description": "The URLs of the files in the message, if any.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "FileURLs" + }, + "id": { + "description": "The ID of the message.", + "type": "string", + "x-go-name": "ID" + }, + "is_private": { + "description": "Indicates if the message is private.", + "type": "boolean", + "x-go-name": "IsPrivate" + }, + "message_html": { + "description": "The HTML body of the message.", + "type": "string", + "x-go-name": "MessageHTML" + }, + "source": { + "description": "The source of the message.", + "type": "string", + "x-go-name": "Source" + }, + "thread_id": { + "description": "The ID of the thread the message belongs to. This is only set for internal notes.", + "type": "string", + "x-go-name": "ThreadID" + }, + "timestamp": { + "description": "The time at which the message was created.", + "type": "string", + "x-go-name": "Timestamp" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "MessageAuthor": { + "properties": { + "avatar_url": { + "type": "string", + "x-go-name": "AvatarURL" + }, + "contact": { + "$ref": "#/components/schemas/MiniContact" + }, + "name": { + "type": "string", + "x-go-name": "Name" + }, + "user": { + "$ref": "#/components/schemas/MiniUser" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "Milestone": { + "properties": { + "account": { + "$ref": "#/components/schemas/MiniAccount" + }, + "created_at": { + "type": "string", + "x-go-name": "CreatedAt" + }, + "due_date": { + "type": "string", + "x-go-name": "DueDate" + }, + "id": { + "type": "string", + "x-go-name": "ID" + }, + "name": { + "type": "string", + "x-go-name": "Name" + }, + "project": { + "$ref": "#/components/schemas/MiniProject" + }, + "updated_at": { + "type": "string", + "x-go-name": "UpdatedAt" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "MiniAccount": { + "properties": { + "id": { + "description": "The ID of the account.", + "type": "string", + "x-go-name": "ID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "MiniContact": { + "properties": { + "email": { + "description": "The email of the contact.", + "type": "string", + "x-go-name": "Email" + }, + "id": { + "description": "The ID of the contact.", + "type": "string", + "x-go-name": "ID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "MiniMilestone": { + "properties": { + "id": { + "description": "The ID of the milestone.", + "type": "string", + "x-go-name": "ID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "MiniProject": { + "properties": { + "id": { + "description": "The ID of the project.", + "type": "string", + "x-go-name": "ID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "MiniProjectTemplate": { + "properties": { + "id": { + "description": "The ID of the project template.", + "type": "string", + "x-go-name": "ID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "MiniTeam": { + "properties": { + "id": { + "description": "The ID of the team.", + "type": "string", + "x-go-name": "ID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "MiniUser": { + "properties": { + "email": { + "description": "The email of the user.", + "type": "string", + "x-go-name": "Email" + }, + "id": { + "description": "The ID of the user.", + "type": "string", + "x-go-name": "ID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "MirrorChannel": { + "properties": { + "channel_id": { + "description": "The ID of the channel. If this is a Microsoft Teams channel, the ID must be in the format of `{team_id}|{channel_id}`.", + "type": "string", + "x-go-name": "ChannelID" + }, + "source": { + "description": "The source, which can be one of `[\"slack\", \"microsoft_teams\", \"discord\"]`.", + "type": "string", + "x-go-name": "Source" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "NumberMetadata": { + "properties": { + "currency": { + "description": "The currency of the number custom field.", + "type": "string", + "x-go-name": "Currency" + }, + "decimal_places": { + "description": "The decimal places of the number custom field.", + "format": "int64", + "type": "integer", + "x-go-name": "DecimalPlaces" + }, + "format": { + "description": "The format of the number custom field.\n\n* with_commas CustomFieldNumberFormatWithCommas\n\n* percent CustomFieldNumberFormatPercent\n\n* currency CustomFieldNumberFormatCurrency", + "enum": [ + "with_commas", + "percent", + "currency" + ], + "type": "string", + "x-go-enum-desc": "with_commas CustomFieldNumberFormatWithCommas\npercent CustomFieldNumberFormatPercent\ncurrency CustomFieldNumberFormatCurrency", + "x-go-name": "Format" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "Pagination": { + "properties": { + "cursor": { + "description": "The cursor for the next page of results.", + "type": "string", + "x-go-name": "Cursor" + }, + "has_next_page": { + "description": "Indicates if there is a next page of results.", + "type": "boolean", + "x-go-name": "HasNextPage" + } + }, + "required": [ + "cursor", + "has_next_page" + ], + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "Project": { + "properties": { + "account": { + "$ref": "#/components/schemas/MiniAccount" + }, + "archived_at": { + "description": "The archived at time of the project in RFC3339 format.", + "type": "string", + "x-go-name": "ArchivedAt" + }, + "created_at": { + "description": "The created at time of the project.", + "type": "string", + "x-go-name": "CreatedAt" + }, + "customer_portal_visible": { + "description": "The customer portal visible of the project.", + "type": "boolean", + "x-go-name": "CustomerPortalVisible" + }, + "description_html": { + "description": "The description of the project in HTML format.", + "type": "string", + "x-go-name": "DescriptionHTML" + }, + "end_date": { + "description": "The end date of the project in RFC3339 format.", + "type": "string", + "x-go-name": "EndDate" + }, + "id": { + "description": "The ID of the project.", + "type": "string", + "x-go-name": "ID" + }, + "is_archived": { + "description": "Whether the project is archived.", + "type": "boolean", + "x-go-name": "IsArchived" + }, + "name": { + "description": "The name of the project.", + "type": "string", + "x-go-name": "Name" + }, + "owner_id": { + "description": "The owner ID of the project.", + "type": "string", + "x-go-name": "OwnerID" + }, + "project_template": { + "$ref": "#/components/schemas/MiniProjectTemplate" + }, + "start_date": { + "description": "The start date of the project in RFC3339 format.", + "type": "string", + "x-go-name": "StartDate" + }, + "updated_at": { + "description": "The updated at time of the project.", + "type": "string", + "x-go-name": "UpdatedAt" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "RedactMessageResponseBody": { + "properties": { + "data": { + "$ref": "#/components/schemas/Message" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + }, + "RouteRedirect": { + "properties": { + "created_at": { + "description": "The time at which the route redirect was created.", + "type": "string", + "x-go-name": "CreatedAt" + }, + "from_path": { + "description": "The path to redirect from.", + "type": "string", + "x-go-name": "FromPath" + }, + "id": { + "description": "The ID of the route redirect.", + "type": "string", + "x-go-name": "ID" + }, + "language": { + "description": "The language of the object to redirect to.", + "type": "string", + "x-go-name": "Language" + }, + "object_id": { + "description": "The ID of the object to redirect to.", + "type": "string", + "x-go-name": "ObjectID" + }, + "object_type": { + "description": "The type of the object to redirect to.", + "type": "string", + "x-go-name": "ObjectType" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "SearchAccountsRequest": { + "properties": { + "cursor": { + "description": "The cursor to use for pagination.", + "type": "string", + "x-go-name": "Cursor" + }, + "filter": { + "$ref": "#/components/schemas/Filter" + }, + "limit": { + "description": "The number of accounts to fetch. Defaults to 100. Must be greater than 0 and less than 1000.", + "format": "int64", + "type": "integer", + "x-go-name": "Limit" + } + }, + "required": [ + "filter" + ], + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + }, + "SearchAccountsResponseBody": { + "properties": { + "data": { + "description": "The data payload of the response.", + "items": { + "$ref": "#/components/schemas/Account" + }, + "type": "array", + "x-go-name": "Data" + }, + "pagination": { + "$ref": "#/components/schemas/Pagination" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + }, + "SearchContactsRequest": { + "properties": { + "cursor": { + "description": "The cursor to use for pagination.", + "type": "string", + "x-go-name": "Cursor" + }, + "filter": { + "$ref": "#/components/schemas/Filter" + }, + "limit": { + "description": "The number of contacts to fetch. Defaults to 100. Must be greater than 0 and less than 1000.", + "format": "int64", + "type": "integer", + "x-go-name": "Limit" + } + }, + "required": [ + "filter" + ], + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + }, + "SearchContactsResponseBody": { + "properties": { + "data": { + "description": "The data payload of the response.", + "items": { + "$ref": "#/components/schemas/Contact" + }, + "type": "array", + "x-go-name": "Data" + }, + "pagination": { + "$ref": "#/components/schemas/Pagination" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + }, + "SearchIssuesRequest": { + "properties": { + "cursor": { + "description": "The cursor to use for pagination.", + "type": "string", + "x-go-name": "Cursor" + }, + "filter": { + "$ref": "#/components/schemas/Filter" + }, + "limit": { + "description": "The number of issues to fetch. Defaults to 100. Must be greater than 0 and less than 1000.", + "format": "int64", + "type": "integer", + "x-go-name": "Limit" + } + }, + "required": [ + "filter" + ], + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + }, + "SearchIssuesResponseBody": { + "properties": { + "data": { + "items": { + "$ref": "#/components/schemas/Issue" + }, + "type": "array", + "x-go-name": "Data" + }, + "pagination": { + "$ref": "#/components/schemas/Pagination" + }, + "request_id": { + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + }, + "SearchUsersRequest": { + "properties": { + "cursor": { + "description": "The cursor to use for pagination.", + "type": "string", + "x-go-name": "Cursor" + }, + "filter": { + "$ref": "#/components/schemas/Filter" + }, + "limit": { + "description": "The number of users to fetch. Defaults to 100. Must be greater than 0 and less than 1000.", + "format": "int64", + "type": "integer", + "x-go-name": "Limit" + } + }, + "required": [ + "filter" + ], + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + }, + "SearchUsersResponseBody": { + "properties": { + "data": { + "description": "The data payload of the response.", + "items": { + "$ref": "#/components/schemas/User" + }, + "type": "array", + "x-go-name": "Data" + }, + "pagination": { + "$ref": "#/components/schemas/Pagination" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + }, + "SelectMetadata": { + "properties": { + "options": { + "description": "The list options of the select custom field. This is only present for select and multiselect custom fields.", + "items": { + "$ref": "#/components/schemas/CustomFieldDefinitionSelectOption" + }, + "type": "array", + "x-go-name": "Options" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "SlackInfo": { + "properties": { + "channel_id": { + "description": "The Slack channel ID associated with the issue.", + "type": "string", + "x-go-name": "SlackChannelID" + }, + "message_ts": { + "description": "The root message ID of slack message that started issue.", + "type": "string", + "x-go-name": "SlackMessageTs" + }, + "workspace_id": { + "description": "The Slack workspace ID associated with the issue.", + "type": "string", + "x-go-name": "SlackWorkspaceID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "SnoozeIssueRequestBody": { + "properties": { + "snooze_until": { + "description": "The date and time to snooze the issue until. (RFC3339)", + "type": "string", + "x-go-name": "SnoozeUntil" + } + }, + "required": [ + "snooze_until" + ], + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + }, + "SnoozeIssueResponseBody": { + "properties": { + "data": { + "$ref": "#/components/schemas/Issue" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + }, + "Tag": { + "properties": { + "hex_color": { + "description": "The hex code of the tag's color.", + "type": "string", + "x-go-name": "HexColor" + }, + "id": { + "description": "The ID of the tag.", + "type": "string", + "x-go-name": "ID" + }, + "object_type": { + "description": "The object type of the tagged object.", + "type": "string", + "x-go-name": "ObjectType" + }, + "value": { + "description": "The value of the Tag.", + "type": "string", + "x-go-name": "Value" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "Task": { + "properties": { + "account": { + "$ref": "#/components/schemas/MiniAccount" + }, + "assignee": { + "$ref": "#/components/schemas/TaskAssignee" + }, + "body_html": { + "description": "The body of the task in HTML format.", + "type": "string", + "x-go-name": "BodyHTML" + }, + "created_at": { + "description": "The created at time of the task.", + "type": "string", + "x-go-name": "CreatedAt" + }, + "customer_portal_visible": { + "description": "The customer portal visible of the task.", + "type": "boolean", + "x-go-name": "CustomerPortalVisible" + }, + "due_date": { + "description": "The due date of the task in RFC3339 format.", + "type": "string", + "x-go-name": "DueDate" + }, + "id": { + "description": "The ID of the task.", + "type": "string", + "x-go-name": "ID" + }, + "milestone": { + "$ref": "#/components/schemas/MiniMilestone" + }, + "project": { + "$ref": "#/components/schemas/MiniProject" + }, + "status": { + "description": "The status of the task.\n\n* not_started TaskStatusNotStarted\n\n* in_progress TaskStatusInProgress\n\n* completed TaskStatusCompleted", + "enum": [ + "not_started", + "in_progress", + "completed" + ], + "type": "string", + "x-go-enum-desc": "not_started TaskStatusNotStarted\nin_progress TaskStatusInProgress\ncompleted TaskStatusCompleted", + "x-go-name": "Status" + }, + "title": { + "description": "The title of the task.", + "type": "string", + "x-go-name": "Title" + }, + "updated_at": { + "description": "The updated at time of the task.", + "type": "string", + "x-go-name": "UpdatedAt" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "TaskAssignee": { + "properties": { + "contact": { + "$ref": "#/components/schemas/MiniContact" + }, + "user": { + "$ref": "#/components/schemas/MiniUser" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "Team": { + "properties": { + "id": { + "description": "The ID of the team.", + "type": "string", + "x-go-name": "ID" + }, + "name": { + "description": "The name of the team.", + "type": "string", + "x-go-name": "Name" + }, + "users": { + "description": "The users in the team.", + "items": { + "$ref": "#/components/schemas/MiniUser" + }, + "type": "array", + "x-go-name": "Users" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "TicketForm": { + "properties": { + "description_html": { + "description": "The description of the ticket form in HTML.", + "type": "string", + "x-go-name": "DescriptionHTML" + }, + "fields": { + "description": "The layout of the ticket form.", + "items": { + "$ref": "#/components/schemas/TicketFormLayoutField" + }, + "type": "array", + "x-go-name": "Fields" + }, + "id": { + "description": "The ID of the ticket form.", + "type": "string", + "x-go-name": "ID" + }, + "is_public": { + "description": "Indicates if the ticket form is public.", + "type": "boolean", + "x-go-name": "IsPublic" + }, + "name": { + "description": "The name of the ticket form.", + "type": "string", + "x-go-name": "Name" + }, + "slug": { + "description": "The slug of the ticket form.", + "type": "string", + "x-go-name": "Slug" + }, + "url": { + "description": "The URL of the ticket form.", + "type": "string", + "x-go-name": "URL" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "TicketFormLayoutField": { + "properties": { + "description_html": { + "description": "The description of the ticket form layout field in HTML.", + "type": "string", + "x-go-name": "DescriptionHTML" + }, + "name": { + "description": "The name of the ticket form layout field.", + "type": "string", + "x-go-name": "Name" + }, + "slug": { + "description": "The slug of the ticket form layout field.", + "type": "string", + "x-go-name": "Slug" + }, + "type": { + "description": "The type of the ticket form layout field.", + "type": "string", + "x-go-name": "Type" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "TrainingData": { + "properties": { + "created_at": { + "type": "string", + "x-go-name": "CreatedAt" + }, + "documents": { + "items": { + "$ref": "#/components/schemas/TrainingDataDocument" + }, + "type": "array", + "x-go-name": "Documents" + }, + "exclude_from_kb_search": { + "type": "boolean", + "x-go-name": "ExcludeFromKBSearch" + }, + "id": { + "type": "string", + "x-go-name": "ID" + }, + "name": { + "type": "string", + "x-go-name": "Name" + }, + "scrape_status": { + "$ref": "#/components/schemas/TrainingDataScrapeStatus" + }, + "type": { + "type": "string", + "x-go-name": "Type" + }, + "updated_at": { + "type": "string", + "x-go-name": "UpdatedAt" + }, + "visibility": { + "type": "string", + "x-go-name": "Visibility" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "TrainingDataDocument": { + "properties": { + "external_id": { + "type": "string", + "x-go-name": "ExternalID" + }, + "file_name": { + "type": "string", + "x-go-name": "FileName" + }, + "file_size": { + "format": "int64", + "type": "integer", + "x-go-name": "FileSize" + }, + "file_type": { + "type": "string", + "x-go-name": "FileType" + }, + "id": { + "type": "string", + "x-go-name": "ID" + }, + "s3_key": { + "type": "string", + "x-go-name": "S3Key" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "TrainingDataScrapeStatus": { + "properties": { + "last_scraped_at": { + "type": "string", + "x-go-name": "LastScrapedAt" + }, + "pages_scraped": { + "format": "int64", + "type": "integer", + "x-go-name": "PagesScraped" + }, + "status": { + "type": "string", + "x-go-name": "Status" + }, + "total_pages": { + "format": "int64", + "type": "integer", + "x-go-name": "TotalPages" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "TrainingDataUploadResponseBody": { + "properties": { + "data": { + "$ref": "#/components/schemas/TrainingData" + }, + "request_id": { + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + }, + "UpdateAccountHighlightRequestBody": { + "properties": { + "content_html": { + "description": "The updated HTML content for this highlight.", + "type": "string", + "x-go-name": "ContentHTML" + }, + "expires_at": { + "description": "The updated expires at timestamp (RFC3339).", + "type": "string", + "x-go-name": "ExpiresAt" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + }, + "UpdateAccountHighlightResponseBody": { + "properties": { + "data": { + "$ref": "#/components/schemas/AccountHighlight" + }, + "request_id": { + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + }, + "UpdateAccountRequestBody": { + "properties": { + "channels": { + "description": "An array of channels to be linked to this account.", + "items": { + "$ref": "#/components/schemas/Channel" + }, + "type": "array", + "x-go-name": "Channels" + }, + "custom_fields": { + "description": "An array of custom fields to be used on this account.", + "items": { + "$ref": "#/components/schemas/CustomFieldValue" + }, + "type": "array", + "x-go-name": "CustomFields" + }, + "domains": { + "description": "Domains of the account. Must specify one domain as primary.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Domains" + }, + "external_ids": { + "description": "An array of external IDs to be used on this account. If provided, the accounts external IDs will be updated to the given external IDs.", + "items": { + "$ref": "#/components/schemas/ExternalID" + }, + "type": "array", + "x-go-name": "ExternalIDs" + }, + "logo_url": { + "description": "Logo URL of the account.", + "type": "string", + "x-go-name": "LogoURL" + }, + "name": { + "description": "The name of the account.", + "type": "string", + "x-go-name": "Name" + }, + "owner_id": { + "description": "The ID of the owner of the account.", + "type": "string", + "x-go-name": "OwnerID" + }, + "primary_domain": { + "description": "Must be in the list of domains. If there are any domains, there must be exactly one primary domain.", + "type": "string", + "x-go-name": "PrimaryDomain" + }, + "tags": { + "description": "An array of strings to use as tags on this account. If provided, the accounts tags will be updated to the given tags.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Tags" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + }, + "UpdateAccountResponseBody": { + "properties": { + "data": { + "$ref": "#/components/schemas/Account" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + }, + "UpdateAccountsRequest": { + "properties": { + "account_ids": { + "description": "The account IDs to update. The number of accounts to update must be between 1 and 100.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "AccountIDs" + }, + "custom_fields": { + "description": "An array of custom fields to be updated on the accounts.", + "items": { + "$ref": "#/components/schemas/CustomFieldValue" + }, + "type": "array", + "x-go-name": "CustomFields" + }, + "owner_id": { + "description": "The ID of the new owner. If empty string is passed in, the owner will be removed.", + "type": "string", + "x-go-name": "OwnerID" + }, + "tags": { + "description": "An array of tags to be updated on the accounts.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Tags" + }, + "tags_apply_mode": { + "description": "The mode for applying tags. Valid values: \"append_only\", \"remove_only\", \"replace\". Defaults to \"replace\".", + "type": "string", + "x-go-name": "TagsApplyMode" + } + }, + "required": [ + "account_ids" + ], + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + }, + "UpdateAccountsResponseBody": { + "properties": { + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + }, + "success": { + "description": "Whether the update was successfully initiated.", + "type": "boolean", + "x-go-name": "Success" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + }, + "UpdateArticleRequestBody": { + "properties": { + "body_html": { + "description": "The HTML body of the article.", + "type": "string", + "x-go-name": "BodyHTML" + }, + "language": { + "description": "The language code of the translation to update. If not provided, the default language (original article) will be updated.", + "type": "string", + "x-go-name": "Language" + }, + "publish_updated_body_html": { + "description": "Whether the changes to the article should be published. Defaults to false.", + "type": "boolean", + "x-go-name": "PublishUpdatedBodyHTML" + }, + "title": { + "description": "The title of the article.", + "type": "string", + "x-go-name": "Title" + }, + "visibility_config": { + "$ref": "#/components/schemas/VisibilityConfig" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + }, + "UpdateArticleResponseBody": { + "properties": { + "data": { + "$ref": "#/components/schemas/Article" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + }, + "UpdateContactRequestBody": { + "properties": { + "account_external_id": { + "description": "The external ID of the account to move the contact to. Cannot be used together with account_id.", + "type": "string", + "x-go-name": "AccountExternalID" + }, + "account_id": { + "description": "The account to move the contact to.", + "type": "string", + "x-go-name": "AccountID" + }, + "avatar_url": { + "description": "The avatar URL of the contact. Must be a square .png, .jpg or .jpeg.", + "type": "string", + "x-go-name": "AvatarUrl" + }, + "custom_fields": { + "description": "An array of custom fields to be applied to this contact.", + "items": { + "$ref": "#/components/schemas/CustomFieldValue" + }, + "type": "array", + "x-go-name": "CustomFields" + }, + "email": { + "description": "The email of the contact.", + "type": "string", + "x-go-name": "Email" + }, + "name": { + "description": "in: body\n\nThe name of the contact.", + "type": "string", + "x-go-name": "Name" + }, + "portal_role": { + "description": "The portal role to assign to the contact. Can be one of `no_access`, `member`, or `admin`.\n\n* no_access PortalRoleNoAccess\n\n* member PortalRoleMember\n\n* admin PortalRoleAdmin", + "enum": [ + "no_access", + "member", + "admin" + ], + "type": "string", + "x-go-enum-desc": "no_access PortalRoleNoAccess\nmember PortalRoleMember\nadmin PortalRoleAdmin", + "x-go-name": "PortalRole" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + }, + "UpdateContactResponseBody": { + "properties": { + "data": { + "$ref": "#/components/schemas/Contact" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + }, + "UpdateCustomFieldRequestBody": { + "properties": { + "default_value": { + "description": "The default value for single-valued custom fields.", + "type": "string", + "x-go-name": "DefaultValue" + }, + "default_values": { + "description": "The default values for multi-valued custom fields.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "DefaultValues" + }, + "description": { + "description": "The description of the custom field.", + "type": "string", + "x-go-name": "Description" + }, + "label": { + "description": "The label of the custom field.", + "type": "string", + "x-go-name": "Label" + }, + "select_options": { + "description": "The list options of the select custom field. This is only present for select and multiselect custom fields.", + "items": { + "$ref": "#/components/schemas/CustomFieldDefinitionSelectOption" + }, + "type": "array", + "x-go-name": "SelectOptions" + }, + "slug": { + "description": "The slug of the custom field.", + "type": "string", + "x-go-name": "Slug" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + }, + "UpdateCustomFieldResponseBody": { + "properties": { + "data": { + "$ref": "#/components/schemas/CustomFieldDefinition" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + }, + "UpdateIssueRequestBody": { + "properties": { + "account_id": { + "description": "The ID of the account that this issue belongs to. Only supported on issues with source: [\"manual\", \"form\", \"email\"].", + "type": "string", + "x-go-name": "AccountID" + }, + "assignee_id": { + "description": "The ID of the user who should be assigned to this issue. If empty string is passed in, the issue assignee will be removed.", + "type": "string", + "x-go-name": "AssigneeID" + }, + "custom_fields": { + "description": "An array of custom fields to be used on this issue. Only passed in fields will be modified.", + "items": { + "$ref": "#/components/schemas/CustomFieldValue" + }, + "type": "array", + "x-go-name": "CustomFields" + }, + "customer_portal_visible": { + "description": "Whether the issue should be visible in the customer portal.", + "type": "boolean", + "x-go-name": "CustomerPortalVisible" + }, + "requester_id": { + "description": "The ID of the requester that this issue is on behalf of.", + "type": "string", + "x-go-name": "RequesterID" + }, + "requestor_id": { + "description": "Deprecated: Use requester_id instead.", + "type": "string", + "x-go-name": "RequestorID" + }, + "state": { + "description": "The state this issue should be moved to. Can be one of new, waiting_on_you, waiting_on_customer, on_hold, closed, or a custom status.", + "type": "string", + "x-go-name": "State" + }, + "tags": { + "description": "An array of strings to use as tags on this issue. If provided, the issue tags will be updated to be exactly the given tags.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Tags" + }, + "team_id": { + "description": "The ID of the team this issue should be assigned to. If empty string is passed in, any assigned team will be removed.", + "type": "string", + "x-go-name": "TeamID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + }, + "UpdateIssueResponseBody": { + "properties": { + "data": { + "$ref": "#/components/schemas/Issue" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + }, + "UpdateMilestoneRequestBody": { + "properties": { + "due_date": { + "description": "Due date for this milestone, in RFC 3339 format", + "type": "string", + "x-go-name": "DueDate" + }, + "name": { + "description": "Name for this milestone", + "type": "string", + "x-go-name": "Name" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + }, + "UpdateMilestoneResponseBody": { + "properties": { + "data": { + "$ref": "#/components/schemas/Milestone" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + }, + "UpdateProjectRequestBody": { + "properties": { + "customer_portal_visible": { + "description": "Customer portal visible for this project", + "type": "boolean", + "x-go-name": "CustomerPortalVisible" + }, + "description_html": { + "description": "Description HTML for this project", + "type": "string", + "x-go-name": "DescriptionHTML" + }, + "end_date": { + "description": "End date for this project, in RFC 3339 format", + "type": "string", + "x-go-name": "EndDate" + }, + "is_archived": { + "description": "Whether the project is archived", + "type": "boolean", + "x-go-name": "IsArchived" + }, + "name": { + "description": "Name for this project", + "type": "string", + "x-go-name": "Name" + }, + "owner_id": { + "description": "Owner ID for this project", + "type": "string", + "x-go-name": "OwnerID" + }, + "start_date": { + "description": "Start date for this project, in RFC 3339 format", + "type": "string", + "x-go-name": "StartDate" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + }, + "UpdateProjectResponseBody": { + "properties": { + "data": { + "$ref": "#/components/schemas/Project" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + }, + "UpdateTagRequestBody": { + "properties": { + "hex_color": { + "description": "The hex code of the tag's color.", + "type": "string", + "x-go-name": "HexColor" + }, + "value": { + "description": "in: body\n\nThe name of the tag.", + "type": "string", + "x-go-name": "Value" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + }, + "UpdateTagResponseBody": { + "properties": { + "data": { + "$ref": "#/components/schemas/Tag" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + }, + "UpdateTaskRequestBody": { + "properties": { + "assignee_id": { + "description": "Assignee ID for this task", + "type": "string", + "x-go-name": "AssigneeID" + }, + "body_html": { + "description": "Body HTML for this task", + "type": "string", + "x-go-name": "BodyHTML" + }, + "customer_portal_visible": { + "description": "Customer portal visible for this task", + "type": "boolean", + "x-go-name": "CustomerPortalVisible" + }, + "due_date": { + "description": "Due date for this task, in RFC 3339 format", + "type": "string", + "x-go-name": "DueDate" + }, + "milestone_id": { + "description": "Milestone ID for this task", + "type": "string", + "x-go-name": "MilestoneID" + }, + "project_id": { + "description": "Project ID for this task", + "type": "string", + "x-go-name": "ProjectID" + }, + "status": { + "description": "Status for this task\n\n* not_started TaskStatusNotStarted\n\n* in_progress TaskStatusInProgress\n\n* completed TaskStatusCompleted", + "enum": [ + "not_started", + "in_progress", + "completed" + ], + "type": "string", + "x-go-enum-desc": "not_started TaskStatusNotStarted\nin_progress TaskStatusInProgress\ncompleted TaskStatusCompleted", + "x-go-name": "Status" + }, + "title": { + "description": "Title for this task", + "type": "string", + "x-go-name": "Title" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + }, + "UpdateTaskResponseBody": { + "properties": { + "data": { + "$ref": "#/components/schemas/Task" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + }, + "UpdateTeamRequestBody": { + "properties": { + "name": { + "description": "The name of the team.", + "type": "string", + "x-go-name": "Name" + }, + "user_ids": { + "description": "The list of user IDs to add to the team. If provided, the team members will be updated to be exactly the given users.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "UserIDs" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + }, + "UpdateTeamResponseBody": { + "properties": { + "data": { + "$ref": "#/components/schemas/Team" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + }, + "UpdateUserRequestBody": { + "properties": { + "role_id": { + "description": "The role_id of the user.", + "type": "string", + "x-go-name": "RoleID" + }, + "status": { + "description": "The new user status for the user. Can be one of `active`, `away`, or `out_of_office`.", + "type": "string", + "x-go-name": "Status" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + }, + "UpdateUserResponseBody": { + "properties": { + "data": { + "$ref": "#/components/schemas/User" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + }, + "UploadAccountFileResponseBody": { + "properties": { + "data": { + "description": "The data payload of the response.", + "items": { + "$ref": "#/components/schemas/Attachment" + }, + "type": "array", + "x-go-name": "Data" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + }, + "UploadTrainingDataFileContentRequestBody": { + "properties": { + "content": { + "description": "The text content to upload.", + "type": "string", + "x-go-name": "Content" + }, + "external_id": { + "description": "External ID for idempotent operations (optional).", + "type": "string", + "x-go-name": "ExternalID" + }, + "file_name": { + "description": "The name for the uploaded file.", + "type": "string", + "x-go-name": "FileName" + }, + "training_data_id": { + "description": "The ID of an existing training data container to upload to (optional).", + "type": "string", + "x-go-name": "TrainingDataID" + }, + "training_data_name": { + "description": "The name of a new training data container (required if training_data_id not provided).", + "type": "string", + "x-go-name": "TrainingDataName" + }, + "visibility": { + "description": "Visibility of the training data. Defaults to \"everyone\".", + "type": "string", + "x-go-name": "Visibility" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + }, + "User": { + "properties": { + "avatar_url": { + "description": "The avatar URL of the user.", + "type": "string", + "x-go-name": "AvatarURL" + }, + "email": { + "description": "The primary email of the user.", + "type": "string", + "x-go-name": "Email" + }, + "emails": { + "description": "The list of all emails of the user.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Emails" + }, + "id": { + "description": "The ID of the user.", + "type": "string", + "x-go-name": "ID" + }, + "name": { + "description": "The name of the user.", + "type": "string", + "x-go-name": "Name" + }, + "role_id": { + "description": "The role_id of the user.", + "type": "string", + "x-go-name": "RoleID" + }, + "status": { + "description": "The status of the user.", + "type": "string", + "x-go-name": "Status" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "UserRole": { + "properties": { + "id": { + "description": "The ID of the role.", + "type": "string", + "x-go-name": "ID" + }, + "name": { + "description": "The name of the role.", + "type": "string", + "x-go-name": "Name" + }, + "slug": { + "description": "The slug of the role.", + "type": "string", + "x-go-name": "Slug" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "VisibilityConfig": { + "properties": { + "ai_agent_access": { + "description": "AI agent access control for the article. Defaults to inherit from the parent scope when omitted.\n\n* inherit KnowledgeBaseArticleAIAgentAccessInherit Defers the access check to the parent object (Collection or KnowledgeBase).\n\n* none KnowledgeBaseArticleAIAgentAccessNone No AI agents have access to this article.\n\n* specific_agents KnowledgeBaseArticleAIAgentAccessSpecificAgents Only specific AI agents enumerated in the allowlist have access.", + "enum": [ + "inherit", + "none", + "specific_agents" + ], + "type": "string", + "x-go-enum-desc": "inherit KnowledgeBaseArticleAIAgentAccessInherit Defers the access check to the parent object (Collection or KnowledgeBase).\nnone KnowledgeBaseArticleAIAgentAccessNone No AI agents have access to this article.\nspecific_agents KnowledgeBaseArticleAIAgentAccessSpecificAgents Only specific AI agents enumerated in the allowlist have access.", + "x-go-name": "AiAgentAccess" + }, + "allowed_agent_ids": { + "description": "List of AI agent IDs that may access this article when ai_agent_access is set to \"specific_agents\".", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "AllowedAgentIDs" + }, + "customer_visibility_condition": { + "$ref": "#/components/schemas/Filter" + }, + "visibility": { + "description": "The visibility setting of the article.\n\n* public KnowledgeBaseArticleVisibilityPublic\n\n* customer KnowledgeBaseArticleVisibilityCustomer\n\n* internal_only KnowledgeBaseArticleVisibilityInternalOnly", + "enum": [ + "public", + "customer", + "internal_only" + ], + "type": "string", + "x-go-enum-desc": "public KnowledgeBaseArticleVisibilityPublic\ncustomer KnowledgeBaseArticleVisibilityCustomer\ninternal_only KnowledgeBaseArticleVisibilityInternalOnly", + "x-go-name": "Visibility" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + } + }, + "securitySchemes": { + "bearerAuth": { + "description": "Authorization: Bearer ", + "scheme": "bearer", + "type": "http" + } + } + }, + "info": { + "description": "Documentation of Pylon API.", + "title": "Pylon API.", + "version": "1.0.0" + }, + "openapi": "3.0.1", + "paths": { + "/accounts": { + "get": { + "description": "Get a list of accounts", + "operationId": "GetAccounts", + "parameters": [ + { + "description": "The cursor to use for pagination.", + "in": "query", + "name": "cursor", + "schema": { + "type": "string", + "x-go-name": "Cursor" + }, + "x-go-name": "Cursor" + }, + { + "description": "The number of accounts to fetch. Defaults to 100. Must be greater than 0 and less than 1000.", + "in": "query", + "name": "limit", + "required": true, + "schema": { + "format": "int64", + "type": "integer", + "x-go-name": "Limit" + }, + "x-go-name": "Limit" + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "description": "The data payload of the response.", + "items": { + "properties": { + "channels": { + "description": "Channels associated with the account.", + "items": { + "properties": { + "channel_id": { + "description": "The ID of the channel. If this is a Microsoft Teams channel, the ID must be in the format of `{team_id}|{channel_id}`.", + "type": "string", + "x-go-name": "ChannelID" + }, + "is_primary": { + "description": "Whether this channel is the primary channel for the account.", + "type": "boolean", + "x-go-name": "IsPrimary" + }, + "mirror_to": { + "properties": { + "channel_id": { + "description": "The ID of the channel. If this is a Microsoft Teams channel, the ID must be in the format of `{team_id}|{channel_id}`.", + "type": "string", + "x-go-name": "ChannelID" + }, + "source": { + "description": "The source, which can be one of `[\"slack\", \"microsoft_teams\", \"discord\"]`.", + "type": "string", + "x-go-name": "Source" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "source": { + "description": "The source, which can be one of `[\"slack\", \"microsoft_teams\", \"discord\"]`.", + "type": "string", + "x-go-name": "Source" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "type": "array", + "x-go-name": "Channels" + }, + "created_at": { + "description": "The creation time of the account.", + "type": "string", + "x-go-name": "CreatedAt" + }, + "crm_settings": { + "properties": { + "details": { + "description": "List of all CRM details for the account.", + "items": { + "properties": { + "id": { + "description": "The ID of the CRM for that source.", + "type": "string", + "x-go-name": "ID" + }, + "source": { + "description": "The source of the CRM.", + "type": "string", + "x-go-name": "Source" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "type": "array", + "x-go-name": "Details" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "custom_fields": { + "additionalProperties": { + "properties": { + "slug": { + "description": "The slug of the custom field.", + "type": "string", + "x-go-name": "Slug" + }, + "value": { + "description": "The value of the custom field. Only to be used for single-valued custom fields. If unset, the custom field will be unset. If the custom field is a select field, the value must be the select option slug, which you can find from the GET /custom-fields endpoint.", + "type": "string", + "x-go-name": "Value" + }, + "values": { + "description": "The values of the custom field. Only to be used for multi-valued custom fields (ex. multiselect). If unset, the custom field will be unset. If the custom field is a multiselect field, the values must be the select option slugs which you can find from the GET /custom-fields endpoint.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Values" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "description": "Custom fields associated with the account.", + "type": "object", + "x-go-name": "CustomFields" + }, + "domain": { + "description": "The primary domain of the account.", + "type": "string", + "x-go-name": "Domain" + }, + "domains": { + "description": "The list of domains associated with the account.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Domains" + }, + "external_ids": { + "description": "External IDs associated with the account.", + "items": { + "properties": { + "external_id": { + "description": "The external ID. Must be unique per object type (ex. account).", + "type": "string", + "x-go-name": "ExternalID" + }, + "label": { + "description": "The label of the external ID. Must be unique per object.", + "type": "string", + "x-go-name": "Label" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "type": "array", + "x-go-name": "ExternalIDs" + }, + "id": { + "description": "The ID of the account.", + "type": "string", + "x-go-name": "ID" + }, + "latest_customer_activity_time": { + "description": "The time of the latest customer activity.", + "type": "string", + "x-go-name": "LatestCustomerActivityTime" + }, + "name": { + "description": "The name of the account.", + "type": "string", + "x-go-name": "Name" + }, + "owner": { + "properties": { + "email": { + "description": "The email of the user.", + "type": "string", + "x-go-name": "Email" + }, + "id": { + "description": "The ID of the user.", + "type": "string", + "x-go-name": "ID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "primary_domain": { + "description": "The primary domain of the account.", + "type": "string", + "x-go-name": "PrimaryDomain" + }, + "tags": { + "description": "Tags associated with the account.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Tags" + }, + "type": { + "description": "The type of the account.", + "type": "string", + "x-go-name": "Type" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "type": "array", + "x-go-name": "Data" + }, + "pagination": { + "properties": { + "cursor": { + "description": "The cursor for the next page of results.", + "type": "string", + "x-go-name": "Cursor" + }, + "has_next_page": { + "description": "Indicates if there is a next page of results.", + "type": "boolean", + "x-go-name": "HasNextPage" + } + }, + "required": [ + "cursor", + "has_next_page" + ], + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + } + } + }, + "description": "" + }, + "400": { + "content": { + "application/json": { + "schema": { + "properties": { + "errors": { + "description": "The list of errors.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Errors" + }, + "exists_id": { + "description": "The ID of the object that already exists if this is a duplicate object error.", + "type": "string", + "x-go-name": "ExistsID" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + } + } + }, + "description": "" + }, + "404": { + "content": { + "application/json": { + "schema": { + "properties": { + "errors": { + "description": "The list of errors.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Errors" + }, + "exists_id": { + "description": "The ID of the object that already exists if this is a duplicate object error.", + "type": "string", + "x-go-name": "ExistsID" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + } + } + }, + "description": "" + }, + "500": { + "content": { + "application/json": { + "schema": { + "properties": { + "errors": { + "description": "The list of errors.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Errors" + }, + "exists_id": { + "description": "The ID of the object that already exists if this is a duplicate object error.", + "type": "string", + "x-go-name": "ExistsID" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + } + } + }, + "description": "" + } + }, + "tags": [ + "accounts" + ], + "x-moar-primitive-count": 0, + "x-moar-complexity-skipped": false + }, + "patch": { + "description": "Update multiple accounts", + "operationId": "UpdateAccounts", + "requestBody": { + "content": { + "application/json": { + "schema": { + "properties": { + "account_ids": { + "description": "The account IDs to update. The number of accounts to update must be between 1 and 100.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "AccountIDs" + }, + "custom_fields": { + "description": "An array of custom fields to be updated on the accounts.", + "items": { + "properties": { + "slug": { + "description": "The slug of the custom field.", + "type": "string", + "x-go-name": "Slug" + }, + "value": { + "description": "The value of the custom field. Only to be used for single-valued custom fields. If unset, the custom field will be unset. If the custom field is a select field, the value must be the select option slug, which you can find from the GET /custom-fields endpoint.", + "type": "string", + "x-go-name": "Value" + }, + "values": { + "description": "The values of the custom field. Only to be used for multi-valued custom fields (ex. multiselect). If unset, the custom field will be unset. If the custom field is a multiselect field, the values must be the select option slugs which you can find from the GET /custom-fields endpoint.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Values" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "type": "array", + "x-go-name": "CustomFields" + }, + "owner_id": { + "description": "The ID of the new owner. If empty string is passed in, the owner will be removed.", + "type": "string", + "x-go-name": "OwnerID" + }, + "tags": { + "description": "An array of tags to be updated on the accounts.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Tags" + }, + "tags_apply_mode": { + "description": "The mode for applying tags. Valid values: \"append_only\", \"remove_only\", \"replace\". Defaults to \"replace\".", + "type": "string", + "x-go-name": "TagsApplyMode" + } + }, + "required": [ + "account_ids" + ], + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + } + } + }, + "required": false + }, + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "properties": { + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + }, + "success": { + "description": "Whether the update was successfully initiated.", + "type": "boolean", + "x-go-name": "Success" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + } + } + }, + "description": "" + }, + "400": { + "content": { + "application/json": { + "schema": { + "properties": { + "errors": { + "description": "The list of errors.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Errors" + }, + "exists_id": { + "description": "The ID of the object that already exists if this is a duplicate object error.", + "type": "string", + "x-go-name": "ExistsID" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + } + } + }, + "description": "" + }, + "500": { + "content": { + "application/json": { + "schema": { + "properties": { + "errors": { + "description": "The list of errors.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Errors" + }, + "exists_id": { + "description": "The ID of the object that already exists if this is a duplicate object error.", + "type": "string", + "x-go-name": "ExistsID" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + } + } + }, + "description": "" + } + }, + "tags": [ + "accounts" + ], + "x-codegen-request-body-name": "Body", + "x-moar-primitive-count": 7, + "x-moar-complexity-skipped": false + }, + "post": { + "description": "Create a new account", + "operationId": "CreateAccount", + "requestBody": { + "content": { + "application/json": { + "schema": { + "properties": { + "channels": { + "description": "An array of channels to be linked to this account.", + "items": { + "properties": { + "channel_id": { + "description": "The ID of the channel. If this is a Microsoft Teams channel, the ID must be in the format of `{team_id}|{channel_id}`.", + "type": "string", + "x-go-name": "ChannelID" + }, + "is_primary": { + "description": "Whether this channel is the primary channel for the account.", + "type": "boolean", + "x-go-name": "IsPrimary" + }, + "mirror_to": { + "properties": { + "channel_id": { + "description": "The ID of the channel. If this is a Microsoft Teams channel, the ID must be in the format of `{team_id}|{channel_id}`.", + "type": "string", + "x-go-name": "ChannelID" + }, + "source": { + "description": "The source, which can be one of `[\"slack\", \"microsoft_teams\", \"discord\"]`.", + "type": "string", + "x-go-name": "Source" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "source": { + "description": "The source, which can be one of `[\"slack\", \"microsoft_teams\", \"discord\"]`.", + "type": "string", + "x-go-name": "Source" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "type": "array", + "x-go-name": "Channels" + }, + "custom_fields": { + "description": "An array of custom fields to be used on this account.", + "items": { + "properties": { + "slug": { + "description": "The slug of the custom field.", + "type": "string", + "x-go-name": "Slug" + }, + "value": { + "description": "The value of the custom field. Only to be used for single-valued custom fields. If unset, the custom field will be unset. If the custom field is a select field, the value must be the select option slug, which you can find from the GET /custom-fields endpoint.", + "type": "string", + "x-go-name": "Value" + }, + "values": { + "description": "The values of the custom field. Only to be used for multi-valued custom fields (ex. multiselect). If unset, the custom field will be unset. If the custom field is a multiselect field, the values must be the select option slugs which you can find from the GET /custom-fields endpoint.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Values" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "type": "array", + "x-go-name": "CustomFields" + }, + "domain": { + "description": "Deprecated. Please use Domains and PrimaryDomain instead.", + "type": "string", + "x-go-name": "Domain" + }, + "domains": { + "description": "The domains of the account, without any leading scheme, for example stripe.com. Must specify one domain as primary.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Domains" + }, + "external_ids": { + "description": "An array of external IDs to be used on this account. If provided, the accounts external IDs will be updated to the given external IDs.", + "items": { + "properties": { + "external_id": { + "description": "The external ID. Must be unique per object type (ex. account).", + "type": "string", + "x-go-name": "ExternalID" + }, + "label": { + "description": "The label of the external ID. Must be unique per object.", + "type": "string", + "x-go-name": "Label" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "type": "array", + "x-go-name": "ExternalIDs" + }, + "logo_url": { + "description": "The logo URL of the account. Must be a square .png, .jpg or .jpeg.", + "type": "string", + "x-go-name": "LogoURL" + }, + "name": { + "description": "The name of the account.", + "type": "string", + "x-go-name": "Name" + }, + "owner_id": { + "description": "The ID of the owner of the account.", + "type": "string", + "x-go-name": "OwnerID" + }, + "primary_domain": { + "description": "Must be in the list of domains. If there are any domains, there must be exactly one primary domain.", + "type": "string", + "x-go-name": "PrimaryDomain" + }, + "tags": { + "description": "An array of strings to use as tags on this account. If provided, the accounts tags will be updated to the given tags.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Tags" + } + }, + "required": [ + "name" + ], + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + } + } + }, + "required": false + }, + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "properties": { + "channels": { + "description": "Channels associated with the account.", + "items": { + "properties": { + "channel_id": { + "description": "The ID of the channel. If this is a Microsoft Teams channel, the ID must be in the format of `{team_id}|{channel_id}`.", + "type": "string", + "x-go-name": "ChannelID" + }, + "is_primary": { + "description": "Whether this channel is the primary channel for the account.", + "type": "boolean", + "x-go-name": "IsPrimary" + }, + "mirror_to": { + "properties": { + "channel_id": { + "description": "The ID of the channel. If this is a Microsoft Teams channel, the ID must be in the format of `{team_id}|{channel_id}`.", + "type": "string", + "x-go-name": "ChannelID" + }, + "source": { + "description": "The source, which can be one of `[\"slack\", \"microsoft_teams\", \"discord\"]`.", + "type": "string", + "x-go-name": "Source" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "source": { + "description": "The source, which can be one of `[\"slack\", \"microsoft_teams\", \"discord\"]`.", + "type": "string", + "x-go-name": "Source" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "type": "array", + "x-go-name": "Channels" + }, + "created_at": { + "description": "The creation time of the account.", + "type": "string", + "x-go-name": "CreatedAt" + }, + "crm_settings": { + "properties": { + "details": { + "description": "List of all CRM details for the account.", + "items": { + "properties": { + "id": { + "description": "The ID of the CRM for that source.", + "type": "string", + "x-go-name": "ID" + }, + "source": { + "description": "The source of the CRM.", + "type": "string", + "x-go-name": "Source" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "type": "array", + "x-go-name": "Details" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "custom_fields": { + "additionalProperties": { + "properties": { + "slug": { + "description": "The slug of the custom field.", + "type": "string", + "x-go-name": "Slug" + }, + "value": { + "description": "The value of the custom field. Only to be used for single-valued custom fields. If unset, the custom field will be unset. If the custom field is a select field, the value must be the select option slug, which you can find from the GET /custom-fields endpoint.", + "type": "string", + "x-go-name": "Value" + }, + "values": { + "description": "The values of the custom field. Only to be used for multi-valued custom fields (ex. multiselect). If unset, the custom field will be unset. If the custom field is a multiselect field, the values must be the select option slugs which you can find from the GET /custom-fields endpoint.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Values" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "description": "Custom fields associated with the account.", + "type": "object", + "x-go-name": "CustomFields" + }, + "domain": { + "description": "The primary domain of the account.", + "type": "string", + "x-go-name": "Domain" + }, + "domains": { + "description": "The list of domains associated with the account.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Domains" + }, + "external_ids": { + "description": "External IDs associated with the account.", + "items": { + "properties": { + "external_id": { + "description": "The external ID. Must be unique per object type (ex. account).", + "type": "string", + "x-go-name": "ExternalID" + }, + "label": { + "description": "The label of the external ID. Must be unique per object.", + "type": "string", + "x-go-name": "Label" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "type": "array", + "x-go-name": "ExternalIDs" + }, + "id": { + "description": "The ID of the account.", + "type": "string", + "x-go-name": "ID" + }, + "latest_customer_activity_time": { + "description": "The time of the latest customer activity.", + "type": "string", + "x-go-name": "LatestCustomerActivityTime" + }, + "name": { + "description": "The name of the account.", + "type": "string", + "x-go-name": "Name" + }, + "owner": { + "properties": { + "email": { + "description": "The email of the user.", + "type": "string", + "x-go-name": "Email" + }, + "id": { + "description": "The ID of the user.", + "type": "string", + "x-go-name": "ID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "primary_domain": { + "description": "The primary domain of the account.", + "type": "string", + "x-go-name": "PrimaryDomain" + }, + "tags": { + "description": "Tags associated with the account.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Tags" + }, + "type": { + "description": "The type of the account.", + "type": "string", + "x-go-name": "Type" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + } + } + }, + "description": "" + }, + "400": { + "content": { + "application/json": { + "schema": { + "properties": { + "errors": { + "description": "The list of errors.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Errors" + }, + "exists_id": { + "description": "The ID of the object that already exists if this is a duplicate object error.", + "type": "string", + "x-go-name": "ExistsID" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + } + } + }, + "description": "" + }, + "404": { + "content": { + "application/json": { + "schema": { + "properties": { + "errors": { + "description": "The list of errors.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Errors" + }, + "exists_id": { + "description": "The ID of the object that already exists if this is a duplicate object error.", + "type": "string", + "x-go-name": "ExistsID" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + } + } + }, + "description": "" + }, + "500": { + "content": { + "application/json": { + "schema": { + "properties": { + "errors": { + "description": "The list of errors.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Errors" + }, + "exists_id": { + "description": "The ID of the object that already exists if this is a duplicate object error.", + "type": "string", + "x-go-name": "ExistsID" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + } + } + }, + "description": "" + } + }, + "tags": [ + "accounts" + ], + "x-codegen-request-body-name": "Body", + "x-moar-primitive-count": 17, + "x-moar-complexity-skipped": false + } + }, + "/accounts/search": { + "post": { + "description": "Currently, the following fields are filterable for accounts:\n\n* domains. Allowed operators: `contains`, `does_not_contain`, `in`, `not_in`\n\n* tags. Allowed operators: `contains`, `does_not_contain`, `in`, `not_in`\n\n* name. Allowed operators: `equals`, `in`, `not_in`\n\n* external_ids. Allowed operators: `equals`, `in`, `not_in`, `is_set`, `is_unset`\n\n* custom fields (pass in the slug of the custom field)", + "operationId": "SearchAccounts", + "requestBody": { + "content": { + "application/json": { + "schema": { + "properties": { + "cursor": { + "description": "The cursor to use for pagination.", + "type": "string", + "x-go-name": "Cursor" + }, + "filter": { + "properties": { + "field": { + "description": "The field for this filter. For allowed fields, see the documentation for\n\nthe specific endpoint you are using.\n\nFor non-compound filters (any operators other than \"and\" or \"or\"),\n\nField must be set, along with either Value or Values, depending on the operator.", + "type": "string", + "x-go-name": "Field" + }, + "operator": { + "description": "The operator for this filter.\n\n* equals FilterOperatorEquals Matches objects that are exactly equal to the value in the field.\n\n* not_equals FilterOperatorNotEquals Matches objects that are not exactly equal to the value in the field.\n\n* contains FilterOperatorContains For a multi-valued field, such as tags, this operator will match objects that contain any of the values in the field.\n\n* does_not_contain FilterOperatorDoesNotContain For a multi-valued field, such as tags, this operator will match objects that do not contain any of the values in the field.\n\n* in FilterOperatorIn Matches objects if the field is one of several possible values, as specified in the values array.\n\n* not_in FilterOperatorNotIn Matches objects if the field is none of several possible values, as specified in the values array.\n\n* and FilterOperatorAnd Matches objects only if all subfilters match.\n\n* or FilterOperatorOr Matches objects if any subfilter matches.\n\n* time_is_after FilterOperatorTimeIsAfter Matches objects if the field is after the given time.\n\n* time_is_before FilterOperatorTimeIsBefore Matches objects if the field is before the given time.\n\n* time_range FilterOperatorTimeRange Matches objects if the field is between the given times.\n\n* string_contains FilterOperatorStringContains Matches objects if the field contains the given string.\n\n* string_does_not_contain FilterOperatorStringDoesNotContain Matches objects if the field does not contain the given string.\n\n* is_set FilterOperatorIsSet FilterOperatorIsSet matches objects if the field is set.\n\n* is_unset FilterOperatorIsUnset FilterOperatorIsUnset matches objects if the field is unset.", + "enum": [ + "equals", + "not_equals", + "contains", + "does_not_contain", + "in", + "not_in", + "and", + "or", + "time_is_after", + "time_is_before", + "time_range", + "string_contains", + "string_does_not_contain", + "is_set", + "is_unset" + ], + "type": "string", + "x-go-enum-desc": "equals FilterOperatorEquals Matches objects that are exactly equal to the value in the field.\nnot_equals FilterOperatorNotEquals Matches objects that are not exactly equal to the value in the field.\ncontains FilterOperatorContains For a multi-valued field, such as tags, this operator will match objects that contain any of the values in the field.\ndoes_not_contain FilterOperatorDoesNotContain For a multi-valued field, such as tags, this operator will match objects that do not contain any of the values in the field.\nin FilterOperatorIn Matches objects if the field is one of several possible values, as specified in the values array.\nnot_in FilterOperatorNotIn Matches objects if the field is none of several possible values, as specified in the values array.\nand FilterOperatorAnd Matches objects only if all subfilters match.\nor FilterOperatorOr Matches objects if any subfilter matches.\ntime_is_after FilterOperatorTimeIsAfter Matches objects if the field is after the given time.\ntime_is_before FilterOperatorTimeIsBefore Matches objects if the field is before the given time.\ntime_range FilterOperatorTimeRange Matches objects if the field is between the given times.\nstring_contains FilterOperatorStringContains Matches objects if the field contains the given string.\nstring_does_not_contain FilterOperatorStringDoesNotContain Matches objects if the field does not contain the given string.\nis_set FilterOperatorIsSet FilterOperatorIsSet matches objects if the field is set.\nis_unset FilterOperatorIsUnset FilterOperatorIsUnset matches objects if the field is unset.", + "x-go-name": "Operator" + }, + "subfilters": { + "description": "Sub-filters for this filter. Valid only when operator is \"and\" or \"or\".\n\nThe maximum allowed depth for a tree of filters is 3.", + "items": { + "$ref": "#/components/schemas/Filter", + "has_circular_reference": true + }, + "type": "array", + "x-go-name": "Subfilters" + }, + "value": { + "description": "The value for this filter. Only used for single-valued operators\n\n(\"equals\", \"not_equals\", \"contains\", \"does_not_contain\")", + "type": "string", + "x-go-name": "Value" + }, + "values": { + "description": "The values for this filter. Only used for multi-valued operators (\"in\", \"not_in\").", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Values" + } + }, + "required": [ + "field", + "operator" + ], + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "limit": { + "description": "The number of accounts to fetch. Defaults to 100. Must be greater than 0 and less than 1000.", + "format": "int64", + "type": "integer", + "x-go-name": "Limit" + } + }, + "required": [ + "filter" + ], + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + } + } + }, + "required": false + }, + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "description": "The data payload of the response.", + "items": { + "properties": { + "channels": { + "description": "Channels associated with the account.", + "items": { + "properties": { + "channel_id": { + "description": "The ID of the channel. If this is a Microsoft Teams channel, the ID must be in the format of `{team_id}|{channel_id}`.", + "type": "string", + "x-go-name": "ChannelID" + }, + "is_primary": { + "description": "Whether this channel is the primary channel for the account.", + "type": "boolean", + "x-go-name": "IsPrimary" + }, + "mirror_to": { + "properties": { + "channel_id": { + "description": "The ID of the channel. If this is a Microsoft Teams channel, the ID must be in the format of `{team_id}|{channel_id}`.", + "type": "string", + "x-go-name": "ChannelID" + }, + "source": { + "description": "The source, which can be one of `[\"slack\", \"microsoft_teams\", \"discord\"]`.", + "type": "string", + "x-go-name": "Source" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "source": { + "description": "The source, which can be one of `[\"slack\", \"microsoft_teams\", \"discord\"]`.", + "type": "string", + "x-go-name": "Source" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "type": "array", + "x-go-name": "Channels" + }, + "created_at": { + "description": "The creation time of the account.", + "type": "string", + "x-go-name": "CreatedAt" + }, + "crm_settings": { + "properties": { + "details": { + "description": "List of all CRM details for the account.", + "items": { + "properties": { + "id": { + "description": "The ID of the CRM for that source.", + "type": "string", + "x-go-name": "ID" + }, + "source": { + "description": "The source of the CRM.", + "type": "string", + "x-go-name": "Source" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "type": "array", + "x-go-name": "Details" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "custom_fields": { + "additionalProperties": { + "properties": { + "slug": { + "description": "The slug of the custom field.", + "type": "string", + "x-go-name": "Slug" + }, + "value": { + "description": "The value of the custom field. Only to be used for single-valued custom fields. If unset, the custom field will be unset. If the custom field is a select field, the value must be the select option slug, which you can find from the GET /custom-fields endpoint.", + "type": "string", + "x-go-name": "Value" + }, + "values": { + "description": "The values of the custom field. Only to be used for multi-valued custom fields (ex. multiselect). If unset, the custom field will be unset. If the custom field is a multiselect field, the values must be the select option slugs which you can find from the GET /custom-fields endpoint.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Values" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "description": "Custom fields associated with the account.", + "type": "object", + "x-go-name": "CustomFields" + }, + "domain": { + "description": "The primary domain of the account.", + "type": "string", + "x-go-name": "Domain" + }, + "domains": { + "description": "The list of domains associated with the account.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Domains" + }, + "external_ids": { + "description": "External IDs associated with the account.", + "items": { + "properties": { + "external_id": { + "description": "The external ID. Must be unique per object type (ex. account).", + "type": "string", + "x-go-name": "ExternalID" + }, + "label": { + "description": "The label of the external ID. Must be unique per object.", + "type": "string", + "x-go-name": "Label" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "type": "array", + "x-go-name": "ExternalIDs" + }, + "id": { + "description": "The ID of the account.", + "type": "string", + "x-go-name": "ID" + }, + "latest_customer_activity_time": { + "description": "The time of the latest customer activity.", + "type": "string", + "x-go-name": "LatestCustomerActivityTime" + }, + "name": { + "description": "The name of the account.", + "type": "string", + "x-go-name": "Name" + }, + "owner": { + "properties": { + "email": { + "description": "The email of the user.", + "type": "string", + "x-go-name": "Email" + }, + "id": { + "description": "The ID of the user.", + "type": "string", + "x-go-name": "ID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "primary_domain": { + "description": "The primary domain of the account.", + "type": "string", + "x-go-name": "PrimaryDomain" + }, + "tags": { + "description": "Tags associated with the account.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Tags" + }, + "type": { + "description": "The type of the account.", + "type": "string", + "x-go-name": "Type" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "type": "array", + "x-go-name": "Data" + }, + "pagination": { + "properties": { + "cursor": { + "description": "The cursor for the next page of results.", + "type": "string", + "x-go-name": "Cursor" + }, + "has_next_page": { + "description": "Indicates if there is a next page of results.", + "type": "boolean", + "x-go-name": "HasNextPage" + } + }, + "required": [ + "cursor", + "has_next_page" + ], + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + } + } + }, + "description": "" + }, + "400": { + "content": { + "application/json": { + "schema": { + "properties": { + "errors": { + "description": "The list of errors.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Errors" + }, + "exists_id": { + "description": "The ID of the object that already exists if this is a duplicate object error.", + "type": "string", + "x-go-name": "ExistsID" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + } + } + }, + "description": "" + }, + "404": { + "content": { + "application/json": { + "schema": { + "properties": { + "errors": { + "description": "The list of errors.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Errors" + }, + "exists_id": { + "description": "The ID of the object that already exists if this is a duplicate object error.", + "type": "string", + "x-go-name": "ExistsID" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + } + } + }, + "description": "" + }, + "500": { + "content": { + "application/json": { + "schema": { + "properties": { + "errors": { + "description": "The list of errors.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Errors" + }, + "exists_id": { + "description": "The ID of the object that already exists if this is a duplicate object error.", + "type": "string", + "x-go-name": "ExistsID" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + } + } + }, + "description": "" + } + }, + "summary": "Search for accounts by a given filter", + "tags": [ + "accounts" + ], + "x-codegen-request-body-name": "Body", + "x-moar-primitive-count": 7, + "x-moar-complexity-skipped": false + } + }, + "/accounts/{account_id}/highlights": { + "post": { + "description": "The {account_id} parameter accepts either:\n\nInternal account ID (UUID format)\n\nExternal ID (any string format)", + "operationId": "CreateAccountHighlight", + "parameters": [ + { + "description": "The ID or external ID of the account that the highlight belongs to.", + "in": "path", + "name": "account_id", + "required": true, + "schema": { + "type": "string", + "x-go-name": "AccountID" + }, + "x-go-name": "AccountID" + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "properties": { + "content_html": { + "description": "The HTML content for this highlight.", + "type": "string", + "x-go-name": "ContentHTML" + }, + "expires_at": { + "description": "Optional RFC3339 timestamp of when this highlight will expire.", + "type": "string", + "x-go-name": "ExpiresAt" + } + }, + "required": [ + "content_html" + ], + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + } + } + }, + "required": false + }, + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "properties": { + "account_id": { + "description": "The ID of the account this highlight belongs to.", + "type": "string", + "x-go-name": "AccountID" + }, + "content_html": { + "description": "The HTML content of the highlight.", + "type": "string", + "x-go-name": "ContentHTML" + }, + "created_at": { + "description": "The timestamp of when the highlight was created.", + "type": "string", + "x-go-name": "CreatedAt" + }, + "expires_at": { + "description": "The timestamp of when the highlight expires, if set.", + "type": "string", + "x-go-name": "ExpiresAt" + }, + "id": { + "description": "The ID of the account highlight.", + "type": "string", + "x-go-name": "ID" + }, + "updated_at": { + "description": "The timestamp of when the highlight was last updated.", + "type": "string", + "x-go-name": "UpdatedAt" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "request_id": { + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + } + } + }, + "description": "" + }, + "400": { + "content": { + "application/json": { + "schema": { + "properties": { + "errors": { + "description": "The list of errors.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Errors" + }, + "exists_id": { + "description": "The ID of the object that already exists if this is a duplicate object error.", + "type": "string", + "x-go-name": "ExistsID" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + } + } + }, + "description": "" + }, + "404": { + "content": { + "application/json": { + "schema": { + "properties": { + "errors": { + "description": "The list of errors.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Errors" + }, + "exists_id": { + "description": "The ID of the object that already exists if this is a duplicate object error.", + "type": "string", + "x-go-name": "ExistsID" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + } + } + }, + "description": "" + }, + "500": { + "content": { + "application/json": { + "schema": { + "properties": { + "errors": { + "description": "The list of errors.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Errors" + }, + "exists_id": { + "description": "The ID of the object that already exists if this is a duplicate object error.", + "type": "string", + "x-go-name": "ExistsID" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + } + } + }, + "description": "" + } + }, + "summary": "Creates a new account highlight.", + "tags": [ + "account-highlights" + ], + "x-codegen-request-body-name": "Body", + "x-moar-primitive-count": 2, + "x-moar-complexity-skipped": false + } + }, + "/accounts/{account_id}/highlights/{highlight_id}": { + "delete": { + "description": "The {account_id} parameter accepts either:\n\nInternal account ID (UUID format)\n\nExternal ID (any string format)", + "operationId": "DeleteAccountHighlight", + "parameters": [ + { + "description": "The ID or external ID of the account that the highlight belongs to.", + "in": "path", + "name": "account_id", + "required": true, + "schema": { + "type": "string", + "x-go-name": "AccountID" + }, + "x-go-name": "AccountID" + }, + { + "description": "The ID of the highlight to delete.", + "in": "path", + "name": "highlight_id", + "required": true, + "schema": { + "type": "string", + "x-go-name": "HighlightID" + }, + "x-go-name": "HighlightID" + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "properties": { + "success": { + "type": "boolean", + "x-go-name": "Success" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + }, + "request_id": { + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + } + } + }, + "description": "", + "headers": { + "Body": { + "schema": { + "type": "object" + } + } + } + }, + "400": { + "content": { + "application/json": { + "schema": { + "properties": { + "errors": { + "description": "The list of errors.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Errors" + }, + "exists_id": { + "description": "The ID of the object that already exists if this is a duplicate object error.", + "type": "string", + "x-go-name": "ExistsID" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + } + } + }, + "description": "" + }, + "404": { + "content": { + "application/json": { + "schema": { + "properties": { + "errors": { + "description": "The list of errors.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Errors" + }, + "exists_id": { + "description": "The ID of the object that already exists if this is a duplicate object error.", + "type": "string", + "x-go-name": "ExistsID" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + } + } + }, + "description": "" + }, + "500": { + "content": { + "application/json": { + "schema": { + "properties": { + "errors": { + "description": "The list of errors.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Errors" + }, + "exists_id": { + "description": "The ID of the object that already exists if this is a duplicate object error.", + "type": "string", + "x-go-name": "ExistsID" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + } + } + }, + "description": "" + } + }, + "summary": "Deletes an account highlight.", + "tags": [ + "account-highlights" + ], + "x-moar-primitive-count": 0, + "x-moar-complexity-skipped": false + }, + "patch": { + "description": "The {account_id} parameter accepts either:\n\nInternal account ID (UUID format)\n\nExternal ID (any string format)", + "operationId": "UpdateAccountHighlight", + "parameters": [ + { + "description": "The ID of the highlight to update.", + "in": "path", + "name": "highlight_id", + "required": true, + "schema": { + "type": "string", + "x-go-name": "HighlightID" + }, + "x-go-name": "HighlightID" + }, + { + "description": "The ID or external ID of the account that the highlight belongs to.", + "in": "path", + "name": "account_id", + "required": true, + "schema": { + "type": "string", + "x-go-name": "AccountID" + }, + "x-go-name": "AccountID" + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "properties": { + "content_html": { + "description": "The updated HTML content for this highlight.", + "type": "string", + "x-go-name": "ContentHTML" + }, + "expires_at": { + "description": "The updated expires at timestamp (RFC3339).", + "type": "string", + "x-go-name": "ExpiresAt" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + } + } + }, + "required": false + }, + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "properties": { + "account_id": { + "description": "The ID of the account this highlight belongs to.", + "type": "string", + "x-go-name": "AccountID" + }, + "content_html": { + "description": "The HTML content of the highlight.", + "type": "string", + "x-go-name": "ContentHTML" + }, + "created_at": { + "description": "The timestamp of when the highlight was created.", + "type": "string", + "x-go-name": "CreatedAt" + }, + "expires_at": { + "description": "The timestamp of when the highlight expires, if set.", + "type": "string", + "x-go-name": "ExpiresAt" + }, + "id": { + "description": "The ID of the account highlight.", + "type": "string", + "x-go-name": "ID" + }, + "updated_at": { + "description": "The timestamp of when the highlight was last updated.", + "type": "string", + "x-go-name": "UpdatedAt" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "request_id": { + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + } + } + }, + "description": "" + }, + "400": { + "content": { + "application/json": { + "schema": { + "properties": { + "errors": { + "description": "The list of errors.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Errors" + }, + "exists_id": { + "description": "The ID of the object that already exists if this is a duplicate object error.", + "type": "string", + "x-go-name": "ExistsID" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + } + } + }, + "description": "" + }, + "404": { + "content": { + "application/json": { + "schema": { + "properties": { + "errors": { + "description": "The list of errors.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Errors" + }, + "exists_id": { + "description": "The ID of the object that already exists if this is a duplicate object error.", + "type": "string", + "x-go-name": "ExistsID" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + } + } + }, + "description": "" + }, + "500": { + "content": { + "application/json": { + "schema": { + "properties": { + "errors": { + "description": "The list of errors.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Errors" + }, + "exists_id": { + "description": "The ID of the object that already exists if this is a duplicate object error.", + "type": "string", + "x-go-name": "ExistsID" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + } + } + }, + "description": "" + } + }, + "summary": "Updates an account highlight.", + "tags": [ + "account-highlights" + ], + "x-codegen-request-body-name": "Body", + "x-moar-primitive-count": 2, + "x-moar-complexity-skipped": false + } + }, + "/accounts/{id}": { + "delete": { + "description": "Delete an existing account", + "operationId": "DeleteAccount", + "parameters": [ + { + "description": "The ID or external ID of the account to delete.", + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string", + "x-go-name": "ID" + }, + "x-go-name": "ID" + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "properties": { + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + } + } + }, + "description": "" + } + }, + "tags": [ + "accounts" + ], + "x-moar-primitive-count": 0, + "x-moar-complexity-skipped": false + }, + "get": { + "description": "Get an account by its ID or external ID", + "operationId": "GetAccount", + "parameters": [ + { + "description": "The ID or external ID of the account to fetch.", + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string", + "x-go-name": "ID" + }, + "x-go-name": "ID" + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "properties": { + "channels": { + "description": "Channels associated with the account.", + "items": { + "properties": { + "channel_id": { + "description": "The ID of the channel. If this is a Microsoft Teams channel, the ID must be in the format of `{team_id}|{channel_id}`.", + "type": "string", + "x-go-name": "ChannelID" + }, + "is_primary": { + "description": "Whether this channel is the primary channel for the account.", + "type": "boolean", + "x-go-name": "IsPrimary" + }, + "mirror_to": { + "properties": { + "channel_id": { + "description": "The ID of the channel. If this is a Microsoft Teams channel, the ID must be in the format of `{team_id}|{channel_id}`.", + "type": "string", + "x-go-name": "ChannelID" + }, + "source": { + "description": "The source, which can be one of `[\"slack\", \"microsoft_teams\", \"discord\"]`.", + "type": "string", + "x-go-name": "Source" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "source": { + "description": "The source, which can be one of `[\"slack\", \"microsoft_teams\", \"discord\"]`.", + "type": "string", + "x-go-name": "Source" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "type": "array", + "x-go-name": "Channels" + }, + "created_at": { + "description": "The creation time of the account.", + "type": "string", + "x-go-name": "CreatedAt" + }, + "crm_settings": { + "properties": { + "details": { + "description": "List of all CRM details for the account.", + "items": { + "properties": { + "id": { + "description": "The ID of the CRM for that source.", + "type": "string", + "x-go-name": "ID" + }, + "source": { + "description": "The source of the CRM.", + "type": "string", + "x-go-name": "Source" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "type": "array", + "x-go-name": "Details" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "custom_fields": { + "additionalProperties": { + "properties": { + "slug": { + "description": "The slug of the custom field.", + "type": "string", + "x-go-name": "Slug" + }, + "value": { + "description": "The value of the custom field. Only to be used for single-valued custom fields. If unset, the custom field will be unset. If the custom field is a select field, the value must be the select option slug, which you can find from the GET /custom-fields endpoint.", + "type": "string", + "x-go-name": "Value" + }, + "values": { + "description": "The values of the custom field. Only to be used for multi-valued custom fields (ex. multiselect). If unset, the custom field will be unset. If the custom field is a multiselect field, the values must be the select option slugs which you can find from the GET /custom-fields endpoint.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Values" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "description": "Custom fields associated with the account.", + "type": "object", + "x-go-name": "CustomFields" + }, + "domain": { + "description": "The primary domain of the account.", + "type": "string", + "x-go-name": "Domain" + }, + "domains": { + "description": "The list of domains associated with the account.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Domains" + }, + "external_ids": { + "description": "External IDs associated with the account.", + "items": { + "properties": { + "external_id": { + "description": "The external ID. Must be unique per object type (ex. account).", + "type": "string", + "x-go-name": "ExternalID" + }, + "label": { + "description": "The label of the external ID. Must be unique per object.", + "type": "string", + "x-go-name": "Label" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "type": "array", + "x-go-name": "ExternalIDs" + }, + "id": { + "description": "The ID of the account.", + "type": "string", + "x-go-name": "ID" + }, + "latest_customer_activity_time": { + "description": "The time of the latest customer activity.", + "type": "string", + "x-go-name": "LatestCustomerActivityTime" + }, + "name": { + "description": "The name of the account.", + "type": "string", + "x-go-name": "Name" + }, + "owner": { + "properties": { + "email": { + "description": "The email of the user.", + "type": "string", + "x-go-name": "Email" + }, + "id": { + "description": "The ID of the user.", + "type": "string", + "x-go-name": "ID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "primary_domain": { + "description": "The primary domain of the account.", + "type": "string", + "x-go-name": "PrimaryDomain" + }, + "tags": { + "description": "Tags associated with the account.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Tags" + }, + "type": { + "description": "The type of the account.", + "type": "string", + "x-go-name": "Type" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + } + } + }, + "description": "" + }, + "400": { + "content": { + "application/json": { + "schema": { + "properties": { + "errors": { + "description": "The list of errors.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Errors" + }, + "exists_id": { + "description": "The ID of the object that already exists if this is a duplicate object error.", + "type": "string", + "x-go-name": "ExistsID" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + } + } + }, + "description": "" + }, + "404": { + "content": { + "application/json": { + "schema": { + "properties": { + "errors": { + "description": "The list of errors.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Errors" + }, + "exists_id": { + "description": "The ID of the object that already exists if this is a duplicate object error.", + "type": "string", + "x-go-name": "ExistsID" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + } + } + }, + "description": "" + }, + "500": { + "content": { + "application/json": { + "schema": { + "properties": { + "errors": { + "description": "The list of errors.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Errors" + }, + "exists_id": { + "description": "The ID of the object that already exists if this is a duplicate object error.", + "type": "string", + "x-go-name": "ExistsID" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + } + } + }, + "description": "" + } + }, + "tags": [ + "accounts" + ], + "x-moar-primitive-count": 0, + "x-moar-complexity-skipped": false + }, + "patch": { + "description": "Update an existing account", + "operationId": "UpdateAccount", + "parameters": [ + { + "description": "The ID or external ID of the account to update.", + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string", + "x-go-name": "ID" + }, + "x-go-name": "ID" + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "properties": { + "channels": { + "description": "An array of channels to be linked to this account.", + "items": { + "properties": { + "channel_id": { + "description": "The ID of the channel. If this is a Microsoft Teams channel, the ID must be in the format of `{team_id}|{channel_id}`.", + "type": "string", + "x-go-name": "ChannelID" + }, + "is_primary": { + "description": "Whether this channel is the primary channel for the account.", + "type": "boolean", + "x-go-name": "IsPrimary" + }, + "mirror_to": { + "properties": { + "channel_id": { + "description": "The ID of the channel. If this is a Microsoft Teams channel, the ID must be in the format of `{team_id}|{channel_id}`.", + "type": "string", + "x-go-name": "ChannelID" + }, + "source": { + "description": "The source, which can be one of `[\"slack\", \"microsoft_teams\", \"discord\"]`.", + "type": "string", + "x-go-name": "Source" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "source": { + "description": "The source, which can be one of `[\"slack\", \"microsoft_teams\", \"discord\"]`.", + "type": "string", + "x-go-name": "Source" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "type": "array", + "x-go-name": "Channels" + }, + "custom_fields": { + "description": "An array of custom fields to be used on this account.", + "items": { + "properties": { + "slug": { + "description": "The slug of the custom field.", + "type": "string", + "x-go-name": "Slug" + }, + "value": { + "description": "The value of the custom field. Only to be used for single-valued custom fields. If unset, the custom field will be unset. If the custom field is a select field, the value must be the select option slug, which you can find from the GET /custom-fields endpoint.", + "type": "string", + "x-go-name": "Value" + }, + "values": { + "description": "The values of the custom field. Only to be used for multi-valued custom fields (ex. multiselect). If unset, the custom field will be unset. If the custom field is a multiselect field, the values must be the select option slugs which you can find from the GET /custom-fields endpoint.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Values" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "type": "array", + "x-go-name": "CustomFields" + }, + "domains": { + "description": "Domains of the account. Must specify one domain as primary.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Domains" + }, + "external_ids": { + "description": "An array of external IDs to be used on this account. If provided, the accounts external IDs will be updated to the given external IDs.", + "items": { + "properties": { + "external_id": { + "description": "The external ID. Must be unique per object type (ex. account).", + "type": "string", + "x-go-name": "ExternalID" + }, + "label": { + "description": "The label of the external ID. Must be unique per object.", + "type": "string", + "x-go-name": "Label" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "type": "array", + "x-go-name": "ExternalIDs" + }, + "logo_url": { + "description": "Logo URL of the account.", + "type": "string", + "x-go-name": "LogoURL" + }, + "name": { + "description": "The name of the account.", + "type": "string", + "x-go-name": "Name" + }, + "owner_id": { + "description": "The ID of the owner of the account.", + "type": "string", + "x-go-name": "OwnerID" + }, + "primary_domain": { + "description": "Must be in the list of domains. If there are any domains, there must be exactly one primary domain.", + "type": "string", + "x-go-name": "PrimaryDomain" + }, + "tags": { + "description": "An array of strings to use as tags on this account. If provided, the accounts tags will be updated to the given tags.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Tags" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + } + } + }, + "required": false + }, + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "properties": { + "channels": { + "description": "Channels associated with the account.", + "items": { + "properties": { + "channel_id": { + "description": "The ID of the channel. If this is a Microsoft Teams channel, the ID must be in the format of `{team_id}|{channel_id}`.", + "type": "string", + "x-go-name": "ChannelID" + }, + "is_primary": { + "description": "Whether this channel is the primary channel for the account.", + "type": "boolean", + "x-go-name": "IsPrimary" + }, + "mirror_to": { + "properties": { + "channel_id": { + "description": "The ID of the channel. If this is a Microsoft Teams channel, the ID must be in the format of `{team_id}|{channel_id}`.", + "type": "string", + "x-go-name": "ChannelID" + }, + "source": { + "description": "The source, which can be one of `[\"slack\", \"microsoft_teams\", \"discord\"]`.", + "type": "string", + "x-go-name": "Source" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "source": { + "description": "The source, which can be one of `[\"slack\", \"microsoft_teams\", \"discord\"]`.", + "type": "string", + "x-go-name": "Source" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "type": "array", + "x-go-name": "Channels" + }, + "created_at": { + "description": "The creation time of the account.", + "type": "string", + "x-go-name": "CreatedAt" + }, + "crm_settings": { + "properties": { + "details": { + "description": "List of all CRM details for the account.", + "items": { + "properties": { + "id": { + "description": "The ID of the CRM for that source.", + "type": "string", + "x-go-name": "ID" + }, + "source": { + "description": "The source of the CRM.", + "type": "string", + "x-go-name": "Source" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "type": "array", + "x-go-name": "Details" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "custom_fields": { + "additionalProperties": { + "properties": { + "slug": { + "description": "The slug of the custom field.", + "type": "string", + "x-go-name": "Slug" + }, + "value": { + "description": "The value of the custom field. Only to be used for single-valued custom fields. If unset, the custom field will be unset. If the custom field is a select field, the value must be the select option slug, which you can find from the GET /custom-fields endpoint.", + "type": "string", + "x-go-name": "Value" + }, + "values": { + "description": "The values of the custom field. Only to be used for multi-valued custom fields (ex. multiselect). If unset, the custom field will be unset. If the custom field is a multiselect field, the values must be the select option slugs which you can find from the GET /custom-fields endpoint.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Values" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "description": "Custom fields associated with the account.", + "type": "object", + "x-go-name": "CustomFields" + }, + "domain": { + "description": "The primary domain of the account.", + "type": "string", + "x-go-name": "Domain" + }, + "domains": { + "description": "The list of domains associated with the account.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Domains" + }, + "external_ids": { + "description": "External IDs associated with the account.", + "items": { + "properties": { + "external_id": { + "description": "The external ID. Must be unique per object type (ex. account).", + "type": "string", + "x-go-name": "ExternalID" + }, + "label": { + "description": "The label of the external ID. Must be unique per object.", + "type": "string", + "x-go-name": "Label" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "type": "array", + "x-go-name": "ExternalIDs" + }, + "id": { + "description": "The ID of the account.", + "type": "string", + "x-go-name": "ID" + }, + "latest_customer_activity_time": { + "description": "The time of the latest customer activity.", + "type": "string", + "x-go-name": "LatestCustomerActivityTime" + }, + "name": { + "description": "The name of the account.", + "type": "string", + "x-go-name": "Name" + }, + "owner": { + "properties": { + "email": { + "description": "The email of the user.", + "type": "string", + "x-go-name": "Email" + }, + "id": { + "description": "The ID of the user.", + "type": "string", + "x-go-name": "ID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "primary_domain": { + "description": "The primary domain of the account.", + "type": "string", + "x-go-name": "PrimaryDomain" + }, + "tags": { + "description": "Tags associated with the account.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Tags" + }, + "type": { + "description": "The type of the account.", + "type": "string", + "x-go-name": "Type" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + } + } + }, + "description": "" + }, + "400": { + "content": { + "application/json": { + "schema": { + "properties": { + "errors": { + "description": "The list of errors.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Errors" + }, + "exists_id": { + "description": "The ID of the object that already exists if this is a duplicate object error.", + "type": "string", + "x-go-name": "ExistsID" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + } + } + }, + "description": "" + }, + "404": { + "content": { + "application/json": { + "schema": { + "properties": { + "errors": { + "description": "The list of errors.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Errors" + }, + "exists_id": { + "description": "The ID of the object that already exists if this is a duplicate object error.", + "type": "string", + "x-go-name": "ExistsID" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + } + } + }, + "description": "" + }, + "500": { + "content": { + "application/json": { + "schema": { + "properties": { + "errors": { + "description": "The list of errors.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Errors" + }, + "exists_id": { + "description": "The ID of the object that already exists if this is a duplicate object error.", + "type": "string", + "x-go-name": "ExistsID" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + } + } + }, + "description": "" + } + }, + "tags": [ + "accounts" + ], + "x-codegen-request-body-name": "Body", + "x-moar-primitive-count": 16, + "x-moar-complexity-skipped": false + } + }, + "/accounts/{id}/activities": { + "post": { + "description": "Create a new activity for an account\n\nThe {id} parameter accepts either:\n\nInternal account ID (UUID format)\n\nExternal ID (any string format)", + "operationId": "CreateActivity", + "parameters": [ + { + "description": "The ID or external ID of the account to create the activity for.", + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string", + "x-go-name": "ID" + }, + "x-go-name": "ID" + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "properties": { + "body_html": { + "description": "Optional HTML content to display in the activity.", + "type": "string", + "x-go-name": "BodyHTML" + }, + "contact_id": { + "description": "Optional contact ID of the actor of the activity.", + "type": "string", + "x-go-name": "ContactID" + }, + "happened_at": { + "description": "Timestamp (RFC3339) of when the activity happened. Defaults to the current time if empty.", + "type": "string", + "x-go-name": "HappenedAt" + }, + "link": { + "description": "Optional link to add to the activity.", + "type": "string", + "x-go-name": "Link" + }, + "link_text": { + "description": "Optional link text to display on the activity. Defaults to \"Open link\" if not provided. Applies only if a link is provided.", + "type": "string", + "x-go-name": "LinkText" + }, + "slug": { + "description": "The slug of the activity to create.", + "type": "string", + "x-go-name": "Slug" + }, + "user_id": { + "description": "Optional user ID of the actor of the activity.", + "type": "string", + "x-go-name": "UserID" + } + }, + "required": [ + "slug" + ], + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + } + } + }, + "required": false + }, + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "properties": { + "success": { + "type": "boolean", + "x-go-name": "Success" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + }, + "request_id": { + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + } + } + }, + "description": "" + }, + "400": { + "content": { + "application/json": { + "schema": { + "properties": { + "errors": { + "description": "The list of errors.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Errors" + }, + "exists_id": { + "description": "The ID of the object that already exists if this is a duplicate object error.", + "type": "string", + "x-go-name": "ExistsID" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + } + } + }, + "description": "" + }, + "404": { + "content": { + "application/json": { + "schema": { + "properties": { + "errors": { + "description": "The list of errors.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Errors" + }, + "exists_id": { + "description": "The ID of the object that already exists if this is a duplicate object error.", + "type": "string", + "x-go-name": "ExistsID" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + } + } + }, + "description": "" + }, + "500": { + "content": { + "application/json": { + "schema": { + "properties": { + "errors": { + "description": "The list of errors.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Errors" + }, + "exists_id": { + "description": "The ID of the object that already exists if this is a duplicate object error.", + "type": "string", + "x-go-name": "ExistsID" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + } + } + }, + "description": "" + } + }, + "tags": [ + "accounts" + ], + "x-codegen-request-body-name": "Body", + "x-moar-primitive-count": 7, + "x-moar-complexity-skipped": false + } + }, + "/accounts/{id}/files": { + "post": { + "description": "Upload files to an account", + "operationId": "UploadAccountFile", + "parameters": [ + { + "description": "The ID or external ID of the account to upload files to.", + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string", + "x-go-name": "ID" + }, + "x-go-name": "ID" + } + ], + "requestBody": { + "content": { + "multipart/form-data": { + "schema": { + "properties": { + "file": { + "description": "The file to upload.", + "format": "binary", + "type": "string", + "x-go-name": "File" + }, + "file_url": { + "description": "The URL to fetch the file from, if the file is not provided.", + "type": "string", + "x-go-name": "FileURL" + } + }, + "type": "object" + } + } + } + }, + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "description": "The data payload of the response.", + "items": { + "properties": { + "description": { + "description": "The description of the attachment.", + "type": "string", + "x-go-name": "Description" + }, + "id": { + "description": "The ID of the attachment.", + "type": "string", + "x-go-name": "ID" + }, + "name": { + "description": "The name of the attachment.", + "type": "string", + "x-go-name": "Name" + }, + "url": { + "description": "The URL of the attachment.", + "type": "string", + "x-go-name": "URL" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "type": "array", + "x-go-name": "Data" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + } + } + }, + "description": "" + }, + "400": { + "content": { + "application/json": { + "schema": { + "properties": { + "errors": { + "description": "The list of errors.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Errors" + }, + "exists_id": { + "description": "The ID of the object that already exists if this is a duplicate object error.", + "type": "string", + "x-go-name": "ExistsID" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + } + } + }, + "description": "" + }, + "404": { + "content": { + "application/json": { + "schema": { + "properties": { + "errors": { + "description": "The list of errors.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Errors" + }, + "exists_id": { + "description": "The ID of the object that already exists if this is a duplicate object error.", + "type": "string", + "x-go-name": "ExistsID" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + } + } + }, + "description": "" + }, + "500": { + "content": { + "application/json": { + "schema": { + "properties": { + "errors": { + "description": "The list of errors.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Errors" + }, + "exists_id": { + "description": "The ID of the object that already exists if this is a duplicate object error.", + "type": "string", + "x-go-name": "ExistsID" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + } + } + }, + "description": "" + } + }, + "tags": [ + "accounts" + ], + "x-moar-primitive-count": 2, + "x-moar-complexity-skipped": false + } + }, + "/activity-types": { + "get": { + "description": "Get custom activity types", + "operationId": "GetActivityTypes", + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "description": "The data payload of the response.", + "items": { + "properties": { + "icon_url": { + "description": "The icon url of the activity type.", + "type": "string", + "x-go-name": "IconURL" + }, + "id": { + "description": "The ID of the activity type.", + "type": "string", + "x-go-name": "ID" + }, + "label": { + "description": "The label of the activity type.", + "type": "string", + "x-go-name": "Label" + }, + "slug": { + "description": "The slug of the activity type.", + "type": "string", + "x-go-name": "Slug" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "type": "array", + "x-go-name": "Data" + }, + "pagination": { + "properties": { + "cursor": { + "description": "The cursor for the next page of results.", + "type": "string", + "x-go-name": "Cursor" + }, + "has_next_page": { + "description": "Indicates if there is a next page of results.", + "type": "boolean", + "x-go-name": "HasNextPage" + } + }, + "required": [ + "cursor", + "has_next_page" + ], + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + } + } + }, + "description": "" + }, + "400": { + "content": { + "application/json": { + "schema": { + "properties": { + "errors": { + "description": "The list of errors.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Errors" + }, + "exists_id": { + "description": "The ID of the object that already exists if this is a duplicate object error.", + "type": "string", + "x-go-name": "ExistsID" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + } + } + }, + "description": "" + }, + "404": { + "content": { + "application/json": { + "schema": { + "properties": { + "errors": { + "description": "The list of errors.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Errors" + }, + "exists_id": { + "description": "The ID of the object that already exists if this is a duplicate object error.", + "type": "string", + "x-go-name": "ExistsID" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + } + } + }, + "description": "" + }, + "500": { + "content": { + "application/json": { + "schema": { + "properties": { + "errors": { + "description": "The list of errors.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Errors" + }, + "exists_id": { + "description": "The ID of the object that already exists if this is a duplicate object error.", + "type": "string", + "x-go-name": "ExistsID" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + } + } + }, + "description": "" + } + }, + "tags": [ + "activity-types" + ], + "x-moar-primitive-count": 0, + "x-moar-complexity-skipped": false + } + }, + "/attachments": { + "post": { + "description": "Create an attachment", + "operationId": "CreateAttachment", + "requestBody": { + "content": { + "multipart/form-data": { + "schema": { + "properties": { + "description": { + "description": "The description of the file.", + "type": "string", + "x-go-name": "Description" + }, + "file": { + "description": "The file to upload.", + "format": "binary", + "type": "string", + "x-go-name": "File" + }, + "file_url": { + "description": "The URL to fetch the file from, if the file is not provided.", + "type": "string", + "x-go-name": "FileURL" + } + }, + "type": "object" + } + } + } + }, + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "properties": { + "description": { + "description": "The description of the attachment.", + "type": "string", + "x-go-name": "Description" + }, + "id": { + "description": "The ID of the attachment.", + "type": "string", + "x-go-name": "ID" + }, + "name": { + "description": "The name of the attachment.", + "type": "string", + "x-go-name": "Name" + }, + "url": { + "description": "The URL of the attachment.", + "type": "string", + "x-go-name": "URL" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + } + } + }, + "description": "" + }, + "400": { + "content": { + "application/json": { + "schema": { + "properties": { + "errors": { + "description": "The list of errors.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Errors" + }, + "exists_id": { + "description": "The ID of the object that already exists if this is a duplicate object error.", + "type": "string", + "x-go-name": "ExistsID" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + } + } + }, + "description": "" + }, + "500": { + "content": { + "application/json": { + "schema": { + "properties": { + "errors": { + "description": "The list of errors.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Errors" + }, + "exists_id": { + "description": "The ID of the object that already exists if this is a duplicate object error.", + "type": "string", + "x-go-name": "ExistsID" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + } + } + }, + "description": "" + } + }, + "tags": [ + "attachments" + ], + "x-moar-primitive-count": 3, + "x-moar-complexity-skipped": false + } + }, + "/contacts": { + "get": { + "description": "Get all contacts", + "operationId": "GetContacts", + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "description": "The data payload of the response.", + "items": { + "properties": { + "account": { + "properties": { + "id": { + "description": "The ID of the account.", + "type": "string", + "x-go-name": "ID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "avatar_url": { + "description": "Avatar URL of the contact.", + "type": "string", + "x-go-name": "AvatarURL" + }, + "custom_fields": { + "additionalProperties": { + "properties": { + "slug": { + "description": "The slug of the custom field.", + "type": "string", + "x-go-name": "Slug" + }, + "value": { + "description": "The value of the custom field. Only to be used for single-valued custom fields. If unset, the custom field will be unset. If the custom field is a select field, the value must be the select option slug, which you can find from the GET /custom-fields endpoint.", + "type": "string", + "x-go-name": "Value" + }, + "values": { + "description": "The values of the custom field. Only to be used for multi-valued custom fields (ex. multiselect). If unset, the custom field will be unset. If the custom field is a multiselect field, the values must be the select option slugs which you can find from the GET /custom-fields endpoint.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Values" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "description": "Custom field values associated with the issue.", + "type": "object", + "x-go-name": "CustomFields" + }, + "email": { + "description": "The primary email of the contact, if it exists.", + "type": "string", + "x-go-name": "Email" + }, + "emails": { + "description": "The list of all emails of the contact.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Emails" + }, + "id": { + "description": "The ID of the contact.", + "type": "string", + "x-go-name": "ID" + }, + "name": { + "description": "The name of the contact.", + "type": "string", + "x-go-name": "Name" + }, + "portal_role": { + "description": "Portal role assigned to the contact.\n\n* no_access PortalRoleNoAccess\n\n* member PortalRoleMember\n\n* admin PortalRoleAdmin", + "enum": [ + "no_access", + "member", + "admin" + ], + "type": "string", + "x-go-enum-desc": "no_access PortalRoleNoAccess\nmember PortalRoleMember\nadmin PortalRoleAdmin", + "x-go-name": "PortalRole" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "type": "array", + "x-go-name": "Data" + }, + "pagination": { + "properties": { + "cursor": { + "description": "The cursor for the next page of results.", + "type": "string", + "x-go-name": "Cursor" + }, + "has_next_page": { + "description": "Indicates if there is a next page of results.", + "type": "boolean", + "x-go-name": "HasNextPage" + } + }, + "required": [ + "cursor", + "has_next_page" + ], + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + } + } + }, + "description": "" + }, + "400": { + "content": { + "application/json": { + "schema": { + "properties": { + "errors": { + "description": "The list of errors.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Errors" + }, + "exists_id": { + "description": "The ID of the object that already exists if this is a duplicate object error.", + "type": "string", + "x-go-name": "ExistsID" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + } + } + }, + "description": "" + }, + "404": { + "content": { + "application/json": { + "schema": { + "properties": { + "errors": { + "description": "The list of errors.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Errors" + }, + "exists_id": { + "description": "The ID of the object that already exists if this is a duplicate object error.", + "type": "string", + "x-go-name": "ExistsID" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + } + } + }, + "description": "" + }, + "500": { + "content": { + "application/json": { + "schema": { + "properties": { + "errors": { + "description": "The list of errors.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Errors" + }, + "exists_id": { + "description": "The ID of the object that already exists if this is a duplicate object error.", + "type": "string", + "x-go-name": "ExistsID" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + } + } + }, + "description": "" + } + }, + "tags": [ + "contacts" + ], + "x-moar-primitive-count": 0, + "x-moar-complexity-skipped": false + }, + "post": { + "description": "Create a new contact", + "operationId": "CreateContact", + "requestBody": { + "content": { + "application/json": { + "schema": { + "properties": { + "account_external_id": { + "description": "The external ID of the account that this contact belongs to. Cannot be used together with account_id.", + "type": "string", + "x-go-name": "AccountExternalID" + }, + "account_id": { + "description": "The account that this contact belongs to.", + "type": "string", + "x-go-name": "AccountID" + }, + "avatar_url": { + "description": "The avatar URL of the contact. Must be a square .png, .jpg or .jpeg.", + "type": "string", + "x-go-name": "AvatarUrl" + }, + "custom_fields": { + "description": "An array of custom fields to be applied to this contact.", + "items": { + "properties": { + "slug": { + "description": "The slug of the custom field.", + "type": "string", + "x-go-name": "Slug" + }, + "value": { + "description": "The value of the custom field. Only to be used for single-valued custom fields. If unset, the custom field will be unset. If the custom field is a select field, the value must be the select option slug, which you can find from the GET /custom-fields endpoint.", + "type": "string", + "x-go-name": "Value" + }, + "values": { + "description": "The values of the custom field. Only to be used for multi-valued custom fields (ex. multiselect). If unset, the custom field will be unset. If the custom field is a multiselect field, the values must be the select option slugs which you can find from the GET /custom-fields endpoint.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Values" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "type": "array", + "x-go-name": "CustomFields" + }, + "email": { + "description": "The email of the contact.", + "type": "string", + "x-go-name": "Email" + }, + "name": { + "description": "The name of the contact.", + "type": "string", + "x-go-name": "Name" + }, + "portal_role": { + "description": "The portal role to assign to the contact. If not provided uses the default portal role from the portal settings.\n\n* no_access PortalRoleNoAccess\n\n* member PortalRoleMember\n\n* admin PortalRoleAdmin", + "enum": [ + "no_access", + "member", + "admin" + ], + "type": "string", + "x-go-enum-desc": "no_access PortalRoleNoAccess\nmember PortalRoleMember\nadmin PortalRoleAdmin", + "x-go-name": "PortalRole" + } + }, + "required": [ + "name" + ], + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + } + } + }, + "required": false + }, + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "properties": { + "account": { + "properties": { + "id": { + "description": "The ID of the account.", + "type": "string", + "x-go-name": "ID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "avatar_url": { + "description": "Avatar URL of the contact.", + "type": "string", + "x-go-name": "AvatarURL" + }, + "custom_fields": { + "additionalProperties": { + "properties": { + "slug": { + "description": "The slug of the custom field.", + "type": "string", + "x-go-name": "Slug" + }, + "value": { + "description": "The value of the custom field. Only to be used for single-valued custom fields. If unset, the custom field will be unset. If the custom field is a select field, the value must be the select option slug, which you can find from the GET /custom-fields endpoint.", + "type": "string", + "x-go-name": "Value" + }, + "values": { + "description": "The values of the custom field. Only to be used for multi-valued custom fields (ex. multiselect). If unset, the custom field will be unset. If the custom field is a multiselect field, the values must be the select option slugs which you can find from the GET /custom-fields endpoint.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Values" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "description": "Custom field values associated with the issue.", + "type": "object", + "x-go-name": "CustomFields" + }, + "email": { + "description": "The primary email of the contact, if it exists.", + "type": "string", + "x-go-name": "Email" + }, + "emails": { + "description": "The list of all emails of the contact.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Emails" + }, + "id": { + "description": "The ID of the contact.", + "type": "string", + "x-go-name": "ID" + }, + "name": { + "description": "The name of the contact.", + "type": "string", + "x-go-name": "Name" + }, + "portal_role": { + "description": "Portal role assigned to the contact.\n\n* no_access PortalRoleNoAccess\n\n* member PortalRoleMember\n\n* admin PortalRoleAdmin", + "enum": [ + "no_access", + "member", + "admin" + ], + "type": "string", + "x-go-enum-desc": "no_access PortalRoleNoAccess\nmember PortalRoleMember\nadmin PortalRoleAdmin", + "x-go-name": "PortalRole" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + } + } + }, + "description": "" + }, + "400": { + "content": { + "application/json": { + "schema": { + "properties": { + "errors": { + "description": "The list of errors.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Errors" + }, + "exists_id": { + "description": "The ID of the object that already exists if this is a duplicate object error.", + "type": "string", + "x-go-name": "ExistsID" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + } + } + }, + "description": "" + }, + "404": { + "content": { + "application/json": { + "schema": { + "properties": { + "errors": { + "description": "The list of errors.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Errors" + }, + "exists_id": { + "description": "The ID of the object that already exists if this is a duplicate object error.", + "type": "string", + "x-go-name": "ExistsID" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + } + } + }, + "description": "" + }, + "500": { + "content": { + "application/json": { + "schema": { + "properties": { + "errors": { + "description": "The list of errors.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Errors" + }, + "exists_id": { + "description": "The ID of the object that already exists if this is a duplicate object error.", + "type": "string", + "x-go-name": "ExistsID" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + } + } + }, + "description": "" + } + }, + "tags": [ + "contacts" + ], + "x-codegen-request-body-name": "Body", + "x-moar-primitive-count": 9, + "x-moar-complexity-skipped": false + } + }, + "/contacts/search": { + "post": { + "description": "Currently, the following fields are filterable for contacts:\n\n* id. Allowed operators: `equals`, `in`, `not_in`\n\n* email. Allowed operators: `equals`, `in`, `not_in`, `string_contains`\n\n* custom fields (pass in the slug of the custom field)\n\n* account_id. Allowed operators: `equals`, `in`, `not_in`", + "operationId": "SearchContacts", + "requestBody": { + "content": { + "application/json": { + "schema": { + "properties": { + "cursor": { + "description": "The cursor to use for pagination.", + "type": "string", + "x-go-name": "Cursor" + }, + "filter": { + "properties": { + "field": { + "description": "The field for this filter. For allowed fields, see the documentation for\n\nthe specific endpoint you are using.\n\nFor non-compound filters (any operators other than \"and\" or \"or\"),\n\nField must be set, along with either Value or Values, depending on the operator.", + "type": "string", + "x-go-name": "Field" + }, + "operator": { + "description": "The operator for this filter.\n\n* equals FilterOperatorEquals Matches objects that are exactly equal to the value in the field.\n\n* not_equals FilterOperatorNotEquals Matches objects that are not exactly equal to the value in the field.\n\n* contains FilterOperatorContains For a multi-valued field, such as tags, this operator will match objects that contain any of the values in the field.\n\n* does_not_contain FilterOperatorDoesNotContain For a multi-valued field, such as tags, this operator will match objects that do not contain any of the values in the field.\n\n* in FilterOperatorIn Matches objects if the field is one of several possible values, as specified in the values array.\n\n* not_in FilterOperatorNotIn Matches objects if the field is none of several possible values, as specified in the values array.\n\n* and FilterOperatorAnd Matches objects only if all subfilters match.\n\n* or FilterOperatorOr Matches objects if any subfilter matches.\n\n* time_is_after FilterOperatorTimeIsAfter Matches objects if the field is after the given time.\n\n* time_is_before FilterOperatorTimeIsBefore Matches objects if the field is before the given time.\n\n* time_range FilterOperatorTimeRange Matches objects if the field is between the given times.\n\n* string_contains FilterOperatorStringContains Matches objects if the field contains the given string.\n\n* string_does_not_contain FilterOperatorStringDoesNotContain Matches objects if the field does not contain the given string.\n\n* is_set FilterOperatorIsSet FilterOperatorIsSet matches objects if the field is set.\n\n* is_unset FilterOperatorIsUnset FilterOperatorIsUnset matches objects if the field is unset.", + "enum": [ + "equals", + "not_equals", + "contains", + "does_not_contain", + "in", + "not_in", + "and", + "or", + "time_is_after", + "time_is_before", + "time_range", + "string_contains", + "string_does_not_contain", + "is_set", + "is_unset" + ], + "type": "string", + "x-go-enum-desc": "equals FilterOperatorEquals Matches objects that are exactly equal to the value in the field.\nnot_equals FilterOperatorNotEquals Matches objects that are not exactly equal to the value in the field.\ncontains FilterOperatorContains For a multi-valued field, such as tags, this operator will match objects that contain any of the values in the field.\ndoes_not_contain FilterOperatorDoesNotContain For a multi-valued field, such as tags, this operator will match objects that do not contain any of the values in the field.\nin FilterOperatorIn Matches objects if the field is one of several possible values, as specified in the values array.\nnot_in FilterOperatorNotIn Matches objects if the field is none of several possible values, as specified in the values array.\nand FilterOperatorAnd Matches objects only if all subfilters match.\nor FilterOperatorOr Matches objects if any subfilter matches.\ntime_is_after FilterOperatorTimeIsAfter Matches objects if the field is after the given time.\ntime_is_before FilterOperatorTimeIsBefore Matches objects if the field is before the given time.\ntime_range FilterOperatorTimeRange Matches objects if the field is between the given times.\nstring_contains FilterOperatorStringContains Matches objects if the field contains the given string.\nstring_does_not_contain FilterOperatorStringDoesNotContain Matches objects if the field does not contain the given string.\nis_set FilterOperatorIsSet FilterOperatorIsSet matches objects if the field is set.\nis_unset FilterOperatorIsUnset FilterOperatorIsUnset matches objects if the field is unset.", + "x-go-name": "Operator" + }, + "subfilters": { + "description": "Sub-filters for this filter. Valid only when operator is \"and\" or \"or\".\n\nThe maximum allowed depth for a tree of filters is 3.", + "items": { + "$ref": "#/components/schemas/Filter", + "has_circular_reference": true + }, + "type": "array", + "x-go-name": "Subfilters" + }, + "value": { + "description": "The value for this filter. Only used for single-valued operators\n\n(\"equals\", \"not_equals\", \"contains\", \"does_not_contain\")", + "type": "string", + "x-go-name": "Value" + }, + "values": { + "description": "The values for this filter. Only used for multi-valued operators (\"in\", \"not_in\").", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Values" + } + }, + "required": [ + "field", + "operator" + ], + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "limit": { + "description": "The number of contacts to fetch. Defaults to 100. Must be greater than 0 and less than 1000.", + "format": "int64", + "type": "integer", + "x-go-name": "Limit" + } + }, + "required": [ + "filter" + ], + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + } + } + }, + "required": false + }, + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "description": "The data payload of the response.", + "items": { + "properties": { + "account": { + "properties": { + "id": { + "description": "The ID of the account.", + "type": "string", + "x-go-name": "ID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "avatar_url": { + "description": "Avatar URL of the contact.", + "type": "string", + "x-go-name": "AvatarURL" + }, + "custom_fields": { + "additionalProperties": { + "properties": { + "slug": { + "description": "The slug of the custom field.", + "type": "string", + "x-go-name": "Slug" + }, + "value": { + "description": "The value of the custom field. Only to be used for single-valued custom fields. If unset, the custom field will be unset. If the custom field is a select field, the value must be the select option slug, which you can find from the GET /custom-fields endpoint.", + "type": "string", + "x-go-name": "Value" + }, + "values": { + "description": "The values of the custom field. Only to be used for multi-valued custom fields (ex. multiselect). If unset, the custom field will be unset. If the custom field is a multiselect field, the values must be the select option slugs which you can find from the GET /custom-fields endpoint.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Values" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "description": "Custom field values associated with the issue.", + "type": "object", + "x-go-name": "CustomFields" + }, + "email": { + "description": "The primary email of the contact, if it exists.", + "type": "string", + "x-go-name": "Email" + }, + "emails": { + "description": "The list of all emails of the contact.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Emails" + }, + "id": { + "description": "The ID of the contact.", + "type": "string", + "x-go-name": "ID" + }, + "name": { + "description": "The name of the contact.", + "type": "string", + "x-go-name": "Name" + }, + "portal_role": { + "description": "Portal role assigned to the contact.\n\n* no_access PortalRoleNoAccess\n\n* member PortalRoleMember\n\n* admin PortalRoleAdmin", + "enum": [ + "no_access", + "member", + "admin" + ], + "type": "string", + "x-go-enum-desc": "no_access PortalRoleNoAccess\nmember PortalRoleMember\nadmin PortalRoleAdmin", + "x-go-name": "PortalRole" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "type": "array", + "x-go-name": "Data" + }, + "pagination": { + "properties": { + "cursor": { + "description": "The cursor for the next page of results.", + "type": "string", + "x-go-name": "Cursor" + }, + "has_next_page": { + "description": "Indicates if there is a next page of results.", + "type": "boolean", + "x-go-name": "HasNextPage" + } + }, + "required": [ + "cursor", + "has_next_page" + ], + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + } + } + }, + "description": "" + } + }, + "summary": "Search for contacts by a given filter", + "tags": [ + "contacts" + ], + "x-codegen-request-body-name": "Body", + "x-moar-primitive-count": 7, + "x-moar-complexity-skipped": false + } + }, + "/contacts/{id}": { + "delete": { + "description": "Delete an existing contact", + "operationId": "DeleteContact", + "parameters": [ + { + "description": "The ID of the contact to delete.", + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string", + "x-go-name": "ID" + }, + "x-go-name": "ID" + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "properties": { + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + } + } + }, + "description": "" + } + }, + "tags": [ + "contacts" + ], + "x-moar-primitive-count": 0, + "x-moar-complexity-skipped": false + }, + "get": { + "description": "Get a contact by its ID", + "operationId": "GetContact", + "parameters": [ + { + "description": "The ID of the contact.", + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string", + "x-go-name": "ID" + }, + "x-go-name": "ID" + }, + { + "description": "The cursor to use for pagination.", + "in": "query", + "name": "cursor", + "schema": { + "type": "string", + "x-go-name": "Cursor" + }, + "x-go-name": "Cursor" + }, + { + "description": "The number of accounts to fetch. Defaults to 100. Must be greater than 0 and less than 1000.", + "in": "query", + "name": "limit", + "required": true, + "schema": { + "format": "int64", + "type": "integer", + "x-go-name": "Limit" + }, + "x-go-name": "Limit" + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "properties": { + "account": { + "properties": { + "id": { + "description": "The ID of the account.", + "type": "string", + "x-go-name": "ID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "avatar_url": { + "description": "Avatar URL of the contact.", + "type": "string", + "x-go-name": "AvatarURL" + }, + "custom_fields": { + "additionalProperties": { + "properties": { + "slug": { + "description": "The slug of the custom field.", + "type": "string", + "x-go-name": "Slug" + }, + "value": { + "description": "The value of the custom field. Only to be used for single-valued custom fields. If unset, the custom field will be unset. If the custom field is a select field, the value must be the select option slug, which you can find from the GET /custom-fields endpoint.", + "type": "string", + "x-go-name": "Value" + }, + "values": { + "description": "The values of the custom field. Only to be used for multi-valued custom fields (ex. multiselect). If unset, the custom field will be unset. If the custom field is a multiselect field, the values must be the select option slugs which you can find from the GET /custom-fields endpoint.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Values" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "description": "Custom field values associated with the issue.", + "type": "object", + "x-go-name": "CustomFields" + }, + "email": { + "description": "The primary email of the contact, if it exists.", + "type": "string", + "x-go-name": "Email" + }, + "emails": { + "description": "The list of all emails of the contact.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Emails" + }, + "id": { + "description": "The ID of the contact.", + "type": "string", + "x-go-name": "ID" + }, + "name": { + "description": "The name of the contact.", + "type": "string", + "x-go-name": "Name" + }, + "portal_role": { + "description": "Portal role assigned to the contact.\n\n* no_access PortalRoleNoAccess\n\n* member PortalRoleMember\n\n* admin PortalRoleAdmin", + "enum": [ + "no_access", + "member", + "admin" + ], + "type": "string", + "x-go-enum-desc": "no_access PortalRoleNoAccess\nmember PortalRoleMember\nadmin PortalRoleAdmin", + "x-go-name": "PortalRole" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + } + } + }, + "description": "" + }, + "400": { + "content": { + "application/json": { + "schema": { + "properties": { + "errors": { + "description": "The list of errors.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Errors" + }, + "exists_id": { + "description": "The ID of the object that already exists if this is a duplicate object error.", + "type": "string", + "x-go-name": "ExistsID" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + } + } + }, + "description": "" + }, + "404": { + "content": { + "application/json": { + "schema": { + "properties": { + "errors": { + "description": "The list of errors.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Errors" + }, + "exists_id": { + "description": "The ID of the object that already exists if this is a duplicate object error.", + "type": "string", + "x-go-name": "ExistsID" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + } + } + }, + "description": "" + }, + "500": { + "content": { + "application/json": { + "schema": { + "properties": { + "errors": { + "description": "The list of errors.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Errors" + }, + "exists_id": { + "description": "The ID of the object that already exists if this is a duplicate object error.", + "type": "string", + "x-go-name": "ExistsID" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + } + } + }, + "description": "" + } + }, + "tags": [ + "contacts" + ], + "x-moar-primitive-count": 0, + "x-moar-complexity-skipped": false + }, + "patch": { + "description": "Update an existing contact", + "operationId": "UpdateContact", + "parameters": [ + { + "description": "The ID of the contact to update.", + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string", + "x-go-name": "ID" + }, + "x-go-name": "ID" + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "properties": { + "account_external_id": { + "description": "The external ID of the account to move the contact to. Cannot be used together with account_id.", + "type": "string", + "x-go-name": "AccountExternalID" + }, + "account_id": { + "description": "The account to move the contact to.", + "type": "string", + "x-go-name": "AccountID" + }, + "avatar_url": { + "description": "The avatar URL of the contact. Must be a square .png, .jpg or .jpeg.", + "type": "string", + "x-go-name": "AvatarUrl" + }, + "custom_fields": { + "description": "An array of custom fields to be applied to this contact.", + "items": { + "properties": { + "slug": { + "description": "The slug of the custom field.", + "type": "string", + "x-go-name": "Slug" + }, + "value": { + "description": "The value of the custom field. Only to be used for single-valued custom fields. If unset, the custom field will be unset. If the custom field is a select field, the value must be the select option slug, which you can find from the GET /custom-fields endpoint.", + "type": "string", + "x-go-name": "Value" + }, + "values": { + "description": "The values of the custom field. Only to be used for multi-valued custom fields (ex. multiselect). If unset, the custom field will be unset. If the custom field is a multiselect field, the values must be the select option slugs which you can find from the GET /custom-fields endpoint.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Values" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "type": "array", + "x-go-name": "CustomFields" + }, + "email": { + "description": "The email of the contact.", + "type": "string", + "x-go-name": "Email" + }, + "name": { + "description": "in: body\n\nThe name of the contact.", + "type": "string", + "x-go-name": "Name" + }, + "portal_role": { + "description": "The portal role to assign to the contact. Can be one of `no_access`, `member`, or `admin`.\n\n* no_access PortalRoleNoAccess\n\n* member PortalRoleMember\n\n* admin PortalRoleAdmin", + "enum": [ + "no_access", + "member", + "admin" + ], + "type": "string", + "x-go-enum-desc": "no_access PortalRoleNoAccess\nmember PortalRoleMember\nadmin PortalRoleAdmin", + "x-go-name": "PortalRole" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + } + } + }, + "required": false + }, + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "properties": { + "account": { + "properties": { + "id": { + "description": "The ID of the account.", + "type": "string", + "x-go-name": "ID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "avatar_url": { + "description": "Avatar URL of the contact.", + "type": "string", + "x-go-name": "AvatarURL" + }, + "custom_fields": { + "additionalProperties": { + "properties": { + "slug": { + "description": "The slug of the custom field.", + "type": "string", + "x-go-name": "Slug" + }, + "value": { + "description": "The value of the custom field. Only to be used for single-valued custom fields. If unset, the custom field will be unset. If the custom field is a select field, the value must be the select option slug, which you can find from the GET /custom-fields endpoint.", + "type": "string", + "x-go-name": "Value" + }, + "values": { + "description": "The values of the custom field. Only to be used for multi-valued custom fields (ex. multiselect). If unset, the custom field will be unset. If the custom field is a multiselect field, the values must be the select option slugs which you can find from the GET /custom-fields endpoint.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Values" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "description": "Custom field values associated with the issue.", + "type": "object", + "x-go-name": "CustomFields" + }, + "email": { + "description": "The primary email of the contact, if it exists.", + "type": "string", + "x-go-name": "Email" + }, + "emails": { + "description": "The list of all emails of the contact.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Emails" + }, + "id": { + "description": "The ID of the contact.", + "type": "string", + "x-go-name": "ID" + }, + "name": { + "description": "The name of the contact.", + "type": "string", + "x-go-name": "Name" + }, + "portal_role": { + "description": "Portal role assigned to the contact.\n\n* no_access PortalRoleNoAccess\n\n* member PortalRoleMember\n\n* admin PortalRoleAdmin", + "enum": [ + "no_access", + "member", + "admin" + ], + "type": "string", + "x-go-enum-desc": "no_access PortalRoleNoAccess\nmember PortalRoleMember\nadmin PortalRoleAdmin", + "x-go-name": "PortalRole" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + } + } + }, + "description": "" + }, + "400": { + "content": { + "application/json": { + "schema": { + "properties": { + "errors": { + "description": "The list of errors.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Errors" + }, + "exists_id": { + "description": "The ID of the object that already exists if this is a duplicate object error.", + "type": "string", + "x-go-name": "ExistsID" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + } + } + }, + "description": "" + }, + "404": { + "content": { + "application/json": { + "schema": { + "properties": { + "errors": { + "description": "The list of errors.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Errors" + }, + "exists_id": { + "description": "The ID of the object that already exists if this is a duplicate object error.", + "type": "string", + "x-go-name": "ExistsID" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + } + } + }, + "description": "" + }, + "500": { + "content": { + "application/json": { + "schema": { + "properties": { + "errors": { + "description": "The list of errors.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Errors" + }, + "exists_id": { + "description": "The ID of the object that already exists if this is a duplicate object error.", + "type": "string", + "x-go-name": "ExistsID" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + } + } + }, + "description": "" + } + }, + "tags": [ + "contacts" + ], + "x-codegen-request-body-name": "Body", + "x-moar-primitive-count": 9, + "x-moar-complexity-skipped": false + } + }, + "/custom-fields": { + "get": { + "description": "Get all custom fields", + "operationId": "GetCustomFields", + "parameters": [ + { + "description": "The object type of the custom fields. Can be \"account\", \"issue\", or \"contact\".", + "in": "query", + "name": "object_type", + "required": true, + "schema": { + "type": "string", + "x-go-name": "ObjectType" + }, + "x-go-name": "ObjectType" + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "description": "The data payload of the response.", + "items": { + "properties": { + "created_at": { + "description": "When the custom field was created.", + "type": "string", + "x-go-name": "CreatedAt" + }, + "default_value": { + "description": "The default value for single-valued custom fields.", + "type": "string", + "x-go-name": "DefaultValue" + }, + "default_values": { + "description": "The default values for multi-valued custom fields.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "DefaultValues" + }, + "description": { + "description": "The description of the custom field.", + "type": "string", + "x-go-name": "Description" + }, + "id": { + "description": "The ID of the custom field.", + "type": "string", + "x-go-name": "ID" + }, + "is_read_only": { + "description": "Whether the custom field is read only. Fields synced from apps and integrations are read-only.", + "type": "boolean", + "x-go-name": "IsReadOnly" + }, + "label": { + "description": "The label of the custom field.", + "type": "string", + "x-go-name": "Label" + }, + "number_metadata": { + "properties": { + "currency": { + "description": "The currency of the number custom field.", + "type": "string", + "x-go-name": "Currency" + }, + "decimal_places": { + "description": "The decimal places of the number custom field.", + "format": "int64", + "type": "integer", + "x-go-name": "DecimalPlaces" + }, + "format": { + "description": "The format of the number custom field.\n\n* with_commas CustomFieldNumberFormatWithCommas\n\n* percent CustomFieldNumberFormatPercent\n\n* currency CustomFieldNumberFormatCurrency", + "enum": [ + "with_commas", + "percent", + "currency" + ], + "type": "string", + "x-go-enum-desc": "with_commas CustomFieldNumberFormatWithCommas\npercent CustomFieldNumberFormatPercent\ncurrency CustomFieldNumberFormatCurrency", + "x-go-name": "Format" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "object_type": { + "description": "The type of object this custom field is for. Can be \"account\", \"issue\", or \"contact\".", + "type": "string", + "x-go-name": "ObjectType" + }, + "select_metadata": { + "properties": { + "options": { + "description": "The list options of the select custom field. This is only present for select and multiselect custom fields.", + "items": { + "properties": { + "label": { + "description": "The label of the option.", + "type": "string", + "x-go-name": "Label" + }, + "slug": { + "description": "The slug of the option.", + "type": "string", + "x-go-name": "Slug" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "type": "array", + "x-go-name": "Options" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "slug": { + "description": "The slug of the custom field.", + "type": "string", + "x-go-name": "Slug" + }, + "source": { + "description": "The source of the custom field.", + "type": "string", + "x-go-name": "Source" + }, + "type": { + "description": "The type of the custom field.", + "type": "string", + "x-go-name": "Type" + }, + "updated_at": { + "description": "When the custom field was last updated.", + "type": "string", + "x-go-name": "UpdatedAt" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "type": "array", + "x-go-name": "Data" + }, + "pagination": { + "properties": { + "cursor": { + "description": "The cursor for the next page of results.", + "type": "string", + "x-go-name": "Cursor" + }, + "has_next_page": { + "description": "Indicates if there is a next page of results.", + "type": "boolean", + "x-go-name": "HasNextPage" + } + }, + "required": [ + "cursor", + "has_next_page" + ], + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + } + } + }, + "description": "" + }, + "400": { + "content": { + "application/json": { + "schema": { + "properties": { + "errors": { + "description": "The list of errors.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Errors" + }, + "exists_id": { + "description": "The ID of the object that already exists if this is a duplicate object error.", + "type": "string", + "x-go-name": "ExistsID" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + } + } + }, + "description": "" + }, + "404": { + "content": { + "application/json": { + "schema": { + "properties": { + "errors": { + "description": "The list of errors.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Errors" + }, + "exists_id": { + "description": "The ID of the object that already exists if this is a duplicate object error.", + "type": "string", + "x-go-name": "ExistsID" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + } + } + }, + "description": "" + }, + "500": { + "content": { + "application/json": { + "schema": { + "properties": { + "errors": { + "description": "The list of errors.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Errors" + }, + "exists_id": { + "description": "The ID of the object that already exists if this is a duplicate object error.", + "type": "string", + "x-go-name": "ExistsID" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + } + } + }, + "description": "" + } + }, + "tags": [ + "custom-fields" + ], + "x-moar-primitive-count": 0, + "x-moar-complexity-skipped": false + }, + "post": { + "description": "Create a custom field", + "operationId": "CreateCustomField", + "requestBody": { + "content": { + "application/json": { + "schema": { + "properties": { + "default_value": { + "description": "The default value for single-valued custom fields.", + "type": "string", + "x-go-name": "DefaultValue" + }, + "default_values": { + "description": "The default values for multi-valued custom fields.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "DefaultValues" + }, + "description": { + "description": "The description of the custom field.", + "type": "string", + "x-go-name": "Description" + }, + "label": { + "description": "The label of the custom field.", + "type": "string", + "x-go-name": "Label" + }, + "object_type": { + "description": "The object type of the custom field. Can be \"account\", \"issue\", or \"contact\"", + "type": "string", + "x-go-name": "ObjectType" + }, + "select_options": { + "description": "The list options of the select custom field. This is only present for select and multiselect custom fields.", + "items": { + "properties": { + "label": { + "description": "The label of the option.", + "type": "string", + "x-go-name": "Label" + }, + "slug": { + "description": "The slug of the option.", + "type": "string", + "x-go-name": "Slug" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "type": "array", + "x-go-name": "SelectOptions" + }, + "slug": { + "description": "The slug of the custom field.", + "type": "string", + "x-go-name": "Slug" + }, + "type": { + "description": "The type of the custom field. Can be one of `text`, `number`, `decimal`, `boolean`, `date`, `datetime`, `user`, `url`, `select`, or `multiselect`.", + "type": "string", + "x-go-name": "Type" + } + }, + "required": [ + "label", + "object_type", + "type" + ], + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + } + } + }, + "required": false + }, + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "properties": { + "created_at": { + "description": "When the custom field was created.", + "type": "string", + "x-go-name": "CreatedAt" + }, + "default_value": { + "description": "The default value for single-valued custom fields.", + "type": "string", + "x-go-name": "DefaultValue" + }, + "default_values": { + "description": "The default values for multi-valued custom fields.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "DefaultValues" + }, + "description": { + "description": "The description of the custom field.", + "type": "string", + "x-go-name": "Description" + }, + "id": { + "description": "The ID of the custom field.", + "type": "string", + "x-go-name": "ID" + }, + "is_read_only": { + "description": "Whether the custom field is read only. Fields synced from apps and integrations are read-only.", + "type": "boolean", + "x-go-name": "IsReadOnly" + }, + "label": { + "description": "The label of the custom field.", + "type": "string", + "x-go-name": "Label" + }, + "number_metadata": { + "properties": { + "currency": { + "description": "The currency of the number custom field.", + "type": "string", + "x-go-name": "Currency" + }, + "decimal_places": { + "description": "The decimal places of the number custom field.", + "format": "int64", + "type": "integer", + "x-go-name": "DecimalPlaces" + }, + "format": { + "description": "The format of the number custom field.\n\n* with_commas CustomFieldNumberFormatWithCommas\n\n* percent CustomFieldNumberFormatPercent\n\n* currency CustomFieldNumberFormatCurrency", + "enum": [ + "with_commas", + "percent", + "currency" + ], + "type": "string", + "x-go-enum-desc": "with_commas CustomFieldNumberFormatWithCommas\npercent CustomFieldNumberFormatPercent\ncurrency CustomFieldNumberFormatCurrency", + "x-go-name": "Format" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "object_type": { + "description": "The type of object this custom field is for. Can be \"account\", \"issue\", or \"contact\".", + "type": "string", + "x-go-name": "ObjectType" + }, + "select_metadata": { + "properties": { + "options": { + "description": "The list options of the select custom field. This is only present for select and multiselect custom fields.", + "items": { + "properties": { + "label": { + "description": "The label of the option.", + "type": "string", + "x-go-name": "Label" + }, + "slug": { + "description": "The slug of the option.", + "type": "string", + "x-go-name": "Slug" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "type": "array", + "x-go-name": "Options" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "slug": { + "description": "The slug of the custom field.", + "type": "string", + "x-go-name": "Slug" + }, + "source": { + "description": "The source of the custom field.", + "type": "string", + "x-go-name": "Source" + }, + "type": { + "description": "The type of the custom field.", + "type": "string", + "x-go-name": "Type" + }, + "updated_at": { + "description": "When the custom field was last updated.", + "type": "string", + "x-go-name": "UpdatedAt" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + } + } + }, + "description": "" + }, + "400": { + "content": { + "application/json": { + "schema": { + "properties": { + "errors": { + "description": "The list of errors.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Errors" + }, + "exists_id": { + "description": "The ID of the object that already exists if this is a duplicate object error.", + "type": "string", + "x-go-name": "ExistsID" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + } + } + }, + "description": "" + }, + "404": { + "content": { + "application/json": { + "schema": { + "properties": { + "errors": { + "description": "The list of errors.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Errors" + }, + "exists_id": { + "description": "The ID of the object that already exists if this is a duplicate object error.", + "type": "string", + "x-go-name": "ExistsID" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + } + } + }, + "description": "" + }, + "500": { + "content": { + "application/json": { + "schema": { + "properties": { + "errors": { + "description": "The list of errors.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Errors" + }, + "exists_id": { + "description": "The ID of the object that already exists if this is a duplicate object error.", + "type": "string", + "x-go-name": "ExistsID" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + } + } + }, + "description": "" + } + }, + "tags": [ + "custom-fields" + ], + "x-codegen-request-body-name": "Body", + "x-moar-primitive-count": 9, + "x-moar-complexity-skipped": false + } + }, + "/custom-fields/{id}": { + "get": { + "description": "Get a custom field by its ID", + "operationId": "GetCustomField", + "parameters": [ + { + "description": "The ID of the custom field.", + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string", + "x-go-name": "ID" + }, + "x-go-name": "ID" + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "properties": { + "created_at": { + "description": "When the custom field was created.", + "type": "string", + "x-go-name": "CreatedAt" + }, + "default_value": { + "description": "The default value for single-valued custom fields.", + "type": "string", + "x-go-name": "DefaultValue" + }, + "default_values": { + "description": "The default values for multi-valued custom fields.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "DefaultValues" + }, + "description": { + "description": "The description of the custom field.", + "type": "string", + "x-go-name": "Description" + }, + "id": { + "description": "The ID of the custom field.", + "type": "string", + "x-go-name": "ID" + }, + "is_read_only": { + "description": "Whether the custom field is read only. Fields synced from apps and integrations are read-only.", + "type": "boolean", + "x-go-name": "IsReadOnly" + }, + "label": { + "description": "The label of the custom field.", + "type": "string", + "x-go-name": "Label" + }, + "number_metadata": { + "properties": { + "currency": { + "description": "The currency of the number custom field.", + "type": "string", + "x-go-name": "Currency" + }, + "decimal_places": { + "description": "The decimal places of the number custom field.", + "format": "int64", + "type": "integer", + "x-go-name": "DecimalPlaces" + }, + "format": { + "description": "The format of the number custom field.\n\n* with_commas CustomFieldNumberFormatWithCommas\n\n* percent CustomFieldNumberFormatPercent\n\n* currency CustomFieldNumberFormatCurrency", + "enum": [ + "with_commas", + "percent", + "currency" + ], + "type": "string", + "x-go-enum-desc": "with_commas CustomFieldNumberFormatWithCommas\npercent CustomFieldNumberFormatPercent\ncurrency CustomFieldNumberFormatCurrency", + "x-go-name": "Format" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "object_type": { + "description": "The type of object this custom field is for. Can be \"account\", \"issue\", or \"contact\".", + "type": "string", + "x-go-name": "ObjectType" + }, + "select_metadata": { + "properties": { + "options": { + "description": "The list options of the select custom field. This is only present for select and multiselect custom fields.", + "items": { + "properties": { + "label": { + "description": "The label of the option.", + "type": "string", + "x-go-name": "Label" + }, + "slug": { + "description": "The slug of the option.", + "type": "string", + "x-go-name": "Slug" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "type": "array", + "x-go-name": "Options" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "slug": { + "description": "The slug of the custom field.", + "type": "string", + "x-go-name": "Slug" + }, + "source": { + "description": "The source of the custom field.", + "type": "string", + "x-go-name": "Source" + }, + "type": { + "description": "The type of the custom field.", + "type": "string", + "x-go-name": "Type" + }, + "updated_at": { + "description": "When the custom field was last updated.", + "type": "string", + "x-go-name": "UpdatedAt" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + } + } + }, + "description": "" + }, + "400": { + "content": { + "application/json": { + "schema": { + "properties": { + "errors": { + "description": "The list of errors.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Errors" + }, + "exists_id": { + "description": "The ID of the object that already exists if this is a duplicate object error.", + "type": "string", + "x-go-name": "ExistsID" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + } + } + }, + "description": "" + }, + "404": { + "content": { + "application/json": { + "schema": { + "properties": { + "errors": { + "description": "The list of errors.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Errors" + }, + "exists_id": { + "description": "The ID of the object that already exists if this is a duplicate object error.", + "type": "string", + "x-go-name": "ExistsID" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + } + } + }, + "description": "" + }, + "500": { + "content": { + "application/json": { + "schema": { + "properties": { + "errors": { + "description": "The list of errors.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Errors" + }, + "exists_id": { + "description": "The ID of the object that already exists if this is a duplicate object error.", + "type": "string", + "x-go-name": "ExistsID" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + } + } + }, + "description": "" + } + }, + "tags": [ + "custom-fields" + ], + "x-moar-primitive-count": 0, + "x-moar-complexity-skipped": false + }, + "patch": { + "description": "Update a custom field", + "operationId": "UpdateCustomField", + "parameters": [ + { + "description": "The ID of the custom field.", + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string", + "x-go-name": "ID" + }, + "x-go-name": "ID" + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "properties": { + "default_value": { + "description": "The default value for single-valued custom fields.", + "type": "string", + "x-go-name": "DefaultValue" + }, + "default_values": { + "description": "The default values for multi-valued custom fields.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "DefaultValues" + }, + "description": { + "description": "The description of the custom field.", + "type": "string", + "x-go-name": "Description" + }, + "label": { + "description": "The label of the custom field.", + "type": "string", + "x-go-name": "Label" + }, + "select_options": { + "description": "The list options of the select custom field. This is only present for select and multiselect custom fields.", + "items": { + "properties": { + "label": { + "description": "The label of the option.", + "type": "string", + "x-go-name": "Label" + }, + "slug": { + "description": "The slug of the option.", + "type": "string", + "x-go-name": "Slug" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "type": "array", + "x-go-name": "SelectOptions" + }, + "slug": { + "description": "The slug of the custom field.", + "type": "string", + "x-go-name": "Slug" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + } + } + }, + "required": false + }, + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "properties": { + "created_at": { + "description": "When the custom field was created.", + "type": "string", + "x-go-name": "CreatedAt" + }, + "default_value": { + "description": "The default value for single-valued custom fields.", + "type": "string", + "x-go-name": "DefaultValue" + }, + "default_values": { + "description": "The default values for multi-valued custom fields.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "DefaultValues" + }, + "description": { + "description": "The description of the custom field.", + "type": "string", + "x-go-name": "Description" + }, + "id": { + "description": "The ID of the custom field.", + "type": "string", + "x-go-name": "ID" + }, + "is_read_only": { + "description": "Whether the custom field is read only. Fields synced from apps and integrations are read-only.", + "type": "boolean", + "x-go-name": "IsReadOnly" + }, + "label": { + "description": "The label of the custom field.", + "type": "string", + "x-go-name": "Label" + }, + "number_metadata": { + "properties": { + "currency": { + "description": "The currency of the number custom field.", + "type": "string", + "x-go-name": "Currency" + }, + "decimal_places": { + "description": "The decimal places of the number custom field.", + "format": "int64", + "type": "integer", + "x-go-name": "DecimalPlaces" + }, + "format": { + "description": "The format of the number custom field.\n\n* with_commas CustomFieldNumberFormatWithCommas\n\n* percent CustomFieldNumberFormatPercent\n\n* currency CustomFieldNumberFormatCurrency", + "enum": [ + "with_commas", + "percent", + "currency" + ], + "type": "string", + "x-go-enum-desc": "with_commas CustomFieldNumberFormatWithCommas\npercent CustomFieldNumberFormatPercent\ncurrency CustomFieldNumberFormatCurrency", + "x-go-name": "Format" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "object_type": { + "description": "The type of object this custom field is for. Can be \"account\", \"issue\", or \"contact\".", + "type": "string", + "x-go-name": "ObjectType" + }, + "select_metadata": { + "properties": { + "options": { + "description": "The list options of the select custom field. This is only present for select and multiselect custom fields.", + "items": { + "properties": { + "label": { + "description": "The label of the option.", + "type": "string", + "x-go-name": "Label" + }, + "slug": { + "description": "The slug of the option.", + "type": "string", + "x-go-name": "Slug" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "type": "array", + "x-go-name": "Options" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "slug": { + "description": "The slug of the custom field.", + "type": "string", + "x-go-name": "Slug" + }, + "source": { + "description": "The source of the custom field.", + "type": "string", + "x-go-name": "Source" + }, + "type": { + "description": "The type of the custom field.", + "type": "string", + "x-go-name": "Type" + }, + "updated_at": { + "description": "When the custom field was last updated.", + "type": "string", + "x-go-name": "UpdatedAt" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + } + } + }, + "description": "" + }, + "400": { + "content": { + "application/json": { + "schema": { + "properties": { + "errors": { + "description": "The list of errors.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Errors" + }, + "exists_id": { + "description": "The ID of the object that already exists if this is a duplicate object error.", + "type": "string", + "x-go-name": "ExistsID" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + } + } + }, + "description": "" + }, + "404": { + "content": { + "application/json": { + "schema": { + "properties": { + "errors": { + "description": "The list of errors.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Errors" + }, + "exists_id": { + "description": "The ID of the object that already exists if this is a duplicate object error.", + "type": "string", + "x-go-name": "ExistsID" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + } + } + }, + "description": "" + }, + "500": { + "content": { + "application/json": { + "schema": { + "properties": { + "errors": { + "description": "The list of errors.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Errors" + }, + "exists_id": { + "description": "The ID of the object that already exists if this is a duplicate object error.", + "type": "string", + "x-go-name": "ExistsID" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + } + } + }, + "description": "" + } + }, + "tags": [ + "custom-fields" + ], + "x-codegen-request-body-name": "Body", + "x-moar-primitive-count": 7, + "x-moar-complexity-skipped": false + } + }, + "/import/contacts": { + "post": { + "description": "Import a new contact", + "operationId": "ImportContact", + "requestBody": { + "content": { + "application/json": { + "schema": { + "properties": { + "account_id": { + "description": "The account that this contact belongs to.", + "type": "string", + "x-go-name": "AccountID" + }, + "avatar_url": { + "description": "The avatar URL of the contact. Must be a square .png, .jpg or .jpeg.", + "type": "string", + "x-go-name": "AvatarUrl" + }, + "custom_fields": { + "description": "An array of custom fields to be applied to this contact.", + "items": { + "properties": { + "slug": { + "description": "The slug of the custom field.", + "type": "string", + "x-go-name": "Slug" + }, + "value": { + "description": "The value of the custom field. Only to be used for single-valued custom fields. If unset, the custom field will be unset. If the custom field is a select field, the value must be the select option slug, which you can find from the GET /custom-fields endpoint.", + "type": "string", + "x-go-name": "Value" + }, + "values": { + "description": "The values of the custom field. Only to be used for multi-valued custom fields (ex. multiselect). If unset, the custom field will be unset. If the custom field is a multiselect field, the values must be the select option slugs which you can find from the GET /custom-fields endpoint.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Values" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "type": "array", + "x-go-name": "CustomFields" + }, + "email": { + "description": "The email of the contact.", + "type": "string", + "x-go-name": "Email" + }, + "name": { + "description": "The name of the contact.", + "type": "string", + "x-go-name": "Name" + }, + "portal_role": { + "description": "The portal role to assign to the contact. If not provided uses the default portal role from the portal settings.\n\n* no_access PortalRoleNoAccess\n\n* member PortalRoleMember\n\n* admin PortalRoleAdmin", + "enum": [ + "no_access", + "member", + "admin" + ], + "type": "string", + "x-go-enum-desc": "no_access PortalRoleNoAccess\nmember PortalRoleMember\nadmin PortalRoleAdmin", + "x-go-name": "PortalRole" + } + }, + "required": [ + "email", + "name" + ], + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + } + } + }, + "required": false + }, + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "properties": { + "account": { + "properties": { + "id": { + "description": "The ID of the account.", + "type": "string", + "x-go-name": "ID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "avatar_url": { + "description": "Avatar URL of the contact.", + "type": "string", + "x-go-name": "AvatarURL" + }, + "custom_fields": { + "additionalProperties": { + "properties": { + "slug": { + "description": "The slug of the custom field.", + "type": "string", + "x-go-name": "Slug" + }, + "value": { + "description": "The value of the custom field. Only to be used for single-valued custom fields. If unset, the custom field will be unset. If the custom field is a select field, the value must be the select option slug, which you can find from the GET /custom-fields endpoint.", + "type": "string", + "x-go-name": "Value" + }, + "values": { + "description": "The values of the custom field. Only to be used for multi-valued custom fields (ex. multiselect). If unset, the custom field will be unset. If the custom field is a multiselect field, the values must be the select option slugs which you can find from the GET /custom-fields endpoint.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Values" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "description": "Custom field values associated with the issue.", + "type": "object", + "x-go-name": "CustomFields" + }, + "email": { + "description": "The primary email of the contact, if it exists.", + "type": "string", + "x-go-name": "Email" + }, + "emails": { + "description": "The list of all emails of the contact.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Emails" + }, + "id": { + "description": "The ID of the contact.", + "type": "string", + "x-go-name": "ID" + }, + "name": { + "description": "The name of the contact.", + "type": "string", + "x-go-name": "Name" + }, + "portal_role": { + "description": "Portal role assigned to the contact.\n\n* no_access PortalRoleNoAccess\n\n* member PortalRoleMember\n\n* admin PortalRoleAdmin", + "enum": [ + "no_access", + "member", + "admin" + ], + "type": "string", + "x-go-enum-desc": "no_access PortalRoleNoAccess\nmember PortalRoleMember\nadmin PortalRoleAdmin", + "x-go-name": "PortalRole" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + } + } + }, + "description": "" + }, + "400": { + "content": { + "application/json": { + "schema": { + "properties": { + "errors": { + "description": "The list of errors.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Errors" + }, + "exists_id": { + "description": "The ID of the object that already exists if this is a duplicate object error.", + "type": "string", + "x-go-name": "ExistsID" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + } + } + }, + "description": "" + }, + "404": { + "content": { + "application/json": { + "schema": { + "properties": { + "errors": { + "description": "The list of errors.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Errors" + }, + "exists_id": { + "description": "The ID of the object that already exists if this is a duplicate object error.", + "type": "string", + "x-go-name": "ExistsID" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + } + } + }, + "description": "" + }, + "500": { + "content": { + "application/json": { + "schema": { + "properties": { + "errors": { + "description": "The list of errors.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Errors" + }, + "exists_id": { + "description": "The ID of the object that already exists if this is a duplicate object error.", + "type": "string", + "x-go-name": "ExistsID" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + } + } + }, + "description": "" + } + }, + "tags": [ + "import" + ], + "x-codegen-request-body-name": "Body", + "x-moar-primitive-count": 8, + "x-moar-complexity-skipped": false + } + }, + "/import/issues": { + "post": { + "description": "Import an issue", + "operationId": "ImportIssue", + "requestBody": { + "content": { + "application/json": { + "schema": { + "properties": { + "account_id": { + "description": "AccountID that the issue should belong to.", + "type": "string", + "x-go-name": "AccountID" + }, + "assignee_id": { + "description": "UserID that the issue should be assigned to.", + "type": "string", + "x-go-name": "AssigneeID" + }, + "attachment_urls": { + "description": "An array of attachment URLs to attach to this issue.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "AttachmentURLs" + }, + "created_at": { + "description": "CreatedAt is the time the issue was created (RFC3339).", + "type": "string", + "x-go-name": "CreatedAt" + }, + "custom_fields": { + "description": "An array of custom fields to be used on this issue.", + "items": { + "properties": { + "slug": { + "description": "The slug of the custom field.", + "type": "string", + "x-go-name": "Slug" + }, + "value": { + "description": "The value of the custom field. Only to be used for single-valued custom fields. If unset, the custom field will be unset. If the custom field is a select field, the value must be the select option slug, which you can find from the GET /custom-fields endpoint.", + "type": "string", + "x-go-name": "Value" + }, + "values": { + "description": "The values of the custom field. Only to be used for multi-valued custom fields (ex. multiselect). If unset, the custom field will be unset. If the custom field is a multiselect field, the values must be the select option slugs which you can find from the GET /custom-fields endpoint.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Values" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "type": "array", + "x-go-name": "CustomFields" + }, + "external_issues": { + "description": "External issues to link to this issue.", + "items": { + "properties": { + "external_issue_id": { + "description": "The ID of the external issue in the source system.", + "type": "string", + "x-go-name": "ExternalIssueID" + }, + "source": { + "description": "The source system of the external issue (e.g., \"linear\", \"asana\", \"jira\", \"github\").", + "type": "string", + "x-go-name": "Source" + } + }, + "required": [ + "external_issue_id", + "source" + ], + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + }, + "type": "array", + "x-go-name": "ExternalIssues" + }, + "external_refs": { + "properties": { + "intercom_conversation_id": { + "description": "The Intercom conversation ID associated with this issue, if any.", + "type": "string", + "x-go-name": "IntercomConversationID" + }, + "zendesk_ticket_id": { + "description": "The Zendesk ticket ID associated with this issue, if any.", + "type": "string", + "x-go-name": "ZendeskTicketID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + }, + "first_response_time": { + "description": "FirstResponseTime is the time the issue was first responded to (RFC3339).", + "type": "string", + "x-go-name": "FirstResponseTime" + }, + "messages": { + "description": "Messages to be imported for this issue. At least one message is required.", + "items": { + "properties": { + "attachment_urls": { + "description": "An array of attachment URLs to attach to this message.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "AttachmentURLs" + }, + "body_html": { + "description": "The HTML content of the message.", + "type": "string", + "x-go-name": "BodyHTML" + }, + "contact_id": { + "description": "The contact that sent the message. Only one of user_id or contact_id can be specified.", + "type": "string", + "x-go-name": "ContactID" + }, + "created_at": { + "description": "CreatedAt is the time the message was created (RFC3339).", + "type": "string", + "x-go-name": "CreatedAt" + }, + "is_private": { + "description": "Whether the message is private.", + "type": "boolean", + "x-go-name": "IsPrivate" + }, + "user_id": { + "description": "The user that sent the message. Only one of user_id or contact_id can be specified.", + "type": "string", + "x-go-name": "UserID" + } + }, + "required": [ + "body_html", + "is_private" + ], + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + }, + "type": "array", + "x-go-name": "Messages" + }, + "requester_id": { + "description": "ContactID that the issue should be on behalf of.", + "type": "string", + "x-go-name": "RequesterID" + }, + "resolution_time": { + "description": "ResolutionTime is the time the issue was resolved (RFC3339).", + "type": "string", + "x-go-name": "ResolutionTime" + }, + "state": { + "description": "The state of the issue. Can be one of new, waiting_on_you, waiting_on_customer, on_hold, closed, or a custom status.", + "type": "string", + "x-go-name": "State" + }, + "tags": { + "description": "An array of strings to use as tags on this issue.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Tags" + }, + "team_id": { + "description": "TeamID that the issue should be assigned to.", + "type": "string", + "x-go-name": "TeamID" + }, + "title": { + "description": "The title of the issue.", + "type": "string", + "x-go-name": "Title" + }, + "updated_at": { + "description": "UpdatedAt is the time the issue was last updated (RFC3339).", + "type": "string", + "x-go-name": "UpdatedAt" + } + }, + "required": [ + "messages", + "state", + "title" + ], + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + } + } + }, + "required": false + }, + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "properties": { + "account": { + "properties": { + "id": { + "description": "The ID of the account.", + "type": "string", + "x-go-name": "ID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "assignee": { + "properties": { + "email": { + "description": "The email of the user.", + "type": "string", + "x-go-name": "Email" + }, + "id": { + "description": "The ID of the user.", + "type": "string", + "x-go-name": "ID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "attachment_urls": { + "description": "The attachment URLs attached to this issue, if any.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "AttachmentURLs" + }, + "body_html": { + "description": "The body of the issue in HTML format.", + "type": "string", + "x-go-name": "BodyHTML" + }, + "business_hours_first_response_seconds": { + "description": "The business hours time in seconds it took for the first response to the issue, if any.", + "format": "int64", + "type": "integer", + "x-go-name": "BusinessHoursFirstResponseSeconds" + }, + "business_hours_resolution_seconds": { + "description": "The business hours time in seconds it took for the issue to be resolved, if any.", + "format": "int64", + "type": "integer", + "x-go-name": "BusinessHoursResolutionSeconds" + }, + "chat_widget_info": { + "properties": { + "page_url": { + "description": "The URL of the page that the user was on when they started the chat widget issue.", + "type": "string", + "x-go-name": "PageURL" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "created_at": { + "description": "The time the issue was created.", + "type": "string", + "x-go-name": "CreatedAt" + }, + "csat_responses": { + "description": "The CSAT responses of the issue, if any.", + "items": { + "properties": { + "comment": { + "description": "The comment of the CSAT response.", + "type": "string", + "x-go-name": "Comment" + }, + "score": { + "description": "The score of the CSAT response.", + "format": "int64", + "type": "integer", + "x-go-name": "Score" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "type": "array", + "x-go-name": "CSATResponses" + }, + "custom_fields": { + "additionalProperties": { + "properties": { + "slug": { + "description": "The slug of the custom field.", + "type": "string", + "x-go-name": "Slug" + }, + "value": { + "description": "The value of the custom field. Only to be used for single-valued custom fields. If unset, the custom field will be unset. If the custom field is a select field, the value must be the select option slug, which you can find from the GET /custom-fields endpoint.", + "type": "string", + "x-go-name": "Value" + }, + "values": { + "description": "The values of the custom field. Only to be used for multi-valued custom fields (ex. multiselect). If unset, the custom field will be unset. If the custom field is a multiselect field, the values must be the select option slugs which you can find from the GET /custom-fields endpoint.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Values" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "description": "Custom field values associated with the issue.", + "type": "object", + "x-go-name": "CustomFields" + }, + "customer_portal_visible": { + "description": "Whether the issue is visible in the customer portal.", + "type": "boolean", + "x-go-name": "CustomerPortalVisible" + }, + "external_issues": { + "description": "The external issues associated with the issue, if any.", + "items": { + "properties": { + "external_id": { + "description": "The external ID of the external issue.\n\nJira: ID of the issue (autoincrementing number from 10000).\n\nGitHub: Owner/Repo/IssueID.\n\nLinear: ID of the issue (UUID).\n\nAsana: ID of the task (Long number).", + "type": "string", + "x-go-name": "ExternalID" + }, + "link": { + "description": "Link to the product issue.", + "type": "string", + "x-go-name": "Link" + }, + "source": { + "description": "The source of the external issue.", + "type": "string", + "x-go-name": "Source" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "type": "array", + "x-go-name": "ExternalIssues" + }, + "first_response_seconds": { + "description": "The time in seconds it took for the first response to the issue, if any.", + "format": "int64", + "type": "integer", + "x-go-name": "FirstResponseSeconds" + }, + "first_response_time": { + "description": "The time of the first response to the issue, if any.", + "type": "string", + "x-go-name": "FirstResponseTime" + }, + "id": { + "description": "The ID of the issue.", + "type": "string", + "x-go-name": "ID" + }, + "latest_message_time": { + "description": "The time of the latest message in the issue.", + "type": "string", + "x-go-name": "LatestMessageTime" + }, + "link": { + "description": "The link to the issue in Pylon.", + "type": "string", + "x-go-name": "Link" + }, + "number": { + "description": "The number of the issue.", + "format": "int64", + "type": "integer", + "x-go-name": "Number" + }, + "number_of_touches": { + "description": "The number of times the issue has been touched.", + "format": "int64", + "type": "integer", + "x-go-name": "NumberOfTouches" + }, + "requester": { + "properties": { + "email": { + "description": "The email of the contact.", + "type": "string", + "x-go-name": "Email" + }, + "id": { + "description": "The ID of the contact.", + "type": "string", + "x-go-name": "ID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "resolution_seconds": { + "description": "The time in seconds it took for the issue to be resolved, if any.", + "format": "int64", + "type": "integer", + "x-go-name": "ResolutionSeconds" + }, + "resolution_time": { + "description": "The time of the resolution of the issue, if any.", + "type": "string", + "x-go-name": "ResolutionTime" + }, + "slack": { + "properties": { + "channel_id": { + "description": "The Slack channel ID associated with the issue.", + "type": "string", + "x-go-name": "SlackChannelID" + }, + "message_ts": { + "description": "The root message ID of slack message that started issue.", + "type": "string", + "x-go-name": "SlackMessageTs" + }, + "workspace_id": { + "description": "The Slack workspace ID associated with the issue.", + "type": "string", + "x-go-name": "SlackWorkspaceID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "snoozed_until_time": { + "description": "The time the issue was snoozed until in RFC3339 format, if any.", + "type": "string", + "x-go-name": "SnoozedUntilTime" + }, + "source": { + "description": "The source of the issue.\n\n* slack IssueSourceSlack\n\n* microsoft_teams IssueSourceMicrosoftTeams\n\n* microsoft_teams_chat IssueSourceMicrosoftTeamsChat\n\n* chat_widget IssueSourceChatWidget\n\n* email IssueSourceEmail\n\n* manual IssueSourceManual\n\n* form IssueSourceForm\n\n* discord IssueSourceDiscord", + "enum": [ + "slack", + "microsoft_teams", + "microsoft_teams_chat", + "chat_widget", + "email", + "manual", + "form", + "discord" + ], + "type": "string", + "x-go-enum-desc": "slack IssueSourceSlack\nmicrosoft_teams IssueSourceMicrosoftTeams\nmicrosoft_teams_chat IssueSourceMicrosoftTeamsChat\nchat_widget IssueSourceChatWidget\nemail IssueSourceEmail\nmanual IssueSourceManual\nform IssueSourceForm\ndiscord IssueSourceDiscord", + "x-go-name": "Source" + }, + "state": { + "description": "The state of the issue. This could be one of `[\"new\", \"waiting_on_you\", \"waiting_on_customer\", \"on_hold\", \"closed\"] or a custom status slug.", + "type": "string", + "x-go-name": "State" + }, + "tags": { + "description": "Tags associated with the issue.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Tags" + }, + "team": { + "properties": { + "id": { + "description": "The ID of the team.", + "type": "string", + "x-go-name": "ID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "title": { + "description": "The title of the issue.", + "type": "string", + "x-go-name": "Title" + }, + "type": { + "description": "The type of the issue.\n\n* Conversation IssueTypeConversation\n\n* Ticket IssueTypeTicket", + "enum": [ + "Conversation", + "Ticket" + ], + "type": "string", + "x-go-enum-desc": "Conversation IssueTypeConversation\nTicket IssueTypeTicket", + "x-go-name": "Type" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + } + } + }, + "description": "" + }, + "400": { + "content": { + "application/json": { + "schema": { + "properties": { + "errors": { + "description": "The list of errors.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Errors" + }, + "exists_id": { + "description": "The ID of the object that already exists if this is a duplicate object error.", + "type": "string", + "x-go-name": "ExistsID" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + } + } + }, + "description": "" + }, + "404": { + "content": { + "application/json": { + "schema": { + "properties": { + "errors": { + "description": "The list of errors.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Errors" + }, + "exists_id": { + "description": "The ID of the object that already exists if this is a duplicate object error.", + "type": "string", + "x-go-name": "ExistsID" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + } + } + }, + "description": "" + }, + "500": { + "content": { + "application/json": { + "schema": { + "properties": { + "errors": { + "description": "The list of errors.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Errors" + }, + "exists_id": { + "description": "The ID of the object that already exists if this is a duplicate object error.", + "type": "string", + "x-go-name": "ExistsID" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + } + } + }, + "description": "" + } + }, + "tags": [ + "import" + ], + "x-codegen-request-body-name": "Body", + "x-moar-primitive-count": 25, + "x-moar-complexity-skipped": false + } + }, + "/import/issues/{id}/messages": { + "post": { + "description": "Import messages onto an existing issue", + "operationId": "ImportMessages", + "parameters": [ + { + "description": "The ID of the issue.", + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string", + "x-go-name": "ID" + }, + "x-go-name": "ID" + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "properties": { + "messages": { + "description": "Messages to be imported for this issue. At least one message is required.", + "items": { + "properties": { + "attachment_urls": { + "description": "An array of attachment URLs to attach to this message.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "AttachmentURLs" + }, + "body_html": { + "description": "The HTML content of the message.", + "type": "string", + "x-go-name": "BodyHTML" + }, + "contact_id": { + "description": "The contact that sent the message. Only one of user_id or contact_id can be specified.", + "type": "string", + "x-go-name": "ContactID" + }, + "created_at": { + "description": "CreatedAt is the time the message was created (RFC3339).", + "type": "string", + "x-go-name": "CreatedAt" + }, + "is_private": { + "description": "Whether the message is private.", + "type": "boolean", + "x-go-name": "IsPrivate" + }, + "user_id": { + "description": "The user that sent the message. Only one of user_id or contact_id can be specified.", + "type": "string", + "x-go-name": "UserID" + } + }, + "required": [ + "body_html", + "is_private" + ], + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + }, + "type": "array", + "x-go-name": "Messages" + } + }, + "required": [ + "messages" + ], + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + } + } + }, + "required": false + }, + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "properties": { + "account": { + "properties": { + "id": { + "description": "The ID of the account.", + "type": "string", + "x-go-name": "ID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "assignee": { + "properties": { + "email": { + "description": "The email of the user.", + "type": "string", + "x-go-name": "Email" + }, + "id": { + "description": "The ID of the user.", + "type": "string", + "x-go-name": "ID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "attachment_urls": { + "description": "The attachment URLs attached to this issue, if any.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "AttachmentURLs" + }, + "body_html": { + "description": "The body of the issue in HTML format.", + "type": "string", + "x-go-name": "BodyHTML" + }, + "business_hours_first_response_seconds": { + "description": "The business hours time in seconds it took for the first response to the issue, if any.", + "format": "int64", + "type": "integer", + "x-go-name": "BusinessHoursFirstResponseSeconds" + }, + "business_hours_resolution_seconds": { + "description": "The business hours time in seconds it took for the issue to be resolved, if any.", + "format": "int64", + "type": "integer", + "x-go-name": "BusinessHoursResolutionSeconds" + }, + "chat_widget_info": { + "properties": { + "page_url": { + "description": "The URL of the page that the user was on when they started the chat widget issue.", + "type": "string", + "x-go-name": "PageURL" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "created_at": { + "description": "The time the issue was created.", + "type": "string", + "x-go-name": "CreatedAt" + }, + "csat_responses": { + "description": "The CSAT responses of the issue, if any.", + "items": { + "properties": { + "comment": { + "description": "The comment of the CSAT response.", + "type": "string", + "x-go-name": "Comment" + }, + "score": { + "description": "The score of the CSAT response.", + "format": "int64", + "type": "integer", + "x-go-name": "Score" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "type": "array", + "x-go-name": "CSATResponses" + }, + "custom_fields": { + "additionalProperties": { + "properties": { + "slug": { + "description": "The slug of the custom field.", + "type": "string", + "x-go-name": "Slug" + }, + "value": { + "description": "The value of the custom field. Only to be used for single-valued custom fields. If unset, the custom field will be unset. If the custom field is a select field, the value must be the select option slug, which you can find from the GET /custom-fields endpoint.", + "type": "string", + "x-go-name": "Value" + }, + "values": { + "description": "The values of the custom field. Only to be used for multi-valued custom fields (ex. multiselect). If unset, the custom field will be unset. If the custom field is a multiselect field, the values must be the select option slugs which you can find from the GET /custom-fields endpoint.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Values" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "description": "Custom field values associated with the issue.", + "type": "object", + "x-go-name": "CustomFields" + }, + "customer_portal_visible": { + "description": "Whether the issue is visible in the customer portal.", + "type": "boolean", + "x-go-name": "CustomerPortalVisible" + }, + "external_issues": { + "description": "The external issues associated with the issue, if any.", + "items": { + "properties": { + "external_id": { + "description": "The external ID of the external issue.\n\nJira: ID of the issue (autoincrementing number from 10000).\n\nGitHub: Owner/Repo/IssueID.\n\nLinear: ID of the issue (UUID).\n\nAsana: ID of the task (Long number).", + "type": "string", + "x-go-name": "ExternalID" + }, + "link": { + "description": "Link to the product issue.", + "type": "string", + "x-go-name": "Link" + }, + "source": { + "description": "The source of the external issue.", + "type": "string", + "x-go-name": "Source" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "type": "array", + "x-go-name": "ExternalIssues" + }, + "first_response_seconds": { + "description": "The time in seconds it took for the first response to the issue, if any.", + "format": "int64", + "type": "integer", + "x-go-name": "FirstResponseSeconds" + }, + "first_response_time": { + "description": "The time of the first response to the issue, if any.", + "type": "string", + "x-go-name": "FirstResponseTime" + }, + "id": { + "description": "The ID of the issue.", + "type": "string", + "x-go-name": "ID" + }, + "latest_message_time": { + "description": "The time of the latest message in the issue.", + "type": "string", + "x-go-name": "LatestMessageTime" + }, + "link": { + "description": "The link to the issue in Pylon.", + "type": "string", + "x-go-name": "Link" + }, + "number": { + "description": "The number of the issue.", + "format": "int64", + "type": "integer", + "x-go-name": "Number" + }, + "number_of_touches": { + "description": "The number of times the issue has been touched.", + "format": "int64", + "type": "integer", + "x-go-name": "NumberOfTouches" + }, + "requester": { + "properties": { + "email": { + "description": "The email of the contact.", + "type": "string", + "x-go-name": "Email" + }, + "id": { + "description": "The ID of the contact.", + "type": "string", + "x-go-name": "ID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "resolution_seconds": { + "description": "The time in seconds it took for the issue to be resolved, if any.", + "format": "int64", + "type": "integer", + "x-go-name": "ResolutionSeconds" + }, + "resolution_time": { + "description": "The time of the resolution of the issue, if any.", + "type": "string", + "x-go-name": "ResolutionTime" + }, + "slack": { + "properties": { + "channel_id": { + "description": "The Slack channel ID associated with the issue.", + "type": "string", + "x-go-name": "SlackChannelID" + }, + "message_ts": { + "description": "The root message ID of slack message that started issue.", + "type": "string", + "x-go-name": "SlackMessageTs" + }, + "workspace_id": { + "description": "The Slack workspace ID associated with the issue.", + "type": "string", + "x-go-name": "SlackWorkspaceID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "snoozed_until_time": { + "description": "The time the issue was snoozed until in RFC3339 format, if any.", + "type": "string", + "x-go-name": "SnoozedUntilTime" + }, + "source": { + "description": "The source of the issue.\n\n* slack IssueSourceSlack\n\n* microsoft_teams IssueSourceMicrosoftTeams\n\n* microsoft_teams_chat IssueSourceMicrosoftTeamsChat\n\n* chat_widget IssueSourceChatWidget\n\n* email IssueSourceEmail\n\n* manual IssueSourceManual\n\n* form IssueSourceForm\n\n* discord IssueSourceDiscord", + "enum": [ + "slack", + "microsoft_teams", + "microsoft_teams_chat", + "chat_widget", + "email", + "manual", + "form", + "discord" + ], + "type": "string", + "x-go-enum-desc": "slack IssueSourceSlack\nmicrosoft_teams IssueSourceMicrosoftTeams\nmicrosoft_teams_chat IssueSourceMicrosoftTeamsChat\nchat_widget IssueSourceChatWidget\nemail IssueSourceEmail\nmanual IssueSourceManual\nform IssueSourceForm\ndiscord IssueSourceDiscord", + "x-go-name": "Source" + }, + "state": { + "description": "The state of the issue. This could be one of `[\"new\", \"waiting_on_you\", \"waiting_on_customer\", \"on_hold\", \"closed\"] or a custom status slug.", + "type": "string", + "x-go-name": "State" + }, + "tags": { + "description": "Tags associated with the issue.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Tags" + }, + "team": { + "properties": { + "id": { + "description": "The ID of the team.", + "type": "string", + "x-go-name": "ID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "title": { + "description": "The title of the issue.", + "type": "string", + "x-go-name": "Title" + }, + "type": { + "description": "The type of the issue.\n\n* Conversation IssueTypeConversation\n\n* Ticket IssueTypeTicket", + "enum": [ + "Conversation", + "Ticket" + ], + "type": "string", + "x-go-enum-desc": "Conversation IssueTypeConversation\nTicket IssueTypeTicket", + "x-go-name": "Type" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + } + } + }, + "description": "" + }, + "400": { + "content": { + "application/json": { + "schema": { + "properties": { + "errors": { + "description": "The list of errors.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Errors" + }, + "exists_id": { + "description": "The ID of the object that already exists if this is a duplicate object error.", + "type": "string", + "x-go-name": "ExistsID" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + } + } + }, + "description": "" + }, + "404": { + "content": { + "application/json": { + "schema": { + "properties": { + "errors": { + "description": "The list of errors.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Errors" + }, + "exists_id": { + "description": "The ID of the object that already exists if this is a duplicate object error.", + "type": "string", + "x-go-name": "ExistsID" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + } + } + }, + "description": "" + }, + "500": { + "content": { + "application/json": { + "schema": { + "properties": { + "errors": { + "description": "The list of errors.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Errors" + }, + "exists_id": { + "description": "The ID of the object that already exists if this is a duplicate object error.", + "type": "string", + "x-go-name": "ExistsID" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + } + } + }, + "description": "" + } + }, + "tags": [ + "import" + ], + "x-codegen-request-body-name": "Body", + "x-moar-primitive-count": 6, + "x-moar-complexity-skipped": false + } + }, + "/issue-statuses": { + "get": { + "description": "Get all issue statuses", + "operationId": "GetIssueStatuses", + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "description": "The data payload of the response.", + "items": { + "properties": { + "category": { + "description": "The category of the issue status.", + "type": "string", + "x-go-name": "Category" + }, + "is_archived": { + "description": "Indicates if the issue status is archived.", + "type": "boolean", + "x-go-name": "IsArchived" + }, + "is_default_status": { + "description": "Indicates if the issue status is a default status.", + "type": "boolean", + "x-go-name": "IsDefaultStatus" + }, + "label": { + "description": "The label of the issue status.", + "type": "string", + "x-go-name": "Label" + }, + "slug": { + "description": "The slug of the issue status.", + "type": "string", + "x-go-name": "Slug" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "type": "array", + "x-go-name": "Data" + }, + "pagination": { + "properties": { + "cursor": { + "description": "The cursor for the next page of results.", + "type": "string", + "x-go-name": "Cursor" + }, + "has_next_page": { + "description": "Indicates if there is a next page of results.", + "type": "boolean", + "x-go-name": "HasNextPage" + } + }, + "required": [ + "cursor", + "has_next_page" + ], + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + } + } + }, + "description": "" + }, + "400": { + "content": { + "application/json": { + "schema": { + "properties": { + "errors": { + "description": "The list of errors.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Errors" + }, + "exists_id": { + "description": "The ID of the object that already exists if this is a duplicate object error.", + "type": "string", + "x-go-name": "ExistsID" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + } + } + }, + "description": "" + }, + "404": { + "content": { + "application/json": { + "schema": { + "properties": { + "errors": { + "description": "The list of errors.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Errors" + }, + "exists_id": { + "description": "The ID of the object that already exists if this is a duplicate object error.", + "type": "string", + "x-go-name": "ExistsID" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + } + } + }, + "description": "" + }, + "500": { + "content": { + "application/json": { + "schema": { + "properties": { + "errors": { + "description": "The list of errors.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Errors" + }, + "exists_id": { + "description": "The ID of the object that already exists if this is a duplicate object error.", + "type": "string", + "x-go-name": "ExistsID" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + } + } + }, + "description": "" + } + }, + "tags": [ + "issue-statuses" + ], + "x-moar-primitive-count": 0, + "x-moar-complexity-skipped": false + } + }, + "/issues": { + "get": { + "description": "Get a list of issues", + "operationId": "GetIssues", + "parameters": [ + { + "description": "The start time (RFC3339) of the time range to get issues for. The duration between start_time and end_time must be less than or equal to 30 days.", + "in": "query", + "name": "start_time", + "required": true, + "schema": { + "type": "string", + "x-go-name": "StartTime" + }, + "x-go-name": "StartTime" + }, + { + "description": "The end time (RFC3339) of the time range to get issues for. The duration between start_time and end_time must be less than or equal to 30 days.", + "in": "query", + "name": "end_time", + "required": true, + "schema": { + "type": "string", + "x-go-name": "EndTime" + }, + "x-go-name": "EndTime" + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "description": "The data payload of the response.", + "items": { + "properties": { + "account": { + "properties": { + "id": { + "description": "The ID of the account.", + "type": "string", + "x-go-name": "ID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "assignee": { + "properties": { + "email": { + "description": "The email of the user.", + "type": "string", + "x-go-name": "Email" + }, + "id": { + "description": "The ID of the user.", + "type": "string", + "x-go-name": "ID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "attachment_urls": { + "description": "The attachment URLs attached to this issue, if any.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "AttachmentURLs" + }, + "body_html": { + "description": "The body of the issue in HTML format.", + "type": "string", + "x-go-name": "BodyHTML" + }, + "business_hours_first_response_seconds": { + "description": "The business hours time in seconds it took for the first response to the issue, if any.", + "format": "int64", + "type": "integer", + "x-go-name": "BusinessHoursFirstResponseSeconds" + }, + "business_hours_resolution_seconds": { + "description": "The business hours time in seconds it took for the issue to be resolved, if any.", + "format": "int64", + "type": "integer", + "x-go-name": "BusinessHoursResolutionSeconds" + }, + "chat_widget_info": { + "properties": { + "page_url": { + "description": "The URL of the page that the user was on when they started the chat widget issue.", + "type": "string", + "x-go-name": "PageURL" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "created_at": { + "description": "The time the issue was created.", + "type": "string", + "x-go-name": "CreatedAt" + }, + "csat_responses": { + "description": "The CSAT responses of the issue, if any.", + "items": { + "properties": { + "comment": { + "description": "The comment of the CSAT response.", + "type": "string", + "x-go-name": "Comment" + }, + "score": { + "description": "The score of the CSAT response.", + "format": "int64", + "type": "integer", + "x-go-name": "Score" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "type": "array", + "x-go-name": "CSATResponses" + }, + "custom_fields": { + "additionalProperties": { + "properties": { + "slug": { + "description": "The slug of the custom field.", + "type": "string", + "x-go-name": "Slug" + }, + "value": { + "description": "The value of the custom field. Only to be used for single-valued custom fields. If unset, the custom field will be unset. If the custom field is a select field, the value must be the select option slug, which you can find from the GET /custom-fields endpoint.", + "type": "string", + "x-go-name": "Value" + }, + "values": { + "description": "The values of the custom field. Only to be used for multi-valued custom fields (ex. multiselect). If unset, the custom field will be unset. If the custom field is a multiselect field, the values must be the select option slugs which you can find from the GET /custom-fields endpoint.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Values" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "description": "Custom field values associated with the issue.", + "type": "object", + "x-go-name": "CustomFields" + }, + "customer_portal_visible": { + "description": "Whether the issue is visible in the customer portal.", + "type": "boolean", + "x-go-name": "CustomerPortalVisible" + }, + "external_issues": { + "description": "The external issues associated with the issue, if any.", + "items": { + "properties": { + "external_id": { + "description": "The external ID of the external issue.\n\nJira: ID of the issue (autoincrementing number from 10000).\n\nGitHub: Owner/Repo/IssueID.\n\nLinear: ID of the issue (UUID).\n\nAsana: ID of the task (Long number).", + "type": "string", + "x-go-name": "ExternalID" + }, + "link": { + "description": "Link to the product issue.", + "type": "string", + "x-go-name": "Link" + }, + "source": { + "description": "The source of the external issue.", + "type": "string", + "x-go-name": "Source" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "type": "array", + "x-go-name": "ExternalIssues" + }, + "first_response_seconds": { + "description": "The time in seconds it took for the first response to the issue, if any.", + "format": "int64", + "type": "integer", + "x-go-name": "FirstResponseSeconds" + }, + "first_response_time": { + "description": "The time of the first response to the issue, if any.", + "type": "string", + "x-go-name": "FirstResponseTime" + }, + "id": { + "description": "The ID of the issue.", + "type": "string", + "x-go-name": "ID" + }, + "latest_message_time": { + "description": "The time of the latest message in the issue.", + "type": "string", + "x-go-name": "LatestMessageTime" + }, + "link": { + "description": "The link to the issue in Pylon.", + "type": "string", + "x-go-name": "Link" + }, + "number": { + "description": "The number of the issue.", + "format": "int64", + "type": "integer", + "x-go-name": "Number" + }, + "number_of_touches": { + "description": "The number of times the issue has been touched.", + "format": "int64", + "type": "integer", + "x-go-name": "NumberOfTouches" + }, + "requester": { + "properties": { + "email": { + "description": "The email of the contact.", + "type": "string", + "x-go-name": "Email" + }, + "id": { + "description": "The ID of the contact.", + "type": "string", + "x-go-name": "ID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "resolution_seconds": { + "description": "The time in seconds it took for the issue to be resolved, if any.", + "format": "int64", + "type": "integer", + "x-go-name": "ResolutionSeconds" + }, + "resolution_time": { + "description": "The time of the resolution of the issue, if any.", + "type": "string", + "x-go-name": "ResolutionTime" + }, + "slack": { + "properties": { + "channel_id": { + "description": "The Slack channel ID associated with the issue.", + "type": "string", + "x-go-name": "SlackChannelID" + }, + "message_ts": { + "description": "The root message ID of slack message that started issue.", + "type": "string", + "x-go-name": "SlackMessageTs" + }, + "workspace_id": { + "description": "The Slack workspace ID associated with the issue.", + "type": "string", + "x-go-name": "SlackWorkspaceID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "snoozed_until_time": { + "description": "The time the issue was snoozed until in RFC3339 format, if any.", + "type": "string", + "x-go-name": "SnoozedUntilTime" + }, + "source": { + "description": "The source of the issue.\n\n* slack IssueSourceSlack\n\n* microsoft_teams IssueSourceMicrosoftTeams\n\n* microsoft_teams_chat IssueSourceMicrosoftTeamsChat\n\n* chat_widget IssueSourceChatWidget\n\n* email IssueSourceEmail\n\n* manual IssueSourceManual\n\n* form IssueSourceForm\n\n* discord IssueSourceDiscord", + "enum": [ + "slack", + "microsoft_teams", + "microsoft_teams_chat", + "chat_widget", + "email", + "manual", + "form", + "discord" + ], + "type": "string", + "x-go-enum-desc": "slack IssueSourceSlack\nmicrosoft_teams IssueSourceMicrosoftTeams\nmicrosoft_teams_chat IssueSourceMicrosoftTeamsChat\nchat_widget IssueSourceChatWidget\nemail IssueSourceEmail\nmanual IssueSourceManual\nform IssueSourceForm\ndiscord IssueSourceDiscord", + "x-go-name": "Source" + }, + "state": { + "description": "The state of the issue. This could be one of `[\"new\", \"waiting_on_you\", \"waiting_on_customer\", \"on_hold\", \"closed\"] or a custom status slug.", + "type": "string", + "x-go-name": "State" + }, + "tags": { + "description": "Tags associated with the issue.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Tags" + }, + "team": { + "properties": { + "id": { + "description": "The ID of the team.", + "type": "string", + "x-go-name": "ID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "title": { + "description": "The title of the issue.", + "type": "string", + "x-go-name": "Title" + }, + "type": { + "description": "The type of the issue.\n\n* Conversation IssueTypeConversation\n\n* Ticket IssueTypeTicket", + "enum": [ + "Conversation", + "Ticket" + ], + "type": "string", + "x-go-enum-desc": "Conversation IssueTypeConversation\nTicket IssueTypeTicket", + "x-go-name": "Type" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "type": "array", + "x-go-name": "Data" + }, + "pagination": { + "properties": { + "cursor": { + "description": "The cursor for the next page of results.", + "type": "string", + "x-go-name": "Cursor" + }, + "has_next_page": { + "description": "Indicates if there is a next page of results.", + "type": "boolean", + "x-go-name": "HasNextPage" + } + }, + "required": [ + "cursor", + "has_next_page" + ], + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + } + } + }, + "description": "" + }, + "400": { + "content": { + "application/json": { + "schema": { + "properties": { + "errors": { + "description": "The list of errors.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Errors" + }, + "exists_id": { + "description": "The ID of the object that already exists if this is a duplicate object error.", + "type": "string", + "x-go-name": "ExistsID" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + } + } + }, + "description": "" + }, + "404": { + "content": { + "application/json": { + "schema": { + "properties": { + "errors": { + "description": "The list of errors.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Errors" + }, + "exists_id": { + "description": "The ID of the object that already exists if this is a duplicate object error.", + "type": "string", + "x-go-name": "ExistsID" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + } + } + }, + "description": "" + }, + "500": { + "content": { + "application/json": { + "schema": { + "properties": { + "errors": { + "description": "The list of errors.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Errors" + }, + "exists_id": { + "description": "The ID of the object that already exists if this is a duplicate object error.", + "type": "string", + "x-go-name": "ExistsID" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + } + } + }, + "description": "" + } + }, + "tags": [ + "issues" + ], + "x-moar-primitive-count": 0, + "x-moar-complexity-skipped": false + }, + "post": { + "description": "Create a new issue", + "operationId": "CreateIssue", + "requestBody": { + "content": { + "application/json": { + "schema": { + "properties": { + "account_id": { + "description": "The account that this issue belongs to.", + "type": "string", + "x-go-name": "AccountID" + }, + "assignee_id": { + "description": "The user the issue should be assigned to.", + "type": "string", + "x-go-name": "AssigneeID" + }, + "attachment_urls": { + "description": "An array of attachment URLs to attach to this issue.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "AttachmentURLs" + }, + "body_html": { + "description": "The HTML content of the body of the issue.", + "type": "string", + "x-go-name": "BodyHTML" + }, + "contact_id": { + "description": "Optional contact ID to post the message as. Only one of user_id or contact_id can be provided.", + "type": "string", + "x-go-name": "ContactID" + }, + "created_at": { + "description": "Timestamp of when the issue was created. If not specified, the current time will be used. (RFC3339)", + "type": "string", + "x-go-name": "CreatedAt" + }, + "custom_fields": { + "description": "An array of custom fields to be used on this issue.", + "items": { + "properties": { + "slug": { + "description": "The slug of the custom field.", + "type": "string", + "x-go-name": "Slug" + }, + "value": { + "description": "The value of the custom field. Only to be used for single-valued custom fields. If unset, the custom field will be unset. If the custom field is a select field, the value must be the select option slug, which you can find from the GET /custom-fields endpoint.", + "type": "string", + "x-go-name": "Value" + }, + "values": { + "description": "The values of the custom field. Only to be used for multi-valued custom fields (ex. multiselect). If unset, the custom field will be unset. If the custom field is a multiselect field, the values must be the select option slugs which you can find from the GET /custom-fields endpoint.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Values" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "type": "array", + "x-go-name": "CustomFields" + }, + "destination_metadata": { + "description": "You can configure the issue to contact the requester via email, Slack, in-app chat, or not at all.\n\nIf a destination other than `internal` is specified, a message with the issue's BodyHTML will be delivered to the requester. If you don't wish to immediately contact the requester, you can specify the `internal` destination.", + "properties": { + "chat_widget_app_id": { + "description": "The ID of the chat widget app to use for in-app chat.", + "type": "string", + "x-go-name": "ChatWidgetAppID" + }, + "destination": { + "description": "The destination type of the issue. Can be \"email\", \"slack\", \"in_app_chat\", or \"internal\". Defaults to \"internal\".\n\n* slack APIIssueDestinationSlack Deliver to the issue's account's Slack channel.\n\n* email APIIssueDestinationEmail Deliver messages to the issue requester via email.\n\n* in_app_chat APIIssueDestinationChatWidget Deliver messages to the issue requester via in-app chat.\n\n* internal APIIssueDestinationInternal Keep the issue internal and don't contact the requester at all.", + "enum": [ + "slack", + "email", + "in_app_chat", + "internal" + ], + "type": "string", + "x-go-enum-desc": "slack APIIssueDestinationSlack Deliver to the issue's account's Slack channel.\nemail APIIssueDestinationEmail Deliver messages to the issue requester via email.\nin_app_chat APIIssueDestinationChatWidget Deliver messages to the issue requester via in-app chat.\ninternal APIIssueDestinationInternal Keep the issue internal and don't contact the requester at all.", + "x-go-name": "Destination" + }, + "email": { + "description": "The email that emails to the requester will be sent from. You must configure an email app in Pylon with this address.", + "type": "string", + "x-go-name": "Email" + }, + "email_bccs": { + "description": "Emails that will be BCCed on emails to the requester.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "EmailBCCs" + }, + "email_ccs": { + "description": "Emails that will be CCed on emails to the requester.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "EmailCCs" + } + }, + "title": "DestinationMetadata specifies if/how communication will be delivered to the customer.", + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "priority": { + "description": "The priority of the issue. Can be one of: urgent, high, medium, or low.", + "type": "string", + "x-go-name": "Priority" + }, + "requester_avatar_url": { + "description": "The URL of an avatar of the requester.", + "type": "string", + "x-go-name": "RequesterAvatarUrl" + }, + "requester_email": { + "description": "The email of the user that this issue is on behalf of. Include one of requester_id or requester_email to create an issue with a requester.", + "type": "string", + "x-go-name": "RequesterEmail" + }, + "requester_id": { + "description": "The requester that this issue is on behalf of. Include one of requester_id or requester_email to create an issue with a requester.", + "type": "string", + "x-go-name": "RequesterID" + }, + "requester_name": { + "description": "The full name of the user that this issue is on behalf of.", + "type": "string", + "x-go-name": "RequesterName" + }, + "tags": { + "description": "An array of strings to use as tags on this issue. If provided, the issue tags will be updated to the given tags.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Tags" + }, + "team_id": { + "description": "The ID of the team this issue should be assigned to.", + "type": "string", + "x-go-name": "TeamID" + }, + "title": { + "description": "The title of the issue.", + "type": "string", + "x-go-name": "Title" + }, + "user_id": { + "description": "Optional user ID to post the message as. Only one of user_id or contact_id can be provided.", + "type": "string", + "x-go-name": "UserID" + } + }, + "required": [ + "body_html", + "title" + ], + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + } + } + }, + "required": false + }, + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "properties": { + "account": { + "properties": { + "id": { + "description": "The ID of the account.", + "type": "string", + "x-go-name": "ID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "assignee": { + "properties": { + "email": { + "description": "The email of the user.", + "type": "string", + "x-go-name": "Email" + }, + "id": { + "description": "The ID of the user.", + "type": "string", + "x-go-name": "ID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "attachment_urls": { + "description": "The attachment URLs attached to this issue, if any.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "AttachmentURLs" + }, + "body_html": { + "description": "The body of the issue in HTML format.", + "type": "string", + "x-go-name": "BodyHTML" + }, + "business_hours_first_response_seconds": { + "description": "The business hours time in seconds it took for the first response to the issue, if any.", + "format": "int64", + "type": "integer", + "x-go-name": "BusinessHoursFirstResponseSeconds" + }, + "business_hours_resolution_seconds": { + "description": "The business hours time in seconds it took for the issue to be resolved, if any.", + "format": "int64", + "type": "integer", + "x-go-name": "BusinessHoursResolutionSeconds" + }, + "chat_widget_info": { + "properties": { + "page_url": { + "description": "The URL of the page that the user was on when they started the chat widget issue.", + "type": "string", + "x-go-name": "PageURL" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "created_at": { + "description": "The time the issue was created.", + "type": "string", + "x-go-name": "CreatedAt" + }, + "csat_responses": { + "description": "The CSAT responses of the issue, if any.", + "items": { + "properties": { + "comment": { + "description": "The comment of the CSAT response.", + "type": "string", + "x-go-name": "Comment" + }, + "score": { + "description": "The score of the CSAT response.", + "format": "int64", + "type": "integer", + "x-go-name": "Score" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "type": "array", + "x-go-name": "CSATResponses" + }, + "custom_fields": { + "additionalProperties": { + "properties": { + "slug": { + "description": "The slug of the custom field.", + "type": "string", + "x-go-name": "Slug" + }, + "value": { + "description": "The value of the custom field. Only to be used for single-valued custom fields. If unset, the custom field will be unset. If the custom field is a select field, the value must be the select option slug, which you can find from the GET /custom-fields endpoint.", + "type": "string", + "x-go-name": "Value" + }, + "values": { + "description": "The values of the custom field. Only to be used for multi-valued custom fields (ex. multiselect). If unset, the custom field will be unset. If the custom field is a multiselect field, the values must be the select option slugs which you can find from the GET /custom-fields endpoint.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Values" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "description": "Custom field values associated with the issue.", + "type": "object", + "x-go-name": "CustomFields" + }, + "customer_portal_visible": { + "description": "Whether the issue is visible in the customer portal.", + "type": "boolean", + "x-go-name": "CustomerPortalVisible" + }, + "external_issues": { + "description": "The external issues associated with the issue, if any.", + "items": { + "properties": { + "external_id": { + "description": "The external ID of the external issue.\n\nJira: ID of the issue (autoincrementing number from 10000).\n\nGitHub: Owner/Repo/IssueID.\n\nLinear: ID of the issue (UUID).\n\nAsana: ID of the task (Long number).", + "type": "string", + "x-go-name": "ExternalID" + }, + "link": { + "description": "Link to the product issue.", + "type": "string", + "x-go-name": "Link" + }, + "source": { + "description": "The source of the external issue.", + "type": "string", + "x-go-name": "Source" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "type": "array", + "x-go-name": "ExternalIssues" + }, + "first_response_seconds": { + "description": "The time in seconds it took for the first response to the issue, if any.", + "format": "int64", + "type": "integer", + "x-go-name": "FirstResponseSeconds" + }, + "first_response_time": { + "description": "The time of the first response to the issue, if any.", + "type": "string", + "x-go-name": "FirstResponseTime" + }, + "id": { + "description": "The ID of the issue.", + "type": "string", + "x-go-name": "ID" + }, + "latest_message_time": { + "description": "The time of the latest message in the issue.", + "type": "string", + "x-go-name": "LatestMessageTime" + }, + "link": { + "description": "The link to the issue in Pylon.", + "type": "string", + "x-go-name": "Link" + }, + "number": { + "description": "The number of the issue.", + "format": "int64", + "type": "integer", + "x-go-name": "Number" + }, + "number_of_touches": { + "description": "The number of times the issue has been touched.", + "format": "int64", + "type": "integer", + "x-go-name": "NumberOfTouches" + }, + "requester": { + "properties": { + "email": { + "description": "The email of the contact.", + "type": "string", + "x-go-name": "Email" + }, + "id": { + "description": "The ID of the contact.", + "type": "string", + "x-go-name": "ID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "resolution_seconds": { + "description": "The time in seconds it took for the issue to be resolved, if any.", + "format": "int64", + "type": "integer", + "x-go-name": "ResolutionSeconds" + }, + "resolution_time": { + "description": "The time of the resolution of the issue, if any.", + "type": "string", + "x-go-name": "ResolutionTime" + }, + "slack": { + "properties": { + "channel_id": { + "description": "The Slack channel ID associated with the issue.", + "type": "string", + "x-go-name": "SlackChannelID" + }, + "message_ts": { + "description": "The root message ID of slack message that started issue.", + "type": "string", + "x-go-name": "SlackMessageTs" + }, + "workspace_id": { + "description": "The Slack workspace ID associated with the issue.", + "type": "string", + "x-go-name": "SlackWorkspaceID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "snoozed_until_time": { + "description": "The time the issue was snoozed until in RFC3339 format, if any.", + "type": "string", + "x-go-name": "SnoozedUntilTime" + }, + "source": { + "description": "The source of the issue.\n\n* slack IssueSourceSlack\n\n* microsoft_teams IssueSourceMicrosoftTeams\n\n* microsoft_teams_chat IssueSourceMicrosoftTeamsChat\n\n* chat_widget IssueSourceChatWidget\n\n* email IssueSourceEmail\n\n* manual IssueSourceManual\n\n* form IssueSourceForm\n\n* discord IssueSourceDiscord", + "enum": [ + "slack", + "microsoft_teams", + "microsoft_teams_chat", + "chat_widget", + "email", + "manual", + "form", + "discord" + ], + "type": "string", + "x-go-enum-desc": "slack IssueSourceSlack\nmicrosoft_teams IssueSourceMicrosoftTeams\nmicrosoft_teams_chat IssueSourceMicrosoftTeamsChat\nchat_widget IssueSourceChatWidget\nemail IssueSourceEmail\nmanual IssueSourceManual\nform IssueSourceForm\ndiscord IssueSourceDiscord", + "x-go-name": "Source" + }, + "state": { + "description": "The state of the issue. This could be one of `[\"new\", \"waiting_on_you\", \"waiting_on_customer\", \"on_hold\", \"closed\"] or a custom status slug.", + "type": "string", + "x-go-name": "State" + }, + "tags": { + "description": "Tags associated with the issue.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Tags" + }, + "team": { + "properties": { + "id": { + "description": "The ID of the team.", + "type": "string", + "x-go-name": "ID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "title": { + "description": "The title of the issue.", + "type": "string", + "x-go-name": "Title" + }, + "type": { + "description": "The type of the issue.\n\n* Conversation IssueTypeConversation\n\n* Ticket IssueTypeTicket", + "enum": [ + "Conversation", + "Ticket" + ], + "type": "string", + "x-go-enum-desc": "Conversation IssueTypeConversation\nTicket IssueTypeTicket", + "x-go-name": "Type" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + } + } + }, + "description": "" + }, + "400": { + "content": { + "application/json": { + "schema": { + "properties": { + "errors": { + "description": "The list of errors.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Errors" + }, + "exists_id": { + "description": "The ID of the object that already exists if this is a duplicate object error.", + "type": "string", + "x-go-name": "ExistsID" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + } + } + }, + "description": "" + }, + "404": { + "content": { + "application/json": { + "schema": { + "properties": { + "errors": { + "description": "The list of errors.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Errors" + }, + "exists_id": { + "description": "The ID of the object that already exists if this is a duplicate object error.", + "type": "string", + "x-go-name": "ExistsID" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + } + } + }, + "description": "" + }, + "500": { + "content": { + "application/json": { + "schema": { + "properties": { + "errors": { + "description": "The list of errors.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Errors" + }, + "exists_id": { + "description": "The ID of the object that already exists if this is a duplicate object error.", + "type": "string", + "x-go-name": "ExistsID" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + } + } + }, + "description": "" + } + }, + "tags": [ + "issues" + ], + "x-codegen-request-body-name": "Body", + "x-moar-primitive-count": 23, + "x-moar-complexity-skipped": false + } + }, + "/issues/search": { + "post": { + "description": "Currently, the following fields are filterable for issues:\n\n* created_at (in RFC3339 format). Allowed operators: `time_is_after`, `time_is_before`, `time_range`\n\n* account_id. Allowed operators: `equals`, `in`, `not_in`, `is_set`, `is_unset`\n\n* ticket_form_id. Allowed operators: `equals`, `in`, `not_in`, `is_set`, `is_unset`\n\n* requester_id. Allowed operators: `equals`, `in`, `not_in`, `is_set`, `is_unset`\n\n* follower_user_id. Allowed operators: `equals`, `in`, `not_in`\n\n* follower_contact_id. Allowed operators: `equals`, `in`, `not_in`\n\n* state. Valid values are `[\"new\", \"waiting_on_you\", \"waiting_on_customer\", \"on_hold\", \"closed\"]` or a custom status slug. Allowed operators: `equals`, `in`, `not_in`\n\n* custom fields (pass in the slug of the custom field)\n\n* tags (pass in the tag name). Allowed operators: `contains`, `does_not_contain`, `in`, `not_in`\n\n* title. Allowed operators: `string_contains`, `string_does_not_contain`\n\n* body_html. Allowed operators: `string_contains`, `string_does_not_contain`\n\n* assignee_id. Allowed operators: `equals`, `in`, `not_in`, `is_set`, `is_unset`\n\n* team_id. Allowed operators: `equals`, `in`, `not_in`", + "operationId": "SearchIssues", + "requestBody": { + "content": { + "application/json": { + "schema": { + "properties": { + "cursor": { + "description": "The cursor to use for pagination.", + "type": "string", + "x-go-name": "Cursor" + }, + "filter": { + "properties": { + "field": { + "description": "The field for this filter. For allowed fields, see the documentation for\n\nthe specific endpoint you are using.\n\nFor non-compound filters (any operators other than \"and\" or \"or\"),\n\nField must be set, along with either Value or Values, depending on the operator.", + "type": "string", + "x-go-name": "Field" + }, + "operator": { + "description": "The operator for this filter.\n\n* equals FilterOperatorEquals Matches objects that are exactly equal to the value in the field.\n\n* not_equals FilterOperatorNotEquals Matches objects that are not exactly equal to the value in the field.\n\n* contains FilterOperatorContains For a multi-valued field, such as tags, this operator will match objects that contain any of the values in the field.\n\n* does_not_contain FilterOperatorDoesNotContain For a multi-valued field, such as tags, this operator will match objects that do not contain any of the values in the field.\n\n* in FilterOperatorIn Matches objects if the field is one of several possible values, as specified in the values array.\n\n* not_in FilterOperatorNotIn Matches objects if the field is none of several possible values, as specified in the values array.\n\n* and FilterOperatorAnd Matches objects only if all subfilters match.\n\n* or FilterOperatorOr Matches objects if any subfilter matches.\n\n* time_is_after FilterOperatorTimeIsAfter Matches objects if the field is after the given time.\n\n* time_is_before FilterOperatorTimeIsBefore Matches objects if the field is before the given time.\n\n* time_range FilterOperatorTimeRange Matches objects if the field is between the given times.\n\n* string_contains FilterOperatorStringContains Matches objects if the field contains the given string.\n\n* string_does_not_contain FilterOperatorStringDoesNotContain Matches objects if the field does not contain the given string.\n\n* is_set FilterOperatorIsSet FilterOperatorIsSet matches objects if the field is set.\n\n* is_unset FilterOperatorIsUnset FilterOperatorIsUnset matches objects if the field is unset.", + "enum": [ + "equals", + "not_equals", + "contains", + "does_not_contain", + "in", + "not_in", + "and", + "or", + "time_is_after", + "time_is_before", + "time_range", + "string_contains", + "string_does_not_contain", + "is_set", + "is_unset" + ], + "type": "string", + "x-go-enum-desc": "equals FilterOperatorEquals Matches objects that are exactly equal to the value in the field.\nnot_equals FilterOperatorNotEquals Matches objects that are not exactly equal to the value in the field.\ncontains FilterOperatorContains For a multi-valued field, such as tags, this operator will match objects that contain any of the values in the field.\ndoes_not_contain FilterOperatorDoesNotContain For a multi-valued field, such as tags, this operator will match objects that do not contain any of the values in the field.\nin FilterOperatorIn Matches objects if the field is one of several possible values, as specified in the values array.\nnot_in FilterOperatorNotIn Matches objects if the field is none of several possible values, as specified in the values array.\nand FilterOperatorAnd Matches objects only if all subfilters match.\nor FilterOperatorOr Matches objects if any subfilter matches.\ntime_is_after FilterOperatorTimeIsAfter Matches objects if the field is after the given time.\ntime_is_before FilterOperatorTimeIsBefore Matches objects if the field is before the given time.\ntime_range FilterOperatorTimeRange Matches objects if the field is between the given times.\nstring_contains FilterOperatorStringContains Matches objects if the field contains the given string.\nstring_does_not_contain FilterOperatorStringDoesNotContain Matches objects if the field does not contain the given string.\nis_set FilterOperatorIsSet FilterOperatorIsSet matches objects if the field is set.\nis_unset FilterOperatorIsUnset FilterOperatorIsUnset matches objects if the field is unset.", + "x-go-name": "Operator" + }, + "subfilters": { + "description": "Sub-filters for this filter. Valid only when operator is \"and\" or \"or\".\n\nThe maximum allowed depth for a tree of filters is 3.", + "items": { + "$ref": "#/components/schemas/Filter", + "has_circular_reference": true + }, + "type": "array", + "x-go-name": "Subfilters" + }, + "value": { + "description": "The value for this filter. Only used for single-valued operators\n\n(\"equals\", \"not_equals\", \"contains\", \"does_not_contain\")", + "type": "string", + "x-go-name": "Value" + }, + "values": { + "description": "The values for this filter. Only used for multi-valued operators (\"in\", \"not_in\").", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Values" + } + }, + "required": [ + "field", + "operator" + ], + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "limit": { + "description": "The number of issues to fetch. Defaults to 100. Must be greater than 0 and less than 1000.", + "format": "int64", + "type": "integer", + "x-go-name": "Limit" + } + }, + "required": [ + "filter" + ], + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + } + } + }, + "required": false + }, + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "items": { + "properties": { + "account": { + "properties": { + "id": { + "description": "The ID of the account.", + "type": "string", + "x-go-name": "ID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "assignee": { + "properties": { + "email": { + "description": "The email of the user.", + "type": "string", + "x-go-name": "Email" + }, + "id": { + "description": "The ID of the user.", + "type": "string", + "x-go-name": "ID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "attachment_urls": { + "description": "The attachment URLs attached to this issue, if any.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "AttachmentURLs" + }, + "body_html": { + "description": "The body of the issue in HTML format.", + "type": "string", + "x-go-name": "BodyHTML" + }, + "business_hours_first_response_seconds": { + "description": "The business hours time in seconds it took for the first response to the issue, if any.", + "format": "int64", + "type": "integer", + "x-go-name": "BusinessHoursFirstResponseSeconds" + }, + "business_hours_resolution_seconds": { + "description": "The business hours time in seconds it took for the issue to be resolved, if any.", + "format": "int64", + "type": "integer", + "x-go-name": "BusinessHoursResolutionSeconds" + }, + "chat_widget_info": { + "properties": { + "page_url": { + "description": "The URL of the page that the user was on when they started the chat widget issue.", + "type": "string", + "x-go-name": "PageURL" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "created_at": { + "description": "The time the issue was created.", + "type": "string", + "x-go-name": "CreatedAt" + }, + "csat_responses": { + "description": "The CSAT responses of the issue, if any.", + "items": { + "properties": { + "comment": { + "description": "The comment of the CSAT response.", + "type": "string", + "x-go-name": "Comment" + }, + "score": { + "description": "The score of the CSAT response.", + "format": "int64", + "type": "integer", + "x-go-name": "Score" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "type": "array", + "x-go-name": "CSATResponses" + }, + "custom_fields": { + "additionalProperties": { + "properties": { + "slug": { + "description": "The slug of the custom field.", + "type": "string", + "x-go-name": "Slug" + }, + "value": { + "description": "The value of the custom field. Only to be used for single-valued custom fields. If unset, the custom field will be unset. If the custom field is a select field, the value must be the select option slug, which you can find from the GET /custom-fields endpoint.", + "type": "string", + "x-go-name": "Value" + }, + "values": { + "description": "The values of the custom field. Only to be used for multi-valued custom fields (ex. multiselect). If unset, the custom field will be unset. If the custom field is a multiselect field, the values must be the select option slugs which you can find from the GET /custom-fields endpoint.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Values" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "description": "Custom field values associated with the issue.", + "type": "object", + "x-go-name": "CustomFields" + }, + "customer_portal_visible": { + "description": "Whether the issue is visible in the customer portal.", + "type": "boolean", + "x-go-name": "CustomerPortalVisible" + }, + "external_issues": { + "description": "The external issues associated with the issue, if any.", + "items": { + "properties": { + "external_id": { + "description": "The external ID of the external issue.\n\nJira: ID of the issue (autoincrementing number from 10000).\n\nGitHub: Owner/Repo/IssueID.\n\nLinear: ID of the issue (UUID).\n\nAsana: ID of the task (Long number).", + "type": "string", + "x-go-name": "ExternalID" + }, + "link": { + "description": "Link to the product issue.", + "type": "string", + "x-go-name": "Link" + }, + "source": { + "description": "The source of the external issue.", + "type": "string", + "x-go-name": "Source" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "type": "array", + "x-go-name": "ExternalIssues" + }, + "first_response_seconds": { + "description": "The time in seconds it took for the first response to the issue, if any.", + "format": "int64", + "type": "integer", + "x-go-name": "FirstResponseSeconds" + }, + "first_response_time": { + "description": "The time of the first response to the issue, if any.", + "type": "string", + "x-go-name": "FirstResponseTime" + }, + "id": { + "description": "The ID of the issue.", + "type": "string", + "x-go-name": "ID" + }, + "latest_message_time": { + "description": "The time of the latest message in the issue.", + "type": "string", + "x-go-name": "LatestMessageTime" + }, + "link": { + "description": "The link to the issue in Pylon.", + "type": "string", + "x-go-name": "Link" + }, + "number": { + "description": "The number of the issue.", + "format": "int64", + "type": "integer", + "x-go-name": "Number" + }, + "number_of_touches": { + "description": "The number of times the issue has been touched.", + "format": "int64", + "type": "integer", + "x-go-name": "NumberOfTouches" + }, + "requester": { + "properties": { + "email": { + "description": "The email of the contact.", + "type": "string", + "x-go-name": "Email" + }, + "id": { + "description": "The ID of the contact.", + "type": "string", + "x-go-name": "ID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "resolution_seconds": { + "description": "The time in seconds it took for the issue to be resolved, if any.", + "format": "int64", + "type": "integer", + "x-go-name": "ResolutionSeconds" + }, + "resolution_time": { + "description": "The time of the resolution of the issue, if any.", + "type": "string", + "x-go-name": "ResolutionTime" + }, + "slack": { + "properties": { + "channel_id": { + "description": "The Slack channel ID associated with the issue.", + "type": "string", + "x-go-name": "SlackChannelID" + }, + "message_ts": { + "description": "The root message ID of slack message that started issue.", + "type": "string", + "x-go-name": "SlackMessageTs" + }, + "workspace_id": { + "description": "The Slack workspace ID associated with the issue.", + "type": "string", + "x-go-name": "SlackWorkspaceID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "snoozed_until_time": { + "description": "The time the issue was snoozed until in RFC3339 format, if any.", + "type": "string", + "x-go-name": "SnoozedUntilTime" + }, + "source": { + "description": "The source of the issue.\n\n* slack IssueSourceSlack\n\n* microsoft_teams IssueSourceMicrosoftTeams\n\n* microsoft_teams_chat IssueSourceMicrosoftTeamsChat\n\n* chat_widget IssueSourceChatWidget\n\n* email IssueSourceEmail\n\n* manual IssueSourceManual\n\n* form IssueSourceForm\n\n* discord IssueSourceDiscord", + "enum": [ + "slack", + "microsoft_teams", + "microsoft_teams_chat", + "chat_widget", + "email", + "manual", + "form", + "discord" + ], + "type": "string", + "x-go-enum-desc": "slack IssueSourceSlack\nmicrosoft_teams IssueSourceMicrosoftTeams\nmicrosoft_teams_chat IssueSourceMicrosoftTeamsChat\nchat_widget IssueSourceChatWidget\nemail IssueSourceEmail\nmanual IssueSourceManual\nform IssueSourceForm\ndiscord IssueSourceDiscord", + "x-go-name": "Source" + }, + "state": { + "description": "The state of the issue. This could be one of `[\"new\", \"waiting_on_you\", \"waiting_on_customer\", \"on_hold\", \"closed\"] or a custom status slug.", + "type": "string", + "x-go-name": "State" + }, + "tags": { + "description": "Tags associated with the issue.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Tags" + }, + "team": { + "properties": { + "id": { + "description": "The ID of the team.", + "type": "string", + "x-go-name": "ID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "title": { + "description": "The title of the issue.", + "type": "string", + "x-go-name": "Title" + }, + "type": { + "description": "The type of the issue.\n\n* Conversation IssueTypeConversation\n\n* Ticket IssueTypeTicket", + "enum": [ + "Conversation", + "Ticket" + ], + "type": "string", + "x-go-enum-desc": "Conversation IssueTypeConversation\nTicket IssueTypeTicket", + "x-go-name": "Type" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "type": "array", + "x-go-name": "Data" + }, + "pagination": { + "properties": { + "cursor": { + "description": "The cursor for the next page of results.", + "type": "string", + "x-go-name": "Cursor" + }, + "has_next_page": { + "description": "Indicates if there is a next page of results.", + "type": "boolean", + "x-go-name": "HasNextPage" + } + }, + "required": [ + "cursor", + "has_next_page" + ], + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "request_id": { + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + } + } + }, + "description": "" + }, + "400": { + "content": { + "application/json": { + "schema": { + "properties": { + "errors": { + "description": "The list of errors.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Errors" + }, + "exists_id": { + "description": "The ID of the object that already exists if this is a duplicate object error.", + "type": "string", + "x-go-name": "ExistsID" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + } + } + }, + "description": "" + }, + "404": { + "content": { + "application/json": { + "schema": { + "properties": { + "errors": { + "description": "The list of errors.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Errors" + }, + "exists_id": { + "description": "The ID of the object that already exists if this is a duplicate object error.", + "type": "string", + "x-go-name": "ExistsID" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + } + } + }, + "description": "" + }, + "500": { + "content": { + "application/json": { + "schema": { + "properties": { + "errors": { + "description": "The list of errors.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Errors" + }, + "exists_id": { + "description": "The ID of the object that already exists if this is a duplicate object error.", + "type": "string", + "x-go-name": "ExistsID" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + } + } + }, + "description": "" + } + }, + "summary": "Search for issues by a given filter", + "tags": [ + "issues" + ], + "x-codegen-request-body-name": "Body", + "x-moar-primitive-count": 7, + "x-moar-complexity-skipped": false + } + }, + "/issues/{id}": { + "delete": { + "description": "Delete an existing issue", + "operationId": "DeleteIssue", + "parameters": [ + { + "description": "The ID of the issue to delete.", + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string", + "x-go-name": "ID" + }, + "x-go-name": "ID" + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "properties": { + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + } + } + }, + "description": "" + } + }, + "tags": [ + "issues" + ], + "x-moar-primitive-count": 0, + "x-moar-complexity-skipped": false + }, + "get": { + "description": "Get an issue by its ID/number", + "operationId": "GetIssue", + "parameters": [ + { + "description": "The ID or number of the issue to fetch.", + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string", + "x-go-name": "ID" + }, + "x-go-name": "ID" + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "properties": { + "account": { + "properties": { + "id": { + "description": "The ID of the account.", + "type": "string", + "x-go-name": "ID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "assignee": { + "properties": { + "email": { + "description": "The email of the user.", + "type": "string", + "x-go-name": "Email" + }, + "id": { + "description": "The ID of the user.", + "type": "string", + "x-go-name": "ID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "attachment_urls": { + "description": "The attachment URLs attached to this issue, if any.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "AttachmentURLs" + }, + "body_html": { + "description": "The body of the issue in HTML format.", + "type": "string", + "x-go-name": "BodyHTML" + }, + "business_hours_first_response_seconds": { + "description": "The business hours time in seconds it took for the first response to the issue, if any.", + "format": "int64", + "type": "integer", + "x-go-name": "BusinessHoursFirstResponseSeconds" + }, + "business_hours_resolution_seconds": { + "description": "The business hours time in seconds it took for the issue to be resolved, if any.", + "format": "int64", + "type": "integer", + "x-go-name": "BusinessHoursResolutionSeconds" + }, + "chat_widget_info": { + "properties": { + "page_url": { + "description": "The URL of the page that the user was on when they started the chat widget issue.", + "type": "string", + "x-go-name": "PageURL" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "created_at": { + "description": "The time the issue was created.", + "type": "string", + "x-go-name": "CreatedAt" + }, + "csat_responses": { + "description": "The CSAT responses of the issue, if any.", + "items": { + "properties": { + "comment": { + "description": "The comment of the CSAT response.", + "type": "string", + "x-go-name": "Comment" + }, + "score": { + "description": "The score of the CSAT response.", + "format": "int64", + "type": "integer", + "x-go-name": "Score" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "type": "array", + "x-go-name": "CSATResponses" + }, + "custom_fields": { + "additionalProperties": { + "properties": { + "slug": { + "description": "The slug of the custom field.", + "type": "string", + "x-go-name": "Slug" + }, + "value": { + "description": "The value of the custom field. Only to be used for single-valued custom fields. If unset, the custom field will be unset. If the custom field is a select field, the value must be the select option slug, which you can find from the GET /custom-fields endpoint.", + "type": "string", + "x-go-name": "Value" + }, + "values": { + "description": "The values of the custom field. Only to be used for multi-valued custom fields (ex. multiselect). If unset, the custom field will be unset. If the custom field is a multiselect field, the values must be the select option slugs which you can find from the GET /custom-fields endpoint.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Values" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "description": "Custom field values associated with the issue.", + "type": "object", + "x-go-name": "CustomFields" + }, + "customer_portal_visible": { + "description": "Whether the issue is visible in the customer portal.", + "type": "boolean", + "x-go-name": "CustomerPortalVisible" + }, + "external_issues": { + "description": "The external issues associated with the issue, if any.", + "items": { + "properties": { + "external_id": { + "description": "The external ID of the external issue.\n\nJira: ID of the issue (autoincrementing number from 10000).\n\nGitHub: Owner/Repo/IssueID.\n\nLinear: ID of the issue (UUID).\n\nAsana: ID of the task (Long number).", + "type": "string", + "x-go-name": "ExternalID" + }, + "link": { + "description": "Link to the product issue.", + "type": "string", + "x-go-name": "Link" + }, + "source": { + "description": "The source of the external issue.", + "type": "string", + "x-go-name": "Source" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "type": "array", + "x-go-name": "ExternalIssues" + }, + "first_response_seconds": { + "description": "The time in seconds it took for the first response to the issue, if any.", + "format": "int64", + "type": "integer", + "x-go-name": "FirstResponseSeconds" + }, + "first_response_time": { + "description": "The time of the first response to the issue, if any.", + "type": "string", + "x-go-name": "FirstResponseTime" + }, + "id": { + "description": "The ID of the issue.", + "type": "string", + "x-go-name": "ID" + }, + "latest_message_time": { + "description": "The time of the latest message in the issue.", + "type": "string", + "x-go-name": "LatestMessageTime" + }, + "link": { + "description": "The link to the issue in Pylon.", + "type": "string", + "x-go-name": "Link" + }, + "number": { + "description": "The number of the issue.", + "format": "int64", + "type": "integer", + "x-go-name": "Number" + }, + "number_of_touches": { + "description": "The number of times the issue has been touched.", + "format": "int64", + "type": "integer", + "x-go-name": "NumberOfTouches" + }, + "requester": { + "properties": { + "email": { + "description": "The email of the contact.", + "type": "string", + "x-go-name": "Email" + }, + "id": { + "description": "The ID of the contact.", + "type": "string", + "x-go-name": "ID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "resolution_seconds": { + "description": "The time in seconds it took for the issue to be resolved, if any.", + "format": "int64", + "type": "integer", + "x-go-name": "ResolutionSeconds" + }, + "resolution_time": { + "description": "The time of the resolution of the issue, if any.", + "type": "string", + "x-go-name": "ResolutionTime" + }, + "slack": { + "properties": { + "channel_id": { + "description": "The Slack channel ID associated with the issue.", + "type": "string", + "x-go-name": "SlackChannelID" + }, + "message_ts": { + "description": "The root message ID of slack message that started issue.", + "type": "string", + "x-go-name": "SlackMessageTs" + }, + "workspace_id": { + "description": "The Slack workspace ID associated with the issue.", + "type": "string", + "x-go-name": "SlackWorkspaceID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "snoozed_until_time": { + "description": "The time the issue was snoozed until in RFC3339 format, if any.", + "type": "string", + "x-go-name": "SnoozedUntilTime" + }, + "source": { + "description": "The source of the issue.\n\n* slack IssueSourceSlack\n\n* microsoft_teams IssueSourceMicrosoftTeams\n\n* microsoft_teams_chat IssueSourceMicrosoftTeamsChat\n\n* chat_widget IssueSourceChatWidget\n\n* email IssueSourceEmail\n\n* manual IssueSourceManual\n\n* form IssueSourceForm\n\n* discord IssueSourceDiscord", + "enum": [ + "slack", + "microsoft_teams", + "microsoft_teams_chat", + "chat_widget", + "email", + "manual", + "form", + "discord" + ], + "type": "string", + "x-go-enum-desc": "slack IssueSourceSlack\nmicrosoft_teams IssueSourceMicrosoftTeams\nmicrosoft_teams_chat IssueSourceMicrosoftTeamsChat\nchat_widget IssueSourceChatWidget\nemail IssueSourceEmail\nmanual IssueSourceManual\nform IssueSourceForm\ndiscord IssueSourceDiscord", + "x-go-name": "Source" + }, + "state": { + "description": "The state of the issue. This could be one of `[\"new\", \"waiting_on_you\", \"waiting_on_customer\", \"on_hold\", \"closed\"] or a custom status slug.", + "type": "string", + "x-go-name": "State" + }, + "tags": { + "description": "Tags associated with the issue.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Tags" + }, + "team": { + "properties": { + "id": { + "description": "The ID of the team.", + "type": "string", + "x-go-name": "ID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "title": { + "description": "The title of the issue.", + "type": "string", + "x-go-name": "Title" + }, + "type": { + "description": "The type of the issue.\n\n* Conversation IssueTypeConversation\n\n* Ticket IssueTypeTicket", + "enum": [ + "Conversation", + "Ticket" + ], + "type": "string", + "x-go-enum-desc": "Conversation IssueTypeConversation\nTicket IssueTypeTicket", + "x-go-name": "Type" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + } + } + }, + "description": "" + }, + "400": { + "content": { + "application/json": { + "schema": { + "properties": { + "errors": { + "description": "The list of errors.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Errors" + }, + "exists_id": { + "description": "The ID of the object that already exists if this is a duplicate object error.", + "type": "string", + "x-go-name": "ExistsID" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + } + } + }, + "description": "" + }, + "404": { + "content": { + "application/json": { + "schema": { + "properties": { + "errors": { + "description": "The list of errors.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Errors" + }, + "exists_id": { + "description": "The ID of the object that already exists if this is a duplicate object error.", + "type": "string", + "x-go-name": "ExistsID" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + } + } + }, + "description": "" + }, + "500": { + "content": { + "application/json": { + "schema": { + "properties": { + "errors": { + "description": "The list of errors.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Errors" + }, + "exists_id": { + "description": "The ID of the object that already exists if this is a duplicate object error.", + "type": "string", + "x-go-name": "ExistsID" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + } + } + }, + "description": "" + } + }, + "tags": [ + "issues" + ], + "x-moar-primitive-count": 0, + "x-moar-complexity-skipped": false + }, + "patch": { + "description": "Update an existing issue", + "operationId": "UpdateIssue", + "parameters": [ + { + "description": "The ID of the issue to update.", + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string", + "x-go-name": "ID" + }, + "x-go-name": "ID" + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "properties": { + "account_id": { + "description": "The ID of the account that this issue belongs to. Only supported on issues with source: [\"manual\", \"form\", \"email\"].", + "type": "string", + "x-go-name": "AccountID" + }, + "assignee_id": { + "description": "The ID of the user who should be assigned to this issue. If empty string is passed in, the issue assignee will be removed.", + "type": "string", + "x-go-name": "AssigneeID" + }, + "custom_fields": { + "description": "An array of custom fields to be used on this issue. Only passed in fields will be modified.", + "items": { + "properties": { + "slug": { + "description": "The slug of the custom field.", + "type": "string", + "x-go-name": "Slug" + }, + "value": { + "description": "The value of the custom field. Only to be used for single-valued custom fields. If unset, the custom field will be unset. If the custom field is a select field, the value must be the select option slug, which you can find from the GET /custom-fields endpoint.", + "type": "string", + "x-go-name": "Value" + }, + "values": { + "description": "The values of the custom field. Only to be used for multi-valued custom fields (ex. multiselect). If unset, the custom field will be unset. If the custom field is a multiselect field, the values must be the select option slugs which you can find from the GET /custom-fields endpoint.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Values" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "type": "array", + "x-go-name": "CustomFields" + }, + "customer_portal_visible": { + "description": "Whether the issue should be visible in the customer portal.", + "type": "boolean", + "x-go-name": "CustomerPortalVisible" + }, + "requester_id": { + "description": "The ID of the requester that this issue is on behalf of.", + "type": "string", + "x-go-name": "RequesterID" + }, + "requestor_id": { + "description": "Deprecated: Use requester_id instead.", + "type": "string", + "x-go-name": "RequestorID" + }, + "state": { + "description": "The state this issue should be moved to. Can be one of new, waiting_on_you, waiting_on_customer, on_hold, closed, or a custom status.", + "type": "string", + "x-go-name": "State" + }, + "tags": { + "description": "An array of strings to use as tags on this issue. If provided, the issue tags will be updated to be exactly the given tags.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Tags" + }, + "team_id": { + "description": "The ID of the team this issue should be assigned to. If empty string is passed in, any assigned team will be removed.", + "type": "string", + "x-go-name": "TeamID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + } + } + }, + "required": false + }, + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "properties": { + "account": { + "properties": { + "id": { + "description": "The ID of the account.", + "type": "string", + "x-go-name": "ID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "assignee": { + "properties": { + "email": { + "description": "The email of the user.", + "type": "string", + "x-go-name": "Email" + }, + "id": { + "description": "The ID of the user.", + "type": "string", + "x-go-name": "ID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "attachment_urls": { + "description": "The attachment URLs attached to this issue, if any.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "AttachmentURLs" + }, + "body_html": { + "description": "The body of the issue in HTML format.", + "type": "string", + "x-go-name": "BodyHTML" + }, + "business_hours_first_response_seconds": { + "description": "The business hours time in seconds it took for the first response to the issue, if any.", + "format": "int64", + "type": "integer", + "x-go-name": "BusinessHoursFirstResponseSeconds" + }, + "business_hours_resolution_seconds": { + "description": "The business hours time in seconds it took for the issue to be resolved, if any.", + "format": "int64", + "type": "integer", + "x-go-name": "BusinessHoursResolutionSeconds" + }, + "chat_widget_info": { + "properties": { + "page_url": { + "description": "The URL of the page that the user was on when they started the chat widget issue.", + "type": "string", + "x-go-name": "PageURL" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "created_at": { + "description": "The time the issue was created.", + "type": "string", + "x-go-name": "CreatedAt" + }, + "csat_responses": { + "description": "The CSAT responses of the issue, if any.", + "items": { + "properties": { + "comment": { + "description": "The comment of the CSAT response.", + "type": "string", + "x-go-name": "Comment" + }, + "score": { + "description": "The score of the CSAT response.", + "format": "int64", + "type": "integer", + "x-go-name": "Score" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "type": "array", + "x-go-name": "CSATResponses" + }, + "custom_fields": { + "additionalProperties": { + "properties": { + "slug": { + "description": "The slug of the custom field.", + "type": "string", + "x-go-name": "Slug" + }, + "value": { + "description": "The value of the custom field. Only to be used for single-valued custom fields. If unset, the custom field will be unset. If the custom field is a select field, the value must be the select option slug, which you can find from the GET /custom-fields endpoint.", + "type": "string", + "x-go-name": "Value" + }, + "values": { + "description": "The values of the custom field. Only to be used for multi-valued custom fields (ex. multiselect). If unset, the custom field will be unset. If the custom field is a multiselect field, the values must be the select option slugs which you can find from the GET /custom-fields endpoint.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Values" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "description": "Custom field values associated with the issue.", + "type": "object", + "x-go-name": "CustomFields" + }, + "customer_portal_visible": { + "description": "Whether the issue is visible in the customer portal.", + "type": "boolean", + "x-go-name": "CustomerPortalVisible" + }, + "external_issues": { + "description": "The external issues associated with the issue, if any.", + "items": { + "properties": { + "external_id": { + "description": "The external ID of the external issue.\n\nJira: ID of the issue (autoincrementing number from 10000).\n\nGitHub: Owner/Repo/IssueID.\n\nLinear: ID of the issue (UUID).\n\nAsana: ID of the task (Long number).", + "type": "string", + "x-go-name": "ExternalID" + }, + "link": { + "description": "Link to the product issue.", + "type": "string", + "x-go-name": "Link" + }, + "source": { + "description": "The source of the external issue.", + "type": "string", + "x-go-name": "Source" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "type": "array", + "x-go-name": "ExternalIssues" + }, + "first_response_seconds": { + "description": "The time in seconds it took for the first response to the issue, if any.", + "format": "int64", + "type": "integer", + "x-go-name": "FirstResponseSeconds" + }, + "first_response_time": { + "description": "The time of the first response to the issue, if any.", + "type": "string", + "x-go-name": "FirstResponseTime" + }, + "id": { + "description": "The ID of the issue.", + "type": "string", + "x-go-name": "ID" + }, + "latest_message_time": { + "description": "The time of the latest message in the issue.", + "type": "string", + "x-go-name": "LatestMessageTime" + }, + "link": { + "description": "The link to the issue in Pylon.", + "type": "string", + "x-go-name": "Link" + }, + "number": { + "description": "The number of the issue.", + "format": "int64", + "type": "integer", + "x-go-name": "Number" + }, + "number_of_touches": { + "description": "The number of times the issue has been touched.", + "format": "int64", + "type": "integer", + "x-go-name": "NumberOfTouches" + }, + "requester": { + "properties": { + "email": { + "description": "The email of the contact.", + "type": "string", + "x-go-name": "Email" + }, + "id": { + "description": "The ID of the contact.", + "type": "string", + "x-go-name": "ID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "resolution_seconds": { + "description": "The time in seconds it took for the issue to be resolved, if any.", + "format": "int64", + "type": "integer", + "x-go-name": "ResolutionSeconds" + }, + "resolution_time": { + "description": "The time of the resolution of the issue, if any.", + "type": "string", + "x-go-name": "ResolutionTime" + }, + "slack": { + "properties": { + "channel_id": { + "description": "The Slack channel ID associated with the issue.", + "type": "string", + "x-go-name": "SlackChannelID" + }, + "message_ts": { + "description": "The root message ID of slack message that started issue.", + "type": "string", + "x-go-name": "SlackMessageTs" + }, + "workspace_id": { + "description": "The Slack workspace ID associated with the issue.", + "type": "string", + "x-go-name": "SlackWorkspaceID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "snoozed_until_time": { + "description": "The time the issue was snoozed until in RFC3339 format, if any.", + "type": "string", + "x-go-name": "SnoozedUntilTime" + }, + "source": { + "description": "The source of the issue.\n\n* slack IssueSourceSlack\n\n* microsoft_teams IssueSourceMicrosoftTeams\n\n* microsoft_teams_chat IssueSourceMicrosoftTeamsChat\n\n* chat_widget IssueSourceChatWidget\n\n* email IssueSourceEmail\n\n* manual IssueSourceManual\n\n* form IssueSourceForm\n\n* discord IssueSourceDiscord", + "enum": [ + "slack", + "microsoft_teams", + "microsoft_teams_chat", + "chat_widget", + "email", + "manual", + "form", + "discord" + ], + "type": "string", + "x-go-enum-desc": "slack IssueSourceSlack\nmicrosoft_teams IssueSourceMicrosoftTeams\nmicrosoft_teams_chat IssueSourceMicrosoftTeamsChat\nchat_widget IssueSourceChatWidget\nemail IssueSourceEmail\nmanual IssueSourceManual\nform IssueSourceForm\ndiscord IssueSourceDiscord", + "x-go-name": "Source" + }, + "state": { + "description": "The state of the issue. This could be one of `[\"new\", \"waiting_on_you\", \"waiting_on_customer\", \"on_hold\", \"closed\"] or a custom status slug.", + "type": "string", + "x-go-name": "State" + }, + "tags": { + "description": "Tags associated with the issue.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Tags" + }, + "team": { + "properties": { + "id": { + "description": "The ID of the team.", + "type": "string", + "x-go-name": "ID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "title": { + "description": "The title of the issue.", + "type": "string", + "x-go-name": "Title" + }, + "type": { + "description": "The type of the issue.\n\n* Conversation IssueTypeConversation\n\n* Ticket IssueTypeTicket", + "enum": [ + "Conversation", + "Ticket" + ], + "type": "string", + "x-go-enum-desc": "Conversation IssueTypeConversation\nTicket IssueTypeTicket", + "x-go-name": "Type" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + } + } + }, + "description": "" + }, + "400": { + "content": { + "application/json": { + "schema": { + "properties": { + "errors": { + "description": "The list of errors.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Errors" + }, + "exists_id": { + "description": "The ID of the object that already exists if this is a duplicate object error.", + "type": "string", + "x-go-name": "ExistsID" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + } + } + }, + "description": "" + }, + "404": { + "content": { + "application/json": { + "schema": { + "properties": { + "errors": { + "description": "The list of errors.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Errors" + }, + "exists_id": { + "description": "The ID of the object that already exists if this is a duplicate object error.", + "type": "string", + "x-go-name": "ExistsID" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + } + } + }, + "description": "" + }, + "500": { + "content": { + "application/json": { + "schema": { + "properties": { + "errors": { + "description": "The list of errors.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Errors" + }, + "exists_id": { + "description": "The ID of the object that already exists if this is a duplicate object error.", + "type": "string", + "x-go-name": "ExistsID" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + } + } + }, + "description": "" + } + }, + "tags": [ + "issues" + ], + "x-codegen-request-body-name": "Body", + "x-moar-primitive-count": 11, + "x-moar-complexity-skipped": false + } + }, + "/issues/{id}/ai-response": { + "post": { + "description": "Create an AI response for an issue", + "operationId": "CreateIssueAIResponse", + "parameters": [ + { + "description": "The ID or number of the issue to create an AI response for.", + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string", + "x-go-name": "ID" + }, + "x-go-name": "ID" + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "properties": { + "ai_agent_id": { + "description": "The ID of the AI agent to use to create the AI response.", + "type": "string", + "x-go-name": "AIAgentID" + }, + "post_as_internal_note": { + "description": "Whether to post the AI response as an internal note on the issue.", + "type": "boolean", + "x-go-name": "PostAsInternalNote" + } + }, + "required": [ + "ai_agent_id" + ], + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + } + } + }, + "required": false + }, + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "properties": { + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + }, + "response_html": { + "description": "The HTML content of the AI response.", + "type": "string", + "x-go-name": "ResponseHTML" + }, + "response_valid": { + "description": "Whether the AI was able to answer the question.", + "type": "boolean", + "x-go-name": "ResponseValid" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + } + } + }, + "description": "" + }, + "400": { + "content": { + "application/json": { + "schema": { + "properties": { + "errors": { + "description": "The list of errors.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Errors" + }, + "exists_id": { + "description": "The ID of the object that already exists if this is a duplicate object error.", + "type": "string", + "x-go-name": "ExistsID" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + } + } + }, + "description": "" + }, + "404": { + "content": { + "application/json": { + "schema": { + "properties": { + "errors": { + "description": "The list of errors.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Errors" + }, + "exists_id": { + "description": "The ID of the object that already exists if this is a duplicate object error.", + "type": "string", + "x-go-name": "ExistsID" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + } + } + }, + "description": "" + }, + "500": { + "content": { + "application/json": { + "schema": { + "properties": { + "errors": { + "description": "The list of errors.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Errors" + }, + "exists_id": { + "description": "The ID of the object that already exists if this is a duplicate object error.", + "type": "string", + "x-go-name": "ExistsID" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + } + } + }, + "description": "" + } + }, + "tags": [ + "issues" + ], + "x-codegen-request-body-name": "Body", + "x-moar-primitive-count": 2, + "x-moar-complexity-skipped": false + } + }, + "/issues/{id}/external-issues": { + "post": { + "description": "By default, links external issues. To unlink issues, set the operation field to \"unlink\".", + "operationId": "LinkExternalIssue", + "parameters": [ + { + "description": "The ID or number of the issue to link external issues to.", + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string", + "x-go-name": "ID" + }, + "x-go-name": "ID" + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "properties": { + "external_issue_id": { + "description": "The ID of the external issue in the source system.", + "type": "string", + "x-go-name": "ExternalIssueID" + }, + "operation": { + "description": "Operation to perform. Use \"link\" to link issues (default) or \"unlink\" to unlink issues.", + "type": "string", + "x-go-name": "Operation" + }, + "source": { + "description": "The source system of the external issue (e.g., \"linear\", \"asana\", \"jira\", \"github\").", + "type": "string", + "x-go-name": "Source" + } + }, + "required": [ + "external_issue_id", + "source" + ], + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + } + } + }, + "required": false + }, + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "properties": { + "account": { + "properties": { + "id": { + "description": "The ID of the account.", + "type": "string", + "x-go-name": "ID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "assignee": { + "properties": { + "email": { + "description": "The email of the user.", + "type": "string", + "x-go-name": "Email" + }, + "id": { + "description": "The ID of the user.", + "type": "string", + "x-go-name": "ID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "attachment_urls": { + "description": "The attachment URLs attached to this issue, if any.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "AttachmentURLs" + }, + "body_html": { + "description": "The body of the issue in HTML format.", + "type": "string", + "x-go-name": "BodyHTML" + }, + "business_hours_first_response_seconds": { + "description": "The business hours time in seconds it took for the first response to the issue, if any.", + "format": "int64", + "type": "integer", + "x-go-name": "BusinessHoursFirstResponseSeconds" + }, + "business_hours_resolution_seconds": { + "description": "The business hours time in seconds it took for the issue to be resolved, if any.", + "format": "int64", + "type": "integer", + "x-go-name": "BusinessHoursResolutionSeconds" + }, + "chat_widget_info": { + "properties": { + "page_url": { + "description": "The URL of the page that the user was on when they started the chat widget issue.", + "type": "string", + "x-go-name": "PageURL" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "created_at": { + "description": "The time the issue was created.", + "type": "string", + "x-go-name": "CreatedAt" + }, + "csat_responses": { + "description": "The CSAT responses of the issue, if any.", + "items": { + "properties": { + "comment": { + "description": "The comment of the CSAT response.", + "type": "string", + "x-go-name": "Comment" + }, + "score": { + "description": "The score of the CSAT response.", + "format": "int64", + "type": "integer", + "x-go-name": "Score" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "type": "array", + "x-go-name": "CSATResponses" + }, + "custom_fields": { + "additionalProperties": { + "properties": { + "slug": { + "description": "The slug of the custom field.", + "type": "string", + "x-go-name": "Slug" + }, + "value": { + "description": "The value of the custom field. Only to be used for single-valued custom fields. If unset, the custom field will be unset. If the custom field is a select field, the value must be the select option slug, which you can find from the GET /custom-fields endpoint.", + "type": "string", + "x-go-name": "Value" + }, + "values": { + "description": "The values of the custom field. Only to be used for multi-valued custom fields (ex. multiselect). If unset, the custom field will be unset. If the custom field is a multiselect field, the values must be the select option slugs which you can find from the GET /custom-fields endpoint.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Values" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "description": "Custom field values associated with the issue.", + "type": "object", + "x-go-name": "CustomFields" + }, + "customer_portal_visible": { + "description": "Whether the issue is visible in the customer portal.", + "type": "boolean", + "x-go-name": "CustomerPortalVisible" + }, + "external_issues": { + "description": "The external issues associated with the issue, if any.", + "items": { + "properties": { + "external_id": { + "description": "The external ID of the external issue.\n\nJira: ID of the issue (autoincrementing number from 10000).\n\nGitHub: Owner/Repo/IssueID.\n\nLinear: ID of the issue (UUID).\n\nAsana: ID of the task (Long number).", + "type": "string", + "x-go-name": "ExternalID" + }, + "link": { + "description": "Link to the product issue.", + "type": "string", + "x-go-name": "Link" + }, + "source": { + "description": "The source of the external issue.", + "type": "string", + "x-go-name": "Source" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "type": "array", + "x-go-name": "ExternalIssues" + }, + "first_response_seconds": { + "description": "The time in seconds it took for the first response to the issue, if any.", + "format": "int64", + "type": "integer", + "x-go-name": "FirstResponseSeconds" + }, + "first_response_time": { + "description": "The time of the first response to the issue, if any.", + "type": "string", + "x-go-name": "FirstResponseTime" + }, + "id": { + "description": "The ID of the issue.", + "type": "string", + "x-go-name": "ID" + }, + "latest_message_time": { + "description": "The time of the latest message in the issue.", + "type": "string", + "x-go-name": "LatestMessageTime" + }, + "link": { + "description": "The link to the issue in Pylon.", + "type": "string", + "x-go-name": "Link" + }, + "number": { + "description": "The number of the issue.", + "format": "int64", + "type": "integer", + "x-go-name": "Number" + }, + "number_of_touches": { + "description": "The number of times the issue has been touched.", + "format": "int64", + "type": "integer", + "x-go-name": "NumberOfTouches" + }, + "requester": { + "properties": { + "email": { + "description": "The email of the contact.", + "type": "string", + "x-go-name": "Email" + }, + "id": { + "description": "The ID of the contact.", + "type": "string", + "x-go-name": "ID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "resolution_seconds": { + "description": "The time in seconds it took for the issue to be resolved, if any.", + "format": "int64", + "type": "integer", + "x-go-name": "ResolutionSeconds" + }, + "resolution_time": { + "description": "The time of the resolution of the issue, if any.", + "type": "string", + "x-go-name": "ResolutionTime" + }, + "slack": { + "properties": { + "channel_id": { + "description": "The Slack channel ID associated with the issue.", + "type": "string", + "x-go-name": "SlackChannelID" + }, + "message_ts": { + "description": "The root message ID of slack message that started issue.", + "type": "string", + "x-go-name": "SlackMessageTs" + }, + "workspace_id": { + "description": "The Slack workspace ID associated with the issue.", + "type": "string", + "x-go-name": "SlackWorkspaceID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "snoozed_until_time": { + "description": "The time the issue was snoozed until in RFC3339 format, if any.", + "type": "string", + "x-go-name": "SnoozedUntilTime" + }, + "source": { + "description": "The source of the issue.\n\n* slack IssueSourceSlack\n\n* microsoft_teams IssueSourceMicrosoftTeams\n\n* microsoft_teams_chat IssueSourceMicrosoftTeamsChat\n\n* chat_widget IssueSourceChatWidget\n\n* email IssueSourceEmail\n\n* manual IssueSourceManual\n\n* form IssueSourceForm\n\n* discord IssueSourceDiscord", + "enum": [ + "slack", + "microsoft_teams", + "microsoft_teams_chat", + "chat_widget", + "email", + "manual", + "form", + "discord" + ], + "type": "string", + "x-go-enum-desc": "slack IssueSourceSlack\nmicrosoft_teams IssueSourceMicrosoftTeams\nmicrosoft_teams_chat IssueSourceMicrosoftTeamsChat\nchat_widget IssueSourceChatWidget\nemail IssueSourceEmail\nmanual IssueSourceManual\nform IssueSourceForm\ndiscord IssueSourceDiscord", + "x-go-name": "Source" + }, + "state": { + "description": "The state of the issue. This could be one of `[\"new\", \"waiting_on_you\", \"waiting_on_customer\", \"on_hold\", \"closed\"] or a custom status slug.", + "type": "string", + "x-go-name": "State" + }, + "tags": { + "description": "Tags associated with the issue.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Tags" + }, + "team": { + "properties": { + "id": { + "description": "The ID of the team.", + "type": "string", + "x-go-name": "ID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "title": { + "description": "The title of the issue.", + "type": "string", + "x-go-name": "Title" + }, + "type": { + "description": "The type of the issue.\n\n* Conversation IssueTypeConversation\n\n* Ticket IssueTypeTicket", + "enum": [ + "Conversation", + "Ticket" + ], + "type": "string", + "x-go-enum-desc": "Conversation IssueTypeConversation\nTicket IssueTypeTicket", + "x-go-name": "Type" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + } + } + }, + "description": "" + }, + "400": { + "content": { + "application/json": { + "schema": { + "properties": { + "errors": { + "description": "The list of errors.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Errors" + }, + "exists_id": { + "description": "The ID of the object that already exists if this is a duplicate object error.", + "type": "string", + "x-go-name": "ExistsID" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + } + } + }, + "description": "" + }, + "404": { + "content": { + "application/json": { + "schema": { + "properties": { + "errors": { + "description": "The list of errors.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Errors" + }, + "exists_id": { + "description": "The ID of the object that already exists if this is a duplicate object error.", + "type": "string", + "x-go-name": "ExistsID" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + } + } + }, + "description": "" + }, + "500": { + "content": { + "application/json": { + "schema": { + "properties": { + "errors": { + "description": "The list of errors.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Errors" + }, + "exists_id": { + "description": "The ID of the object that already exists if this is a duplicate object error.", + "type": "string", + "x-go-name": "ExistsID" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + } + } + }, + "description": "" + } + }, + "summary": "Link or unlink external issues to/from an issue.", + "tags": [ + "issues" + ], + "x-codegen-request-body-name": "Body", + "x-moar-primitive-count": 3, + "x-moar-complexity-skipped": false + } + }, + "/issues/{id}/followers": { + "get": { + "description": "Get followers of an issue", + "operationId": "GetIssueFollowers", + "parameters": [ + { + "description": "The ID or number of the issue to get followers for.", + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string", + "x-go-name": "ID" + }, + "x-go-name": "ID" + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "description": "The data payload of the response.", + "items": { + "properties": { + "id": { + "description": "The ID of the follower. Either a user or contact ID.", + "type": "string", + "x-go-name": "ID" + }, + "type": { + "description": "The type of follower. Either \"user\" or \"contact\".\n\n* user FollowerTypeUser\n\n* contact FollowerTypeContact", + "enum": [ + "user", + "contact" + ], + "type": "string", + "x-go-enum-desc": "user FollowerTypeUser\ncontact FollowerTypeContact", + "x-go-name": "Type" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "type": "array", + "x-go-name": "Data" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + } + } + }, + "description": "" + }, + "400": { + "content": { + "application/json": { + "schema": { + "properties": { + "errors": { + "description": "The list of errors.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Errors" + }, + "exists_id": { + "description": "The ID of the object that already exists if this is a duplicate object error.", + "type": "string", + "x-go-name": "ExistsID" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + } + } + }, + "description": "" + }, + "404": { + "content": { + "application/json": { + "schema": { + "properties": { + "errors": { + "description": "The list of errors.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Errors" + }, + "exists_id": { + "description": "The ID of the object that already exists if this is a duplicate object error.", + "type": "string", + "x-go-name": "ExistsID" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + } + } + }, + "description": "" + }, + "500": { + "content": { + "application/json": { + "schema": { + "properties": { + "errors": { + "description": "The list of errors.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Errors" + }, + "exists_id": { + "description": "The ID of the object that already exists if this is a duplicate object error.", + "type": "string", + "x-go-name": "ExistsID" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + } + } + }, + "description": "" + } + }, + "tags": [ + "issues" + ], + "x-moar-primitive-count": 0, + "x-moar-complexity-skipped": false + }, + "post": { + "description": "By default, adds followers. To remove followers, set the operation field to \"remove\".", + "operationId": "AddIssueFollowers", + "parameters": [ + { + "description": "The ID or number of the issue to add followers to.", + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string", + "x-go-name": "ID" + }, + "x-go-name": "ID" + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "properties": { + "contact_ids": { + "description": "The IDs of contacts to add as followers.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "ContactIDs" + }, + "operation": { + "description": "Operation to perform. Use \"add\" to add followers (default) or \"remove\" to remove followers.", + "type": "string", + "x-go-name": "Operation" + }, + "user_ids": { + "description": "The IDs of users to add as followers.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "UserIDs" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + } + } + }, + "required": false + }, + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "description": "The data payload of the response.", + "items": { + "properties": { + "id": { + "description": "The ID of the follower. Either a user or contact ID.", + "type": "string", + "x-go-name": "ID" + }, + "type": { + "description": "The type of follower. Either \"user\" or \"contact\".\n\n* user FollowerTypeUser\n\n* contact FollowerTypeContact", + "enum": [ + "user", + "contact" + ], + "type": "string", + "x-go-enum-desc": "user FollowerTypeUser\ncontact FollowerTypeContact", + "x-go-name": "Type" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "type": "array", + "x-go-name": "Data" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + } + } + }, + "description": "" + }, + "400": { + "content": { + "application/json": { + "schema": { + "properties": { + "errors": { + "description": "The list of errors.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Errors" + }, + "exists_id": { + "description": "The ID of the object that already exists if this is a duplicate object error.", + "type": "string", + "x-go-name": "ExistsID" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + } + } + }, + "description": "" + }, + "404": { + "content": { + "application/json": { + "schema": { + "properties": { + "errors": { + "description": "The list of errors.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Errors" + }, + "exists_id": { + "description": "The ID of the object that already exists if this is a duplicate object error.", + "type": "string", + "x-go-name": "ExistsID" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + } + } + }, + "description": "" + }, + "500": { + "content": { + "application/json": { + "schema": { + "properties": { + "errors": { + "description": "The list of errors.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Errors" + }, + "exists_id": { + "description": "The ID of the object that already exists if this is a duplicate object error.", + "type": "string", + "x-go-name": "ExistsID" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + } + } + }, + "description": "" + } + }, + "summary": "Add or remove followers to/from an issue.", + "tags": [ + "issues" + ], + "x-codegen-request-body-name": "Body", + "x-moar-primitive-count": 3, + "x-moar-complexity-skipped": false + } + }, + "/issues/{id}/messages": { + "get": { + "description": "Get messages for an issue", + "operationId": "GetIssueMessages", + "parameters": [ + { + "description": "The ID of the issue to fetch messages for.", + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string", + "x-go-name": "ID" + }, + "x-go-name": "ID" + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "description": "The data payload of the response.", + "items": { + "properties": { + "author": { + "properties": { + "avatar_url": { + "type": "string", + "x-go-name": "AvatarURL" + }, + "contact": { + "properties": { + "email": { + "description": "The email of the contact.", + "type": "string", + "x-go-name": "Email" + }, + "id": { + "description": "The ID of the contact.", + "type": "string", + "x-go-name": "ID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "name": { + "type": "string", + "x-go-name": "Name" + }, + "user": { + "properties": { + "email": { + "description": "The email of the user.", + "type": "string", + "x-go-name": "Email" + }, + "id": { + "description": "The ID of the user.", + "type": "string", + "x-go-name": "ID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "email_info": { + "properties": { + "bcc_emails": { + "description": "The email addresses of the BCC recipients of the message.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "BccEmails" + }, + "cc_emails": { + "description": "The email addresses of the CC recipients of the message.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "CcEmails" + }, + "from_email": { + "description": "The email address of the sender of the message.", + "type": "string", + "x-go-name": "FromEmail" + }, + "to_emails": { + "description": "The email addresses of the recipients of the message.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "ToEmails" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "file_urls": { + "description": "The URLs of the files in the message, if any.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "FileURLs" + }, + "id": { + "description": "The ID of the message.", + "type": "string", + "x-go-name": "ID" + }, + "is_private": { + "description": "Indicates if the message is private.", + "type": "boolean", + "x-go-name": "IsPrivate" + }, + "message_html": { + "description": "The HTML body of the message.", + "type": "string", + "x-go-name": "MessageHTML" + }, + "source": { + "description": "The source of the message.", + "type": "string", + "x-go-name": "Source" + }, + "thread_id": { + "description": "The ID of the thread the message belongs to. This is only set for internal notes.", + "type": "string", + "x-go-name": "ThreadID" + }, + "timestamp": { + "description": "The time at which the message was created.", + "type": "string", + "x-go-name": "Timestamp" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "type": "array", + "x-go-name": "Data" + }, + "pagination": { + "properties": { + "cursor": { + "description": "The cursor for the next page of results.", + "type": "string", + "x-go-name": "Cursor" + }, + "has_next_page": { + "description": "Indicates if there is a next page of results.", + "type": "boolean", + "x-go-name": "HasNextPage" + } + }, + "required": [ + "cursor", + "has_next_page" + ], + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + } + } + }, + "description": "" + }, + "400": { + "content": { + "application/json": { + "schema": { + "properties": { + "errors": { + "description": "The list of errors.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Errors" + }, + "exists_id": { + "description": "The ID of the object that already exists if this is a duplicate object error.", + "type": "string", + "x-go-name": "ExistsID" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + } + } + }, + "description": "" + }, + "404": { + "content": { + "application/json": { + "schema": { + "properties": { + "errors": { + "description": "The list of errors.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Errors" + }, + "exists_id": { + "description": "The ID of the object that already exists if this is a duplicate object error.", + "type": "string", + "x-go-name": "ExistsID" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + } + } + }, + "description": "" + }, + "500": { + "content": { + "application/json": { + "schema": { + "properties": { + "errors": { + "description": "The list of errors.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Errors" + }, + "exists_id": { + "description": "The ID of the object that already exists if this is a duplicate object error.", + "type": "string", + "x-go-name": "ExistsID" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + } + } + }, + "description": "" + } + }, + "tags": [ + "messages" + ], + "x-moar-primitive-count": 0, + "x-moar-complexity-skipped": false + } + }, + "/issues/{id}/messages/{message_id}/redact": { + "post": { + "description": "Redact a message", + "operationId": "RedactMessage", + "parameters": [ + { + "description": "The ID of the issue that the message belongs to.", + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string", + "x-go-name": "ID" + }, + "x-go-name": "ID" + }, + { + "description": "The ID of the message to redact.", + "in": "path", + "name": "message_id", + "required": true, + "schema": { + "type": "string", + "x-go-name": "MessageID" + }, + "x-go-name": "MessageID" + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "properties": { + "author": { + "properties": { + "avatar_url": { + "type": "string", + "x-go-name": "AvatarURL" + }, + "contact": { + "properties": { + "email": { + "description": "The email of the contact.", + "type": "string", + "x-go-name": "Email" + }, + "id": { + "description": "The ID of the contact.", + "type": "string", + "x-go-name": "ID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "name": { + "type": "string", + "x-go-name": "Name" + }, + "user": { + "properties": { + "email": { + "description": "The email of the user.", + "type": "string", + "x-go-name": "Email" + }, + "id": { + "description": "The ID of the user.", + "type": "string", + "x-go-name": "ID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "email_info": { + "properties": { + "bcc_emails": { + "description": "The email addresses of the BCC recipients of the message.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "BccEmails" + }, + "cc_emails": { + "description": "The email addresses of the CC recipients of the message.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "CcEmails" + }, + "from_email": { + "description": "The email address of the sender of the message.", + "type": "string", + "x-go-name": "FromEmail" + }, + "to_emails": { + "description": "The email addresses of the recipients of the message.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "ToEmails" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "file_urls": { + "description": "The URLs of the files in the message, if any.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "FileURLs" + }, + "id": { + "description": "The ID of the message.", + "type": "string", + "x-go-name": "ID" + }, + "is_private": { + "description": "Indicates if the message is private.", + "type": "boolean", + "x-go-name": "IsPrivate" + }, + "message_html": { + "description": "The HTML body of the message.", + "type": "string", + "x-go-name": "MessageHTML" + }, + "source": { + "description": "The source of the message.", + "type": "string", + "x-go-name": "Source" + }, + "thread_id": { + "description": "The ID of the thread the message belongs to. This is only set for internal notes.", + "type": "string", + "x-go-name": "ThreadID" + }, + "timestamp": { + "description": "The time at which the message was created.", + "type": "string", + "x-go-name": "Timestamp" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + } + } + }, + "description": "" + }, + "400": { + "content": { + "application/json": { + "schema": { + "properties": { + "errors": { + "description": "The list of errors.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Errors" + }, + "exists_id": { + "description": "The ID of the object that already exists if this is a duplicate object error.", + "type": "string", + "x-go-name": "ExistsID" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + } + } + }, + "description": "" + }, + "404": { + "content": { + "application/json": { + "schema": { + "properties": { + "errors": { + "description": "The list of errors.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Errors" + }, + "exists_id": { + "description": "The ID of the object that already exists if this is a duplicate object error.", + "type": "string", + "x-go-name": "ExistsID" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + } + } + }, + "description": "" + }, + "500": { + "content": { + "application/json": { + "schema": { + "properties": { + "errors": { + "description": "The list of errors.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Errors" + }, + "exists_id": { + "description": "The ID of the object that already exists if this is a duplicate object error.", + "type": "string", + "x-go-name": "ExistsID" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + } + } + }, + "description": "" + } + }, + "tags": [ + "messages" + ], + "x-moar-primitive-count": 0, + "x-moar-complexity-skipped": false + } + }, + "/issues/{id}/note": { + "post": { + "description": "Creates a note on an issue", + "operationId": "CreateIssueNote", + "parameters": [ + { + "description": "The ID of the issue.", + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string", + "x-go-name": "ID" + }, + "x-go-name": "ID" + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "properties": { + "attachment_urls": { + "description": "An array of attachment URLs to attach to this issue.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "AttachmentURLs" + }, + "body_html": { + "description": "The body of the message in HTML.", + "type": "string", + "x-go-name": "BodyHTML" + }, + "message_id": { + "description": "The ID of the message to reply to. This message must be an internal note. You can find this from the GET /issues/{id}/messages endpoint. Either this or thread_id must be provided.", + "type": "string", + "x-go-name": "MessageID" + }, + "thread_id": { + "description": "The ID of the thread to post the note to. You can find this from the GET /issues/{id}/threads endpoint. Either this or message_id must be provided.", + "type": "string", + "x-go-name": "ThreadID" + }, + "user_id": { + "description": "Optional user ID to post the message as. If not provided, the API token user will be used.", + "type": "string", + "x-go-name": "UserID" + } + }, + "required": [ + "body_html" + ], + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + } + } + }, + "required": false + }, + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "properties": { + "id": { + "description": "The ID of the message.", + "type": "string", + "x-go-name": "ID" + }, + "issue_id": { + "description": "The ID of the issue.", + "type": "string", + "x-go-name": "IssueID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + } + } + }, + "description": "" + }, + "400": { + "content": { + "application/json": { + "schema": { + "properties": { + "errors": { + "description": "The list of errors.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Errors" + }, + "exists_id": { + "description": "The ID of the object that already exists if this is a duplicate object error.", + "type": "string", + "x-go-name": "ExistsID" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + } + } + }, + "description": "" + }, + "404": { + "content": { + "application/json": { + "schema": { + "properties": { + "errors": { + "description": "The list of errors.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Errors" + }, + "exists_id": { + "description": "The ID of the object that already exists if this is a duplicate object error.", + "type": "string", + "x-go-name": "ExistsID" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + } + } + }, + "description": "" + }, + "500": { + "content": { + "application/json": { + "schema": { + "properties": { + "errors": { + "description": "The list of errors.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Errors" + }, + "exists_id": { + "description": "The ID of the object that already exists if this is a duplicate object error.", + "type": "string", + "x-go-name": "ExistsID" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + } + } + }, + "description": "" + } + }, + "tags": [ + "messages" + ], + "x-codegen-request-body-name": "Body", + "x-moar-primitive-count": 5, + "x-moar-complexity-skipped": false + } + }, + "/issues/{id}/reply": { + "post": { + "description": "Creates a reply to an existing issue", + "operationId": "CreateIssueReply", + "parameters": [ + { + "description": "The ID of the issue.", + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string", + "x-go-name": "ID" + }, + "x-go-name": "ID" + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "properties": { + "attachment_urls": { + "description": "An array of attachment URLs to attach to this issue.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "AttachmentURLs" + }, + "body_html": { + "description": "The body of the message in HTML.", + "type": "string", + "x-go-name": "BodyHTML" + }, + "contact_id": { + "description": "Optional contact ID to post the message as. Only one of user_id or contact_id can be provided.", + "type": "string", + "x-go-name": "ContactID" + }, + "email_info": { + "properties": { + "bcc_emails": { + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "BccEmails" + }, + "cc_emails": { + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "CcEmails" + }, + "to_emails": { + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "ToEmails" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + }, + "message_id": { + "description": "The ID of the message to reply to.", + "type": "string", + "x-go-name": "MessageID" + }, + "user_id": { + "description": "Optional user ID to post the message as. Only one of user_id or contact_id can be provided.", + "type": "string", + "x-go-name": "UserID" + } + }, + "required": [ + "body_html", + "message_id" + ], + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + } + } + }, + "required": false + }, + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "properties": { + "id": { + "description": "The ID of the message.", + "type": "string", + "x-go-name": "ID" + }, + "issue_id": { + "description": "The ID of the issue.", + "type": "string", + "x-go-name": "IssueID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + } + } + }, + "description": "" + }, + "400": { + "content": { + "application/json": { + "schema": { + "properties": { + "errors": { + "description": "The list of errors.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Errors" + }, + "exists_id": { + "description": "The ID of the object that already exists if this is a duplicate object error.", + "type": "string", + "x-go-name": "ExistsID" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + } + } + }, + "description": "" + }, + "404": { + "content": { + "application/json": { + "schema": { + "properties": { + "errors": { + "description": "The list of errors.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Errors" + }, + "exists_id": { + "description": "The ID of the object that already exists if this is a duplicate object error.", + "type": "string", + "x-go-name": "ExistsID" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + } + } + }, + "description": "" + }, + "500": { + "content": { + "application/json": { + "schema": { + "properties": { + "errors": { + "description": "The list of errors.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Errors" + }, + "exists_id": { + "description": "The ID of the object that already exists if this is a duplicate object error.", + "type": "string", + "x-go-name": "ExistsID" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + } + } + }, + "description": "" + } + }, + "tags": [ + "messages" + ], + "x-codegen-request-body-name": "Body", + "x-moar-primitive-count": 8, + "x-moar-complexity-skipped": false + } + }, + "/issues/{id}/snooze": { + "post": { + "description": "Snooze an issue", + "operationId": "SnoozeIssue", + "parameters": [ + { + "description": "The ID or number of the issue to snooze.", + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string", + "x-go-name": "ID" + }, + "x-go-name": "ID" + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "properties": { + "snooze_until": { + "description": "The date and time to snooze the issue until. (RFC3339)", + "type": "string", + "x-go-name": "SnoozeUntil" + } + }, + "required": [ + "snooze_until" + ], + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + } + } + }, + "required": false + }, + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "properties": { + "account": { + "properties": { + "id": { + "description": "The ID of the account.", + "type": "string", + "x-go-name": "ID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "assignee": { + "properties": { + "email": { + "description": "The email of the user.", + "type": "string", + "x-go-name": "Email" + }, + "id": { + "description": "The ID of the user.", + "type": "string", + "x-go-name": "ID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "attachment_urls": { + "description": "The attachment URLs attached to this issue, if any.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "AttachmentURLs" + }, + "body_html": { + "description": "The body of the issue in HTML format.", + "type": "string", + "x-go-name": "BodyHTML" + }, + "business_hours_first_response_seconds": { + "description": "The business hours time in seconds it took for the first response to the issue, if any.", + "format": "int64", + "type": "integer", + "x-go-name": "BusinessHoursFirstResponseSeconds" + }, + "business_hours_resolution_seconds": { + "description": "The business hours time in seconds it took for the issue to be resolved, if any.", + "format": "int64", + "type": "integer", + "x-go-name": "BusinessHoursResolutionSeconds" + }, + "chat_widget_info": { + "properties": { + "page_url": { + "description": "The URL of the page that the user was on when they started the chat widget issue.", + "type": "string", + "x-go-name": "PageURL" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "created_at": { + "description": "The time the issue was created.", + "type": "string", + "x-go-name": "CreatedAt" + }, + "csat_responses": { + "description": "The CSAT responses of the issue, if any.", + "items": { + "properties": { + "comment": { + "description": "The comment of the CSAT response.", + "type": "string", + "x-go-name": "Comment" + }, + "score": { + "description": "The score of the CSAT response.", + "format": "int64", + "type": "integer", + "x-go-name": "Score" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "type": "array", + "x-go-name": "CSATResponses" + }, + "custom_fields": { + "additionalProperties": { + "properties": { + "slug": { + "description": "The slug of the custom field.", + "type": "string", + "x-go-name": "Slug" + }, + "value": { + "description": "The value of the custom field. Only to be used for single-valued custom fields. If unset, the custom field will be unset. If the custom field is a select field, the value must be the select option slug, which you can find from the GET /custom-fields endpoint.", + "type": "string", + "x-go-name": "Value" + }, + "values": { + "description": "The values of the custom field. Only to be used for multi-valued custom fields (ex. multiselect). If unset, the custom field will be unset. If the custom field is a multiselect field, the values must be the select option slugs which you can find from the GET /custom-fields endpoint.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Values" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "description": "Custom field values associated with the issue.", + "type": "object", + "x-go-name": "CustomFields" + }, + "customer_portal_visible": { + "description": "Whether the issue is visible in the customer portal.", + "type": "boolean", + "x-go-name": "CustomerPortalVisible" + }, + "external_issues": { + "description": "The external issues associated with the issue, if any.", + "items": { + "properties": { + "external_id": { + "description": "The external ID of the external issue.\n\nJira: ID of the issue (autoincrementing number from 10000).\n\nGitHub: Owner/Repo/IssueID.\n\nLinear: ID of the issue (UUID).\n\nAsana: ID of the task (Long number).", + "type": "string", + "x-go-name": "ExternalID" + }, + "link": { + "description": "Link to the product issue.", + "type": "string", + "x-go-name": "Link" + }, + "source": { + "description": "The source of the external issue.", + "type": "string", + "x-go-name": "Source" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "type": "array", + "x-go-name": "ExternalIssues" + }, + "first_response_seconds": { + "description": "The time in seconds it took for the first response to the issue, if any.", + "format": "int64", + "type": "integer", + "x-go-name": "FirstResponseSeconds" + }, + "first_response_time": { + "description": "The time of the first response to the issue, if any.", + "type": "string", + "x-go-name": "FirstResponseTime" + }, + "id": { + "description": "The ID of the issue.", + "type": "string", + "x-go-name": "ID" + }, + "latest_message_time": { + "description": "The time of the latest message in the issue.", + "type": "string", + "x-go-name": "LatestMessageTime" + }, + "link": { + "description": "The link to the issue in Pylon.", + "type": "string", + "x-go-name": "Link" + }, + "number": { + "description": "The number of the issue.", + "format": "int64", + "type": "integer", + "x-go-name": "Number" + }, + "number_of_touches": { + "description": "The number of times the issue has been touched.", + "format": "int64", + "type": "integer", + "x-go-name": "NumberOfTouches" + }, + "requester": { + "properties": { + "email": { + "description": "The email of the contact.", + "type": "string", + "x-go-name": "Email" + }, + "id": { + "description": "The ID of the contact.", + "type": "string", + "x-go-name": "ID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "resolution_seconds": { + "description": "The time in seconds it took for the issue to be resolved, if any.", + "format": "int64", + "type": "integer", + "x-go-name": "ResolutionSeconds" + }, + "resolution_time": { + "description": "The time of the resolution of the issue, if any.", + "type": "string", + "x-go-name": "ResolutionTime" + }, + "slack": { + "properties": { + "channel_id": { + "description": "The Slack channel ID associated with the issue.", + "type": "string", + "x-go-name": "SlackChannelID" + }, + "message_ts": { + "description": "The root message ID of slack message that started issue.", + "type": "string", + "x-go-name": "SlackMessageTs" + }, + "workspace_id": { + "description": "The Slack workspace ID associated with the issue.", + "type": "string", + "x-go-name": "SlackWorkspaceID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "snoozed_until_time": { + "description": "The time the issue was snoozed until in RFC3339 format, if any.", + "type": "string", + "x-go-name": "SnoozedUntilTime" + }, + "source": { + "description": "The source of the issue.\n\n* slack IssueSourceSlack\n\n* microsoft_teams IssueSourceMicrosoftTeams\n\n* microsoft_teams_chat IssueSourceMicrosoftTeamsChat\n\n* chat_widget IssueSourceChatWidget\n\n* email IssueSourceEmail\n\n* manual IssueSourceManual\n\n* form IssueSourceForm\n\n* discord IssueSourceDiscord", + "enum": [ + "slack", + "microsoft_teams", + "microsoft_teams_chat", + "chat_widget", + "email", + "manual", + "form", + "discord" + ], + "type": "string", + "x-go-enum-desc": "slack IssueSourceSlack\nmicrosoft_teams IssueSourceMicrosoftTeams\nmicrosoft_teams_chat IssueSourceMicrosoftTeamsChat\nchat_widget IssueSourceChatWidget\nemail IssueSourceEmail\nmanual IssueSourceManual\nform IssueSourceForm\ndiscord IssueSourceDiscord", + "x-go-name": "Source" + }, + "state": { + "description": "The state of the issue. This could be one of `[\"new\", \"waiting_on_you\", \"waiting_on_customer\", \"on_hold\", \"closed\"] or a custom status slug.", + "type": "string", + "x-go-name": "State" + }, + "tags": { + "description": "Tags associated with the issue.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Tags" + }, + "team": { + "properties": { + "id": { + "description": "The ID of the team.", + "type": "string", + "x-go-name": "ID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "title": { + "description": "The title of the issue.", + "type": "string", + "x-go-name": "Title" + }, + "type": { + "description": "The type of the issue.\n\n* Conversation IssueTypeConversation\n\n* Ticket IssueTypeTicket", + "enum": [ + "Conversation", + "Ticket" + ], + "type": "string", + "x-go-enum-desc": "Conversation IssueTypeConversation\nTicket IssueTypeTicket", + "x-go-name": "Type" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + } + } + }, + "description": "" + }, + "400": { + "content": { + "application/json": { + "schema": { + "properties": { + "errors": { + "description": "The list of errors.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Errors" + }, + "exists_id": { + "description": "The ID of the object that already exists if this is a duplicate object error.", + "type": "string", + "x-go-name": "ExistsID" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + } + } + }, + "description": "" + }, + "404": { + "content": { + "application/json": { + "schema": { + "properties": { + "errors": { + "description": "The list of errors.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Errors" + }, + "exists_id": { + "description": "The ID of the object that already exists if this is a duplicate object error.", + "type": "string", + "x-go-name": "ExistsID" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + } + } + }, + "description": "" + }, + "500": { + "content": { + "application/json": { + "schema": { + "properties": { + "errors": { + "description": "The list of errors.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Errors" + }, + "exists_id": { + "description": "The ID of the object that already exists if this is a duplicate object error.", + "type": "string", + "x-go-name": "ExistsID" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + } + } + }, + "description": "" + } + }, + "tags": [ + "issues" + ], + "x-codegen-request-body-name": "Body", + "x-moar-primitive-count": 1, + "x-moar-complexity-skipped": false + } + }, + "/issues/{id}/threads": { + "get": { + "description": "Get threads for an issue", + "operationId": "GetIssueThreads", + "parameters": [ + { + "description": "The ID of the issue to fetch threads for.", + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string", + "x-go-name": "ID" + }, + "x-go-name": "ID" + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "description": "The data payload of the response.", + "items": { + "description": "If a channel ID is set, this thread is being synced with a chat platform", + "properties": { + "channel_id": { + "description": "The ID of the channel that the thread belongs to, if the thread is being synced with a chat platform.", + "type": "string", + "x-go-name": "ChannelID" + }, + "id": { + "description": "The ID of the thread.", + "type": "string", + "x-go-name": "ID" + }, + "issue_id": { + "description": "The issue ID that the thread belongs to.", + "type": "string", + "x-go-name": "IssueID" + }, + "name": { + "description": "The name of the thread.", + "type": "string", + "x-go-name": "Name" + }, + "source": { + "description": "The source of the thread.", + "type": "string", + "x-go-name": "Source" + }, + "thread_id": { + "description": "The ID of the thread that the thread belongs to, if the thread is being synced with a chat platform. A thread ID for Slack would be the thread timestamp.", + "type": "string", + "x-go-name": "ThreadID" + } + }, + "title": "IssueThread is a thread of notes on an issue, meaning that they are for internal discussions and are not visible to the customer. Threads can be created manually through the UI or from triggers.", + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "type": "array", + "x-go-name": "Data" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + } + } + }, + "description": "" + }, + "400": { + "content": { + "application/json": { + "schema": { + "properties": { + "errors": { + "description": "The list of errors.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Errors" + }, + "exists_id": { + "description": "The ID of the object that already exists if this is a duplicate object error.", + "type": "string", + "x-go-name": "ExistsID" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + } + } + }, + "description": "" + }, + "404": { + "content": { + "application/json": { + "schema": { + "properties": { + "errors": { + "description": "The list of errors.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Errors" + }, + "exists_id": { + "description": "The ID of the object that already exists if this is a duplicate object error.", + "type": "string", + "x-go-name": "ExistsID" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + } + } + }, + "description": "" + }, + "500": { + "content": { + "application/json": { + "schema": { + "properties": { + "errors": { + "description": "The list of errors.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Errors" + }, + "exists_id": { + "description": "The ID of the object that already exists if this is a duplicate object error.", + "type": "string", + "x-go-name": "ExistsID" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + } + } + }, + "description": "" + } + }, + "tags": [ + "messages" + ], + "x-moar-primitive-count": 0, + "x-moar-complexity-skipped": false + }, + "post": { + "description": "Create an issue thread for an issue", + "operationId": "CreateIssueThread", + "parameters": [ + { + "description": "The ID of the issue to create a thread for.", + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string", + "x-go-name": "ID" + }, + "x-go-name": "ID" + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "properties": { + "name": { + "description": "The name of the thread.", + "type": "string", + "x-go-name": "Name" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + } + } + }, + "required": false + }, + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "description": "If a channel ID is set, this thread is being synced with a chat platform", + "properties": { + "channel_id": { + "description": "The ID of the channel that the thread belongs to, if the thread is being synced with a chat platform.", + "type": "string", + "x-go-name": "ChannelID" + }, + "id": { + "description": "The ID of the thread.", + "type": "string", + "x-go-name": "ID" + }, + "issue_id": { + "description": "The issue ID that the thread belongs to.", + "type": "string", + "x-go-name": "IssueID" + }, + "name": { + "description": "The name of the thread.", + "type": "string", + "x-go-name": "Name" + }, + "source": { + "description": "The source of the thread.", + "type": "string", + "x-go-name": "Source" + }, + "thread_id": { + "description": "The ID of the thread that the thread belongs to, if the thread is being synced with a chat platform. A thread ID for Slack would be the thread timestamp.", + "type": "string", + "x-go-name": "ThreadID" + } + }, + "title": "IssueThread is a thread of notes on an issue, meaning that they are for internal discussions and are not visible to the customer. Threads can be created manually through the UI or from triggers.", + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + } + } + }, + "description": "" + }, + "400": { + "content": { + "application/json": { + "schema": { + "properties": { + "errors": { + "description": "The list of errors.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Errors" + }, + "exists_id": { + "description": "The ID of the object that already exists if this is a duplicate object error.", + "type": "string", + "x-go-name": "ExistsID" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + } + } + }, + "description": "" + }, + "404": { + "content": { + "application/json": { + "schema": { + "properties": { + "errors": { + "description": "The list of errors.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Errors" + }, + "exists_id": { + "description": "The ID of the object that already exists if this is a duplicate object error.", + "type": "string", + "x-go-name": "ExistsID" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + } + } + }, + "description": "" + }, + "500": { + "content": { + "application/json": { + "schema": { + "properties": { + "errors": { + "description": "The list of errors.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Errors" + }, + "exists_id": { + "description": "The ID of the object that already exists if this is a duplicate object error.", + "type": "string", + "x-go-name": "ExistsID" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + } + } + }, + "description": "" + } + }, + "tags": [ + "messages" + ], + "x-codegen-request-body-name": "Body", + "x-moar-primitive-count": 1, + "x-moar-complexity-skipped": false + } + }, + "/knowledge-bases": { + "get": { + "description": "Get all knowledge bases", + "operationId": "GetKnowledgeBases", + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "description": "The data payload of the response.", + "items": { + "properties": { + "default_language": { + "description": "The default language of the knowledge base.", + "type": "string", + "x-go-name": "DefaultLanguage" + }, + "id": { + "description": "The ID of the knowledge base.", + "type": "string", + "x-go-name": "ID" + }, + "slug": { + "description": "The slug of the knowledge base.", + "type": "string", + "x-go-name": "Slug" + }, + "supported_languages": { + "description": "The list of supported languages for the knowledge base.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "SupportedLanguages" + }, + "title": { + "description": "The name of the knowledge base.", + "type": "string", + "x-go-name": "Title" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "type": "array", + "x-go-name": "Data" + }, + "pagination": { + "properties": { + "cursor": { + "description": "The cursor for the next page of results.", + "type": "string", + "x-go-name": "Cursor" + }, + "has_next_page": { + "description": "Indicates if there is a next page of results.", + "type": "boolean", + "x-go-name": "HasNextPage" + } + }, + "required": [ + "cursor", + "has_next_page" + ], + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + } + } + }, + "description": "" + }, + "400": { + "content": { + "application/json": { + "schema": { + "properties": { + "errors": { + "description": "The list of errors.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Errors" + }, + "exists_id": { + "description": "The ID of the object that already exists if this is a duplicate object error.", + "type": "string", + "x-go-name": "ExistsID" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + } + } + }, + "description": "" + }, + "404": { + "content": { + "application/json": { + "schema": { + "properties": { + "errors": { + "description": "The list of errors.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Errors" + }, + "exists_id": { + "description": "The ID of the object that already exists if this is a duplicate object error.", + "type": "string", + "x-go-name": "ExistsID" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + } + } + }, + "description": "" + }, + "500": { + "content": { + "application/json": { + "schema": { + "properties": { + "errors": { + "description": "The list of errors.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Errors" + }, + "exists_id": { + "description": "The ID of the object that already exists if this is a duplicate object error.", + "type": "string", + "x-go-name": "ExistsID" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + } + } + }, + "description": "" + } + }, + "tags": [ + "knowledge-bases" + ], + "x-moar-primitive-count": 0, + "x-moar-complexity-skipped": false + } + }, + "/knowledge-bases/{id}": { + "get": { + "description": "Get a knowledge base by its ID", + "operationId": "GetKnowledgeBase", + "parameters": [ + { + "description": "The ID of the knowledge base.", + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string", + "x-go-name": "ID" + }, + "x-go-name": "ID" + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "properties": { + "default_language": { + "description": "The default language of the knowledge base.", + "type": "string", + "x-go-name": "DefaultLanguage" + }, + "id": { + "description": "The ID of the knowledge base.", + "type": "string", + "x-go-name": "ID" + }, + "slug": { + "description": "The slug of the knowledge base.", + "type": "string", + "x-go-name": "Slug" + }, + "supported_languages": { + "description": "The list of supported languages for the knowledge base.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "SupportedLanguages" + }, + "title": { + "description": "The name of the knowledge base.", + "type": "string", + "x-go-name": "Title" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + } + } + }, + "description": "" + }, + "400": { + "content": { + "application/json": { + "schema": { + "properties": { + "errors": { + "description": "The list of errors.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Errors" + }, + "exists_id": { + "description": "The ID of the object that already exists if this is a duplicate object error.", + "type": "string", + "x-go-name": "ExistsID" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + } + } + }, + "description": "" + }, + "404": { + "content": { + "application/json": { + "schema": { + "properties": { + "errors": { + "description": "The list of errors.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Errors" + }, + "exists_id": { + "description": "The ID of the object that already exists if this is a duplicate object error.", + "type": "string", + "x-go-name": "ExistsID" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + } + } + }, + "description": "" + }, + "500": { + "content": { + "application/json": { + "schema": { + "properties": { + "errors": { + "description": "The list of errors.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Errors" + }, + "exists_id": { + "description": "The ID of the object that already exists if this is a duplicate object error.", + "type": "string", + "x-go-name": "ExistsID" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + } + } + }, + "description": "" + } + }, + "tags": [ + "knowledge-bases" + ], + "x-moar-primitive-count": 0, + "x-moar-complexity-skipped": false + } + }, + "/knowledge-bases/{id}/articles": { + "post": { + "description": "This endpoint creates a new article in the specified knowledge base. If translations are provided, they will also be created and associated with the article. If the article is published, the translations will also be published.", + "operationId": "CreateArticle", + "parameters": [ + { + "description": "The ID of the knowledge base the article is being added to.", + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string", + "x-go-name": "ID" + }, + "x-go-name": "ID" + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "properties": { + "author_user_id": { + "description": "The ID of the user attributed as the author of the article.", + "type": "string", + "x-go-name": "AuthorUserId" + }, + "body_html": { + "description": "The HTML body of the article.", + "type": "string", + "x-go-name": "BodyHTML" + }, + "collection_id": { + "description": "The id of the collection associated to the article", + "type": "string", + "x-go-name": "CollectionID" + }, + "is_published": { + "description": "Whether the article should be published. Defaults to false.", + "type": "boolean", + "x-go-name": "IsPublished" + }, + "is_unlisted": { + "description": "Whether the article can only be accessible only via direct link. Defaults to false.", + "type": "boolean", + "x-go-name": "IsUnlisted" + }, + "slug": { + "description": "The slug of the article. Defaults to a slug based on the title.", + "type": "string", + "x-go-name": "Slug" + }, + "title": { + "description": "The title of the article.", + "type": "string", + "x-go-name": "Title" + }, + "translations": { + "description": "Translations of the article content in different languages", + "items": { + "properties": { + "body_html": { + "description": "The translated HTML body of the article.", + "type": "string", + "x-go-name": "BodyHTML" + }, + "language": { + "description": "The language code of the translation. Supported language codes can be found in https://docs.usepylon.com/pylon-docs/knowledge-base/translation#supported-language-codes.", + "type": "string", + "x-go-name": "Language" + }, + "title": { + "description": "The translated title of the article.", + "type": "string", + "x-go-name": "Title" + } + }, + "required": [ + "body_html", + "language", + "title" + ], + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + }, + "type": "array", + "x-go-name": "Translations" + }, + "visibility_config": { + "properties": { + "ai_agent_access": { + "description": "AI agent access control for the article. Defaults to inherit from the parent scope when omitted.\n\n* inherit KnowledgeBaseArticleAIAgentAccessInherit Defers the access check to the parent object (Collection or KnowledgeBase).\n\n* none KnowledgeBaseArticleAIAgentAccessNone No AI agents have access to this article.\n\n* specific_agents KnowledgeBaseArticleAIAgentAccessSpecificAgents Only specific AI agents enumerated in the allowlist have access.", + "enum": [ + "inherit", + "none", + "specific_agents" + ], + "type": "string", + "x-go-enum-desc": "inherit KnowledgeBaseArticleAIAgentAccessInherit Defers the access check to the parent object (Collection or KnowledgeBase).\nnone KnowledgeBaseArticleAIAgentAccessNone No AI agents have access to this article.\nspecific_agents KnowledgeBaseArticleAIAgentAccessSpecificAgents Only specific AI agents enumerated in the allowlist have access.", + "x-go-name": "AiAgentAccess" + }, + "allowed_agent_ids": { + "description": "List of AI agent IDs that may access this article when ai_agent_access is set to \"specific_agents\".", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "AllowedAgentIDs" + }, + "customer_visibility_condition": { + "properties": { + "field": { + "description": "The field for this filter. For allowed fields, see the documentation for\n\nthe specific endpoint you are using.\n\nFor non-compound filters (any operators other than \"and\" or \"or\"),\n\nField must be set, along with either Value or Values, depending on the operator.", + "type": "string", + "x-go-name": "Field" + }, + "operator": { + "description": "The operator for this filter.\n\n* equals FilterOperatorEquals Matches objects that are exactly equal to the value in the field.\n\n* not_equals FilterOperatorNotEquals Matches objects that are not exactly equal to the value in the field.\n\n* contains FilterOperatorContains For a multi-valued field, such as tags, this operator will match objects that contain any of the values in the field.\n\n* does_not_contain FilterOperatorDoesNotContain For a multi-valued field, such as tags, this operator will match objects that do not contain any of the values in the field.\n\n* in FilterOperatorIn Matches objects if the field is one of several possible values, as specified in the values array.\n\n* not_in FilterOperatorNotIn Matches objects if the field is none of several possible values, as specified in the values array.\n\n* and FilterOperatorAnd Matches objects only if all subfilters match.\n\n* or FilterOperatorOr Matches objects if any subfilter matches.\n\n* time_is_after FilterOperatorTimeIsAfter Matches objects if the field is after the given time.\n\n* time_is_before FilterOperatorTimeIsBefore Matches objects if the field is before the given time.\n\n* time_range FilterOperatorTimeRange Matches objects if the field is between the given times.\n\n* string_contains FilterOperatorStringContains Matches objects if the field contains the given string.\n\n* string_does_not_contain FilterOperatorStringDoesNotContain Matches objects if the field does not contain the given string.\n\n* is_set FilterOperatorIsSet FilterOperatorIsSet matches objects if the field is set.\n\n* is_unset FilterOperatorIsUnset FilterOperatorIsUnset matches objects if the field is unset.", + "enum": [ + "equals", + "not_equals", + "contains", + "does_not_contain", + "in", + "not_in", + "and", + "or", + "time_is_after", + "time_is_before", + "time_range", + "string_contains", + "string_does_not_contain", + "is_set", + "is_unset" + ], + "type": "string", + "x-go-enum-desc": "equals FilterOperatorEquals Matches objects that are exactly equal to the value in the field.\nnot_equals FilterOperatorNotEquals Matches objects that are not exactly equal to the value in the field.\ncontains FilterOperatorContains For a multi-valued field, such as tags, this operator will match objects that contain any of the values in the field.\ndoes_not_contain FilterOperatorDoesNotContain For a multi-valued field, such as tags, this operator will match objects that do not contain any of the values in the field.\nin FilterOperatorIn Matches objects if the field is one of several possible values, as specified in the values array.\nnot_in FilterOperatorNotIn Matches objects if the field is none of several possible values, as specified in the values array.\nand FilterOperatorAnd Matches objects only if all subfilters match.\nor FilterOperatorOr Matches objects if any subfilter matches.\ntime_is_after FilterOperatorTimeIsAfter Matches objects if the field is after the given time.\ntime_is_before FilterOperatorTimeIsBefore Matches objects if the field is before the given time.\ntime_range FilterOperatorTimeRange Matches objects if the field is between the given times.\nstring_contains FilterOperatorStringContains Matches objects if the field contains the given string.\nstring_does_not_contain FilterOperatorStringDoesNotContain Matches objects if the field does not contain the given string.\nis_set FilterOperatorIsSet FilterOperatorIsSet matches objects if the field is set.\nis_unset FilterOperatorIsUnset FilterOperatorIsUnset matches objects if the field is unset.", + "x-go-name": "Operator" + }, + "subfilters": { + "description": "Sub-filters for this filter. Valid only when operator is \"and\" or \"or\".\n\nThe maximum allowed depth for a tree of filters is 3.", + "items": { + "$ref": "#/components/schemas/Filter", + "has_circular_reference": true + }, + "type": "array", + "x-go-name": "Subfilters" + }, + "value": { + "description": "The value for this filter. Only used for single-valued operators\n\n(\"equals\", \"not_equals\", \"contains\", \"does_not_contain\")", + "type": "string", + "x-go-name": "Value" + }, + "values": { + "description": "The values for this filter. Only used for multi-valued operators (\"in\", \"not_in\").", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Values" + } + }, + "required": [ + "field", + "operator" + ], + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "visibility": { + "description": "The visibility setting of the article.\n\n* public KnowledgeBaseArticleVisibilityPublic\n\n* customer KnowledgeBaseArticleVisibilityCustomer\n\n* internal_only KnowledgeBaseArticleVisibilityInternalOnly", + "enum": [ + "public", + "customer", + "internal_only" + ], + "type": "string", + "x-go-enum-desc": "public KnowledgeBaseArticleVisibilityPublic\ncustomer KnowledgeBaseArticleVisibilityCustomer\ninternal_only KnowledgeBaseArticleVisibilityInternalOnly", + "x-go-name": "Visibility" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + } + }, + "required": [ + "author_user_id", + "body_html", + "title" + ], + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + } + } + }, + "required": false + }, + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "properties": { + "current_published_content_html": { + "description": "The current published content of the article in HTML.", + "type": "string", + "x-go-name": "CurrentPublishedContentHTML" + }, + "id": { + "description": "The ID of the article.", + "type": "string", + "x-go-name": "ID" + }, + "identifier": { + "description": "The identifier of the article", + "type": "string", + "x-go-name": "Identifier" + }, + "is_published": { + "description": "IsPublished indicates if the article is published.", + "type": "boolean", + "x-go-name": "IsPublished" + }, + "last_published_at": { + "description": "The last published at time of the article.", + "type": "string", + "x-go-name": "LastPublishedAt" + }, + "slug": { + "description": "The slug of the article.", + "type": "string", + "x-go-name": "Slug" + }, + "title": { + "description": "The name of the article.", + "type": "string", + "x-go-name": "Title" + }, + "url": { + "description": "The URL of the article.", + "type": "string", + "x-go-name": "URL" + }, + "visibility_config": { + "properties": { + "ai_agent_access": { + "description": "AI agent access control for the article. Defaults to inherit from the parent scope when omitted.\n\n* inherit KnowledgeBaseArticleAIAgentAccessInherit Defers the access check to the parent object (Collection or KnowledgeBase).\n\n* none KnowledgeBaseArticleAIAgentAccessNone No AI agents have access to this article.\n\n* specific_agents KnowledgeBaseArticleAIAgentAccessSpecificAgents Only specific AI agents enumerated in the allowlist have access.", + "enum": [ + "inherit", + "none", + "specific_agents" + ], + "type": "string", + "x-go-enum-desc": "inherit KnowledgeBaseArticleAIAgentAccessInherit Defers the access check to the parent object (Collection or KnowledgeBase).\nnone KnowledgeBaseArticleAIAgentAccessNone No AI agents have access to this article.\nspecific_agents KnowledgeBaseArticleAIAgentAccessSpecificAgents Only specific AI agents enumerated in the allowlist have access.", + "x-go-name": "AiAgentAccess" + }, + "allowed_agent_ids": { + "description": "List of AI agent IDs that may access this article when ai_agent_access is set to \"specific_agents\".", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "AllowedAgentIDs" + }, + "customer_visibility_condition": { + "properties": { + "field": { + "description": "The field for this filter. For allowed fields, see the documentation for\n\nthe specific endpoint you are using.\n\nFor non-compound filters (any operators other than \"and\" or \"or\"),\n\nField must be set, along with either Value or Values, depending on the operator.", + "type": "string", + "x-go-name": "Field" + }, + "operator": { + "description": "The operator for this filter.\n\n* equals FilterOperatorEquals Matches objects that are exactly equal to the value in the field.\n\n* not_equals FilterOperatorNotEquals Matches objects that are not exactly equal to the value in the field.\n\n* contains FilterOperatorContains For a multi-valued field, such as tags, this operator will match objects that contain any of the values in the field.\n\n* does_not_contain FilterOperatorDoesNotContain For a multi-valued field, such as tags, this operator will match objects that do not contain any of the values in the field.\n\n* in FilterOperatorIn Matches objects if the field is one of several possible values, as specified in the values array.\n\n* not_in FilterOperatorNotIn Matches objects if the field is none of several possible values, as specified in the values array.\n\n* and FilterOperatorAnd Matches objects only if all subfilters match.\n\n* or FilterOperatorOr Matches objects if any subfilter matches.\n\n* time_is_after FilterOperatorTimeIsAfter Matches objects if the field is after the given time.\n\n* time_is_before FilterOperatorTimeIsBefore Matches objects if the field is before the given time.\n\n* time_range FilterOperatorTimeRange Matches objects if the field is between the given times.\n\n* string_contains FilterOperatorStringContains Matches objects if the field contains the given string.\n\n* string_does_not_contain FilterOperatorStringDoesNotContain Matches objects if the field does not contain the given string.\n\n* is_set FilterOperatorIsSet FilterOperatorIsSet matches objects if the field is set.\n\n* is_unset FilterOperatorIsUnset FilterOperatorIsUnset matches objects if the field is unset.", + "enum": [ + "equals", + "not_equals", + "contains", + "does_not_contain", + "in", + "not_in", + "and", + "or", + "time_is_after", + "time_is_before", + "time_range", + "string_contains", + "string_does_not_contain", + "is_set", + "is_unset" + ], + "type": "string", + "x-go-enum-desc": "equals FilterOperatorEquals Matches objects that are exactly equal to the value in the field.\nnot_equals FilterOperatorNotEquals Matches objects that are not exactly equal to the value in the field.\ncontains FilterOperatorContains For a multi-valued field, such as tags, this operator will match objects that contain any of the values in the field.\ndoes_not_contain FilterOperatorDoesNotContain For a multi-valued field, such as tags, this operator will match objects that do not contain any of the values in the field.\nin FilterOperatorIn Matches objects if the field is one of several possible values, as specified in the values array.\nnot_in FilterOperatorNotIn Matches objects if the field is none of several possible values, as specified in the values array.\nand FilterOperatorAnd Matches objects only if all subfilters match.\nor FilterOperatorOr Matches objects if any subfilter matches.\ntime_is_after FilterOperatorTimeIsAfter Matches objects if the field is after the given time.\ntime_is_before FilterOperatorTimeIsBefore Matches objects if the field is before the given time.\ntime_range FilterOperatorTimeRange Matches objects if the field is between the given times.\nstring_contains FilterOperatorStringContains Matches objects if the field contains the given string.\nstring_does_not_contain FilterOperatorStringDoesNotContain Matches objects if the field does not contain the given string.\nis_set FilterOperatorIsSet FilterOperatorIsSet matches objects if the field is set.\nis_unset FilterOperatorIsUnset FilterOperatorIsUnset matches objects if the field is unset.", + "x-go-name": "Operator" + }, + "subfilters": { + "description": "Sub-filters for this filter. Valid only when operator is \"and\" or \"or\".\n\nThe maximum allowed depth for a tree of filters is 3.", + "items": { + "$ref": "#/components/schemas/Filter", + "has_circular_reference": true + }, + "type": "array", + "x-go-name": "Subfilters" + }, + "value": { + "description": "The value for this filter. Only used for single-valued operators\n\n(\"equals\", \"not_equals\", \"contains\", \"does_not_contain\")", + "type": "string", + "x-go-name": "Value" + }, + "values": { + "description": "The values for this filter. Only used for multi-valued operators (\"in\", \"not_in\").", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Values" + } + }, + "required": [ + "field", + "operator" + ], + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "visibility": { + "description": "The visibility setting of the article.\n\n* public KnowledgeBaseArticleVisibilityPublic\n\n* customer KnowledgeBaseArticleVisibilityCustomer\n\n* internal_only KnowledgeBaseArticleVisibilityInternalOnly", + "enum": [ + "public", + "customer", + "internal_only" + ], + "type": "string", + "x-go-enum-desc": "public KnowledgeBaseArticleVisibilityPublic\ncustomer KnowledgeBaseArticleVisibilityCustomer\ninternal_only KnowledgeBaseArticleVisibilityInternalOnly", + "x-go-name": "Visibility" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + } + } + }, + "description": "" + }, + "400": { + "content": { + "application/json": { + "schema": { + "properties": { + "errors": { + "description": "The list of errors.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Errors" + }, + "exists_id": { + "description": "The ID of the object that already exists if this is a duplicate object error.", + "type": "string", + "x-go-name": "ExistsID" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + } + } + }, + "description": "" + }, + "404": { + "content": { + "application/json": { + "schema": { + "properties": { + "errors": { + "description": "The list of errors.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Errors" + }, + "exists_id": { + "description": "The ID of the object that already exists if this is a duplicate object error.", + "type": "string", + "x-go-name": "ExistsID" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + } + } + }, + "description": "" + }, + "500": { + "content": { + "application/json": { + "schema": { + "properties": { + "errors": { + "description": "The list of errors.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Errors" + }, + "exists_id": { + "description": "The ID of the object that already exists if this is a duplicate object error.", + "type": "string", + "x-go-name": "ExistsID" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + } + } + }, + "description": "" + } + }, + "summary": "Create a new article", + "tags": [ + "articles" + ], + "x-codegen-request-body-name": "Body", + "x-moar-primitive-count": 18, + "x-moar-complexity-skipped": false + } + }, + "/knowledge-bases/{id}/articles/{article_id}": { + "delete": { + "description": "Delete an existing article", + "operationId": "DeleteArticle", + "parameters": [ + { + "description": "The KnowledgeBaseID of the article to delete.", + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string", + "x-go-name": "KnowledgeBaseID" + }, + "x-go-name": "KnowledgeBaseID" + }, + { + "description": "The ID of the article to delete.", + "in": "path", + "name": "article_id", + "required": true, + "schema": { + "type": "string", + "x-go-name": "ArticleID" + }, + "x-go-name": "ArticleID" + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "properties": { + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + } + } + }, + "description": "" + }, + "400": { + "content": { + "application/json": { + "schema": { + "properties": { + "errors": { + "description": "The list of errors.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Errors" + }, + "exists_id": { + "description": "The ID of the object that already exists if this is a duplicate object error.", + "type": "string", + "x-go-name": "ExistsID" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + } + } + }, + "description": "" + }, + "404": { + "content": { + "application/json": { + "schema": { + "properties": { + "errors": { + "description": "The list of errors.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Errors" + }, + "exists_id": { + "description": "The ID of the object that already exists if this is a duplicate object error.", + "type": "string", + "x-go-name": "ExistsID" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + } + } + }, + "description": "" + }, + "500": { + "content": { + "application/json": { + "schema": { + "properties": { + "errors": { + "description": "The list of errors.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Errors" + }, + "exists_id": { + "description": "The ID of the object that already exists if this is a duplicate object error.", + "type": "string", + "x-go-name": "ExistsID" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + } + } + }, + "description": "" + } + }, + "tags": [ + "articles" + ], + "x-moar-primitive-count": 0, + "x-moar-complexity-skipped": false + }, + "patch": { + "description": "Update an existing article", + "operationId": "UpdateArticle", + "parameters": [ + { + "description": "The KnowledgeBaseID of the article to update.", + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string", + "x-go-name": "KnowledgeBaseID" + }, + "x-go-name": "KnowledgeBaseID" + }, + { + "description": "The ID of the article to update.", + "in": "path", + "name": "article_id", + "required": true, + "schema": { + "type": "string", + "x-go-name": "ArticleID" + }, + "x-go-name": "ArticleID" + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "properties": { + "body_html": { + "description": "The HTML body of the article.", + "type": "string", + "x-go-name": "BodyHTML" + }, + "language": { + "description": "The language code of the translation to update. If not provided, the default language (original article) will be updated.", + "type": "string", + "x-go-name": "Language" + }, + "publish_updated_body_html": { + "description": "Whether the changes to the article should be published. Defaults to false.", + "type": "boolean", + "x-go-name": "PublishUpdatedBodyHTML" + }, + "title": { + "description": "The title of the article.", + "type": "string", + "x-go-name": "Title" + }, + "visibility_config": { + "properties": { + "ai_agent_access": { + "description": "AI agent access control for the article. Defaults to inherit from the parent scope when omitted.\n\n* inherit KnowledgeBaseArticleAIAgentAccessInherit Defers the access check to the parent object (Collection or KnowledgeBase).\n\n* none KnowledgeBaseArticleAIAgentAccessNone No AI agents have access to this article.\n\n* specific_agents KnowledgeBaseArticleAIAgentAccessSpecificAgents Only specific AI agents enumerated in the allowlist have access.", + "enum": [ + "inherit", + "none", + "specific_agents" + ], + "type": "string", + "x-go-enum-desc": "inherit KnowledgeBaseArticleAIAgentAccessInherit Defers the access check to the parent object (Collection or KnowledgeBase).\nnone KnowledgeBaseArticleAIAgentAccessNone No AI agents have access to this article.\nspecific_agents KnowledgeBaseArticleAIAgentAccessSpecificAgents Only specific AI agents enumerated in the allowlist have access.", + "x-go-name": "AiAgentAccess" + }, + "allowed_agent_ids": { + "description": "List of AI agent IDs that may access this article when ai_agent_access is set to \"specific_agents\".", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "AllowedAgentIDs" + }, + "customer_visibility_condition": { + "properties": { + "field": { + "description": "The field for this filter. For allowed fields, see the documentation for\n\nthe specific endpoint you are using.\n\nFor non-compound filters (any operators other than \"and\" or \"or\"),\n\nField must be set, along with either Value or Values, depending on the operator.", + "type": "string", + "x-go-name": "Field" + }, + "operator": { + "description": "The operator for this filter.\n\n* equals FilterOperatorEquals Matches objects that are exactly equal to the value in the field.\n\n* not_equals FilterOperatorNotEquals Matches objects that are not exactly equal to the value in the field.\n\n* contains FilterOperatorContains For a multi-valued field, such as tags, this operator will match objects that contain any of the values in the field.\n\n* does_not_contain FilterOperatorDoesNotContain For a multi-valued field, such as tags, this operator will match objects that do not contain any of the values in the field.\n\n* in FilterOperatorIn Matches objects if the field is one of several possible values, as specified in the values array.\n\n* not_in FilterOperatorNotIn Matches objects if the field is none of several possible values, as specified in the values array.\n\n* and FilterOperatorAnd Matches objects only if all subfilters match.\n\n* or FilterOperatorOr Matches objects if any subfilter matches.\n\n* time_is_after FilterOperatorTimeIsAfter Matches objects if the field is after the given time.\n\n* time_is_before FilterOperatorTimeIsBefore Matches objects if the field is before the given time.\n\n* time_range FilterOperatorTimeRange Matches objects if the field is between the given times.\n\n* string_contains FilterOperatorStringContains Matches objects if the field contains the given string.\n\n* string_does_not_contain FilterOperatorStringDoesNotContain Matches objects if the field does not contain the given string.\n\n* is_set FilterOperatorIsSet FilterOperatorIsSet matches objects if the field is set.\n\n* is_unset FilterOperatorIsUnset FilterOperatorIsUnset matches objects if the field is unset.", + "enum": [ + "equals", + "not_equals", + "contains", + "does_not_contain", + "in", + "not_in", + "and", + "or", + "time_is_after", + "time_is_before", + "time_range", + "string_contains", + "string_does_not_contain", + "is_set", + "is_unset" + ], + "type": "string", + "x-go-enum-desc": "equals FilterOperatorEquals Matches objects that are exactly equal to the value in the field.\nnot_equals FilterOperatorNotEquals Matches objects that are not exactly equal to the value in the field.\ncontains FilterOperatorContains For a multi-valued field, such as tags, this operator will match objects that contain any of the values in the field.\ndoes_not_contain FilterOperatorDoesNotContain For a multi-valued field, such as tags, this operator will match objects that do not contain any of the values in the field.\nin FilterOperatorIn Matches objects if the field is one of several possible values, as specified in the values array.\nnot_in FilterOperatorNotIn Matches objects if the field is none of several possible values, as specified in the values array.\nand FilterOperatorAnd Matches objects only if all subfilters match.\nor FilterOperatorOr Matches objects if any subfilter matches.\ntime_is_after FilterOperatorTimeIsAfter Matches objects if the field is after the given time.\ntime_is_before FilterOperatorTimeIsBefore Matches objects if the field is before the given time.\ntime_range FilterOperatorTimeRange Matches objects if the field is between the given times.\nstring_contains FilterOperatorStringContains Matches objects if the field contains the given string.\nstring_does_not_contain FilterOperatorStringDoesNotContain Matches objects if the field does not contain the given string.\nis_set FilterOperatorIsSet FilterOperatorIsSet matches objects if the field is set.\nis_unset FilterOperatorIsUnset FilterOperatorIsUnset matches objects if the field is unset.", + "x-go-name": "Operator" + }, + "subfilters": { + "description": "Sub-filters for this filter. Valid only when operator is \"and\" or \"or\".\n\nThe maximum allowed depth for a tree of filters is 3.", + "items": { + "$ref": "#/components/schemas/Filter", + "has_circular_reference": true + }, + "type": "array", + "x-go-name": "Subfilters" + }, + "value": { + "description": "The value for this filter. Only used for single-valued operators\n\n(\"equals\", \"not_equals\", \"contains\", \"does_not_contain\")", + "type": "string", + "x-go-name": "Value" + }, + "values": { + "description": "The values for this filter. Only used for multi-valued operators (\"in\", \"not_in\").", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Values" + } + }, + "required": [ + "field", + "operator" + ], + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "visibility": { + "description": "The visibility setting of the article.\n\n* public KnowledgeBaseArticleVisibilityPublic\n\n* customer KnowledgeBaseArticleVisibilityCustomer\n\n* internal_only KnowledgeBaseArticleVisibilityInternalOnly", + "enum": [ + "public", + "customer", + "internal_only" + ], + "type": "string", + "x-go-enum-desc": "public KnowledgeBaseArticleVisibilityPublic\ncustomer KnowledgeBaseArticleVisibilityCustomer\ninternal_only KnowledgeBaseArticleVisibilityInternalOnly", + "x-go-name": "Visibility" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + } + } + }, + "required": false + }, + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "properties": { + "current_published_content_html": { + "description": "The current published content of the article in HTML.", + "type": "string", + "x-go-name": "CurrentPublishedContentHTML" + }, + "id": { + "description": "The ID of the article.", + "type": "string", + "x-go-name": "ID" + }, + "identifier": { + "description": "The identifier of the article", + "type": "string", + "x-go-name": "Identifier" + }, + "is_published": { + "description": "IsPublished indicates if the article is published.", + "type": "boolean", + "x-go-name": "IsPublished" + }, + "last_published_at": { + "description": "The last published at time of the article.", + "type": "string", + "x-go-name": "LastPublishedAt" + }, + "slug": { + "description": "The slug of the article.", + "type": "string", + "x-go-name": "Slug" + }, + "title": { + "description": "The name of the article.", + "type": "string", + "x-go-name": "Title" + }, + "url": { + "description": "The URL of the article.", + "type": "string", + "x-go-name": "URL" + }, + "visibility_config": { + "properties": { + "ai_agent_access": { + "description": "AI agent access control for the article. Defaults to inherit from the parent scope when omitted.\n\n* inherit KnowledgeBaseArticleAIAgentAccessInherit Defers the access check to the parent object (Collection or KnowledgeBase).\n\n* none KnowledgeBaseArticleAIAgentAccessNone No AI agents have access to this article.\n\n* specific_agents KnowledgeBaseArticleAIAgentAccessSpecificAgents Only specific AI agents enumerated in the allowlist have access.", + "enum": [ + "inherit", + "none", + "specific_agents" + ], + "type": "string", + "x-go-enum-desc": "inherit KnowledgeBaseArticleAIAgentAccessInherit Defers the access check to the parent object (Collection or KnowledgeBase).\nnone KnowledgeBaseArticleAIAgentAccessNone No AI agents have access to this article.\nspecific_agents KnowledgeBaseArticleAIAgentAccessSpecificAgents Only specific AI agents enumerated in the allowlist have access.", + "x-go-name": "AiAgentAccess" + }, + "allowed_agent_ids": { + "description": "List of AI agent IDs that may access this article when ai_agent_access is set to \"specific_agents\".", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "AllowedAgentIDs" + }, + "customer_visibility_condition": { + "properties": { + "field": { + "description": "The field for this filter. For allowed fields, see the documentation for\n\nthe specific endpoint you are using.\n\nFor non-compound filters (any operators other than \"and\" or \"or\"),\n\nField must be set, along with either Value or Values, depending on the operator.", + "type": "string", + "x-go-name": "Field" + }, + "operator": { + "description": "The operator for this filter.\n\n* equals FilterOperatorEquals Matches objects that are exactly equal to the value in the field.\n\n* not_equals FilterOperatorNotEquals Matches objects that are not exactly equal to the value in the field.\n\n* contains FilterOperatorContains For a multi-valued field, such as tags, this operator will match objects that contain any of the values in the field.\n\n* does_not_contain FilterOperatorDoesNotContain For a multi-valued field, such as tags, this operator will match objects that do not contain any of the values in the field.\n\n* in FilterOperatorIn Matches objects if the field is one of several possible values, as specified in the values array.\n\n* not_in FilterOperatorNotIn Matches objects if the field is none of several possible values, as specified in the values array.\n\n* and FilterOperatorAnd Matches objects only if all subfilters match.\n\n* or FilterOperatorOr Matches objects if any subfilter matches.\n\n* time_is_after FilterOperatorTimeIsAfter Matches objects if the field is after the given time.\n\n* time_is_before FilterOperatorTimeIsBefore Matches objects if the field is before the given time.\n\n* time_range FilterOperatorTimeRange Matches objects if the field is between the given times.\n\n* string_contains FilterOperatorStringContains Matches objects if the field contains the given string.\n\n* string_does_not_contain FilterOperatorStringDoesNotContain Matches objects if the field does not contain the given string.\n\n* is_set FilterOperatorIsSet FilterOperatorIsSet matches objects if the field is set.\n\n* is_unset FilterOperatorIsUnset FilterOperatorIsUnset matches objects if the field is unset.", + "enum": [ + "equals", + "not_equals", + "contains", + "does_not_contain", + "in", + "not_in", + "and", + "or", + "time_is_after", + "time_is_before", + "time_range", + "string_contains", + "string_does_not_contain", + "is_set", + "is_unset" + ], + "type": "string", + "x-go-enum-desc": "equals FilterOperatorEquals Matches objects that are exactly equal to the value in the field.\nnot_equals FilterOperatorNotEquals Matches objects that are not exactly equal to the value in the field.\ncontains FilterOperatorContains For a multi-valued field, such as tags, this operator will match objects that contain any of the values in the field.\ndoes_not_contain FilterOperatorDoesNotContain For a multi-valued field, such as tags, this operator will match objects that do not contain any of the values in the field.\nin FilterOperatorIn Matches objects if the field is one of several possible values, as specified in the values array.\nnot_in FilterOperatorNotIn Matches objects if the field is none of several possible values, as specified in the values array.\nand FilterOperatorAnd Matches objects only if all subfilters match.\nor FilterOperatorOr Matches objects if any subfilter matches.\ntime_is_after FilterOperatorTimeIsAfter Matches objects if the field is after the given time.\ntime_is_before FilterOperatorTimeIsBefore Matches objects if the field is before the given time.\ntime_range FilterOperatorTimeRange Matches objects if the field is between the given times.\nstring_contains FilterOperatorStringContains Matches objects if the field contains the given string.\nstring_does_not_contain FilterOperatorStringDoesNotContain Matches objects if the field does not contain the given string.\nis_set FilterOperatorIsSet FilterOperatorIsSet matches objects if the field is set.\nis_unset FilterOperatorIsUnset FilterOperatorIsUnset matches objects if the field is unset.", + "x-go-name": "Operator" + }, + "subfilters": { + "description": "Sub-filters for this filter. Valid only when operator is \"and\" or \"or\".\n\nThe maximum allowed depth for a tree of filters is 3.", + "items": { + "$ref": "#/components/schemas/Filter", + "has_circular_reference": true + }, + "type": "array", + "x-go-name": "Subfilters" + }, + "value": { + "description": "The value for this filter. Only used for single-valued operators\n\n(\"equals\", \"not_equals\", \"contains\", \"does_not_contain\")", + "type": "string", + "x-go-name": "Value" + }, + "values": { + "description": "The values for this filter. Only used for multi-valued operators (\"in\", \"not_in\").", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Values" + } + }, + "required": [ + "field", + "operator" + ], + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "visibility": { + "description": "The visibility setting of the article.\n\n* public KnowledgeBaseArticleVisibilityPublic\n\n* customer KnowledgeBaseArticleVisibilityCustomer\n\n* internal_only KnowledgeBaseArticleVisibilityInternalOnly", + "enum": [ + "public", + "customer", + "internal_only" + ], + "type": "string", + "x-go-enum-desc": "public KnowledgeBaseArticleVisibilityPublic\ncustomer KnowledgeBaseArticleVisibilityCustomer\ninternal_only KnowledgeBaseArticleVisibilityInternalOnly", + "x-go-name": "Visibility" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + } + } + }, + "description": "" + }, + "400": { + "content": { + "application/json": { + "schema": { + "properties": { + "errors": { + "description": "The list of errors.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Errors" + }, + "exists_id": { + "description": "The ID of the object that already exists if this is a duplicate object error.", + "type": "string", + "x-go-name": "ExistsID" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + } + } + }, + "description": "" + }, + "404": { + "content": { + "application/json": { + "schema": { + "properties": { + "errors": { + "description": "The list of errors.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Errors" + }, + "exists_id": { + "description": "The ID of the object that already exists if this is a duplicate object error.", + "type": "string", + "x-go-name": "ExistsID" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + } + } + }, + "description": "" + }, + "500": { + "content": { + "application/json": { + "schema": { + "properties": { + "errors": { + "description": "The list of errors.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Errors" + }, + "exists_id": { + "description": "The ID of the object that already exists if this is a duplicate object error.", + "type": "string", + "x-go-name": "ExistsID" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + } + } + }, + "description": "" + } + }, + "tags": [ + "articles" + ], + "x-codegen-request-body-name": "Body", + "x-moar-primitive-count": 12, + "x-moar-complexity-skipped": false + } + }, + "/knowledge-bases/{id}/collections": { + "get": { + "description": "List all collections in a knowledge base", + "operationId": "GetCollections", + "parameters": [ + { + "description": "The ID of the knowledge base", + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string", + "x-go-name": "ID" + }, + "x-go-name": "ID" + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "description": "The data payload of the response.", + "items": { + "properties": { + "created_at": { + "description": "The created at time of the collection.", + "type": "string", + "x-go-name": "CreatedAt" + }, + "description": { + "description": "The description of the collection.", + "type": "string", + "x-go-name": "Description" + }, + "id": { + "description": "The ID of the collection.", + "type": "string", + "x-go-name": "ID" + }, + "parent_collection_id": { + "description": "The ID of the parent collection.", + "type": "string", + "x-go-name": "ParentCollectionID" + }, + "slug": { + "description": "The slug of the collection.", + "type": "string", + "x-go-name": "Slug" + }, + "title": { + "description": "The name of the collection.", + "type": "string", + "x-go-name": "Title" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "type": "array", + "x-go-name": "Data" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + } + } + }, + "description": "" + }, + "400": { + "content": { + "application/json": { + "schema": { + "properties": { + "errors": { + "description": "The list of errors.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Errors" + }, + "exists_id": { + "description": "The ID of the object that already exists if this is a duplicate object error.", + "type": "string", + "x-go-name": "ExistsID" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + } + } + }, + "description": "" + }, + "404": { + "content": { + "application/json": { + "schema": { + "properties": { + "errors": { + "description": "The list of errors.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Errors" + }, + "exists_id": { + "description": "The ID of the object that already exists if this is a duplicate object error.", + "type": "string", + "x-go-name": "ExistsID" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + } + } + }, + "description": "" + }, + "500": { + "content": { + "application/json": { + "schema": { + "properties": { + "errors": { + "description": "The list of errors.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Errors" + }, + "exists_id": { + "description": "The ID of the object that already exists if this is a duplicate object error.", + "type": "string", + "x-go-name": "ExistsID" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + } + } + }, + "description": "" + } + }, + "tags": [ + "collections" + ], + "x-moar-primitive-count": 0, + "x-moar-complexity-skipped": false + }, + "post": { + "description": "Create a new collection", + "operationId": "CreateCollection", + "parameters": [ + { + "description": "The ID of the knowledge base the article is being added to.", + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string", + "x-go-name": "ID" + }, + "x-go-name": "ID" + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "properties": { + "description": { + "description": "Description of the collection.", + "type": "string", + "x-go-name": "Description" + }, + "parent_collection_id": { + "description": "The id of the collection associated to the article", + "type": "string", + "x-go-name": "ParentCollectionID" + }, + "slug": { + "description": "The slug of the collection. Defaults to a slug based on the title.", + "type": "string", + "x-go-name": "Slug" + }, + "title": { + "description": "The title of the collection.", + "type": "string", + "x-go-name": "Title" + } + }, + "required": [ + "title" + ], + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + } + } + }, + "required": false + }, + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "properties": { + "created_at": { + "description": "The created at time of the collection.", + "type": "string", + "x-go-name": "CreatedAt" + }, + "description": { + "description": "The description of the collection.", + "type": "string", + "x-go-name": "Description" + }, + "id": { + "description": "The ID of the collection.", + "type": "string", + "x-go-name": "ID" + }, + "parent_collection_id": { + "description": "The ID of the parent collection.", + "type": "string", + "x-go-name": "ParentCollectionID" + }, + "slug": { + "description": "The slug of the collection.", + "type": "string", + "x-go-name": "Slug" + }, + "title": { + "description": "The name of the collection.", + "type": "string", + "x-go-name": "Title" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + } + } + }, + "description": "" + }, + "400": { + "content": { + "application/json": { + "schema": { + "properties": { + "errors": { + "description": "The list of errors.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Errors" + }, + "exists_id": { + "description": "The ID of the object that already exists if this is a duplicate object error.", + "type": "string", + "x-go-name": "ExistsID" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + } + } + }, + "description": "" + }, + "404": { + "content": { + "application/json": { + "schema": { + "properties": { + "errors": { + "description": "The list of errors.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Errors" + }, + "exists_id": { + "description": "The ID of the object that already exists if this is a duplicate object error.", + "type": "string", + "x-go-name": "ExistsID" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + } + } + }, + "description": "" + }, + "500": { + "content": { + "application/json": { + "schema": { + "properties": { + "errors": { + "description": "The list of errors.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Errors" + }, + "exists_id": { + "description": "The ID of the object that already exists if this is a duplicate object error.", + "type": "string", + "x-go-name": "ExistsID" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + } + } + }, + "description": "" + } + }, + "tags": [ + "collections" + ], + "x-codegen-request-body-name": "Body", + "x-moar-primitive-count": 4, + "x-moar-complexity-skipped": false + } + }, + "/knowledge-bases/{id}/collections/{collection_id}": { + "get": { + "description": "Get a specific collection by ID", + "operationId": "GetCollection", + "parameters": [ + { + "description": "The ID of the knowledge base", + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string", + "x-go-name": "ID" + }, + "x-go-name": "ID" + }, + { + "description": "The ID of the collection", + "in": "path", + "name": "collection_id", + "required": true, + "schema": { + "type": "string", + "x-go-name": "CollectionID" + }, + "x-go-name": "CollectionID" + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "properties": { + "created_at": { + "description": "The created at time of the collection.", + "type": "string", + "x-go-name": "CreatedAt" + }, + "description": { + "description": "The description of the collection.", + "type": "string", + "x-go-name": "Description" + }, + "id": { + "description": "The ID of the collection.", + "type": "string", + "x-go-name": "ID" + }, + "parent_collection_id": { + "description": "The ID of the parent collection.", + "type": "string", + "x-go-name": "ParentCollectionID" + }, + "slug": { + "description": "The slug of the collection.", + "type": "string", + "x-go-name": "Slug" + }, + "title": { + "description": "The name of the collection.", + "type": "string", + "x-go-name": "Title" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + } + } + }, + "description": "" + }, + "400": { + "content": { + "application/json": { + "schema": { + "properties": { + "errors": { + "description": "The list of errors.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Errors" + }, + "exists_id": { + "description": "The ID of the object that already exists if this is a duplicate object error.", + "type": "string", + "x-go-name": "ExistsID" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + } + } + }, + "description": "" + }, + "404": { + "content": { + "application/json": { + "schema": { + "properties": { + "errors": { + "description": "The list of errors.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Errors" + }, + "exists_id": { + "description": "The ID of the object that already exists if this is a duplicate object error.", + "type": "string", + "x-go-name": "ExistsID" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + } + } + }, + "description": "" + }, + "500": { + "content": { + "application/json": { + "schema": { + "properties": { + "errors": { + "description": "The list of errors.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Errors" + }, + "exists_id": { + "description": "The ID of the object that already exists if this is a duplicate object error.", + "type": "string", + "x-go-name": "ExistsID" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + } + } + }, + "description": "" + } + }, + "tags": [ + "collections" + ], + "x-moar-primitive-count": 0, + "x-moar-complexity-skipped": false + } + }, + "/knowledge-bases/{id}/route-redirects": { + "post": { + "description": "Create a new route redirect", + "operationId": "CreateRouteRedirect", + "parameters": [ + { + "description": "The ID of the knowledge base the route redirect is being added to.", + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string", + "x-go-name": "ID" + }, + "x-go-name": "ID" + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "properties": { + "from_path": { + "description": "The path to redirect from.", + "type": "string", + "x-go-name": "FromPath" + }, + "language": { + "description": "Language of the object to redirect to. If not specified, the default language of the knowledge base will be used.", + "type": "string", + "x-go-name": "Language" + }, + "object_id": { + "description": "The ID of the object to redirect to.", + "type": "string", + "x-go-name": "ObjectID" + }, + "object_type": { + "description": "The type of the object to redirect to. This must be \"article\".", + "type": "string", + "x-go-name": "ObjectType" + } + }, + "required": [ + "from_path", + "object_id", + "object_type" + ], + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + } + } + }, + "required": false + }, + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "properties": { + "created_at": { + "description": "The time at which the route redirect was created.", + "type": "string", + "x-go-name": "CreatedAt" + }, + "from_path": { + "description": "The path to redirect from.", + "type": "string", + "x-go-name": "FromPath" + }, + "id": { + "description": "The ID of the route redirect.", + "type": "string", + "x-go-name": "ID" + }, + "language": { + "description": "The language of the object to redirect to.", + "type": "string", + "x-go-name": "Language" + }, + "object_id": { + "description": "The ID of the object to redirect to.", + "type": "string", + "x-go-name": "ObjectID" + }, + "object_type": { + "description": "The type of the object to redirect to.", + "type": "string", + "x-go-name": "ObjectType" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + } + } + }, + "description": "" + }, + "400": { + "content": { + "application/json": { + "schema": { + "properties": { + "errors": { + "description": "The list of errors.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Errors" + }, + "exists_id": { + "description": "The ID of the object that already exists if this is a duplicate object error.", + "type": "string", + "x-go-name": "ExistsID" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + } + } + }, + "description": "" + }, + "404": { + "content": { + "application/json": { + "schema": { + "properties": { + "errors": { + "description": "The list of errors.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Errors" + }, + "exists_id": { + "description": "The ID of the object that already exists if this is a duplicate object error.", + "type": "string", + "x-go-name": "ExistsID" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + } + } + }, + "description": "" + }, + "500": { + "content": { + "application/json": { + "schema": { + "properties": { + "errors": { + "description": "The list of errors.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Errors" + }, + "exists_id": { + "description": "The ID of the object that already exists if this is a duplicate object error.", + "type": "string", + "x-go-name": "ExistsID" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + } + } + }, + "description": "" + } + }, + "tags": [ + "route-redirects" + ], + "x-codegen-request-body-name": "Body", + "x-moar-primitive-count": 4, + "x-moar-complexity-skipped": false + } + }, + "/me": { + "get": { + "description": "Get details of the organization associated with the API token", + "operationId": "GetMe", + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "properties": { + "id": { + "description": "The ID of the organization.", + "type": "string", + "x-go-name": "ID" + }, + "name": { + "description": "The name of the organization.", + "type": "string", + "x-go-name": "Name" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + } + } + }, + "description": "" + }, + "400": { + "content": { + "application/json": { + "schema": { + "properties": { + "errors": { + "description": "The list of errors.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Errors" + }, + "exists_id": { + "description": "The ID of the object that already exists if this is a duplicate object error.", + "type": "string", + "x-go-name": "ExistsID" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + } + } + }, + "description": "" + }, + "404": { + "content": { + "application/json": { + "schema": { + "properties": { + "errors": { + "description": "The list of errors.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Errors" + }, + "exists_id": { + "description": "The ID of the object that already exists if this is a duplicate object error.", + "type": "string", + "x-go-name": "ExistsID" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + } + } + }, + "description": "" + }, + "500": { + "content": { + "application/json": { + "schema": { + "properties": { + "errors": { + "description": "The list of errors.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Errors" + }, + "exists_id": { + "description": "The ID of the object that already exists if this is a duplicate object error.", + "type": "string", + "x-go-name": "ExistsID" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + } + } + }, + "description": "" + } + }, + "tags": [ + "me" + ], + "x-moar-primitive-count": 0, + "x-moar-complexity-skipped": false + } + }, + "/milestones": { + "post": { + "description": "Create a milestone", + "operationId": "CreateMilestone", + "parameters": [ + { + "description": "Name for this milestone", + "in": "query", + "name": "name", + "required": true, + "schema": { + "type": "string", + "x-go-name": "Name" + }, + "x-go-name": "Name" + }, + { + "description": "Due date for this milestone, in RFC 3339 format", + "in": "query", + "name": "due_date", + "schema": { + "type": "string", + "x-go-name": "DueDate" + }, + "x-go-name": "DueDate" + }, + { + "description": "Project ID for this milestone", + "in": "query", + "name": "project_id", + "required": true, + "schema": { + "type": "string", + "x-go-name": "ProjectID" + }, + "x-go-name": "ProjectID" + }, + { + "description": "Account ID for this project", + "in": "query", + "name": "account_id", + "schema": { + "type": "string", + "x-go-name": "AccountID" + }, + "x-go-name": "AccountID" + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "properties": { + "account": { + "properties": { + "id": { + "description": "The ID of the account.", + "type": "string", + "x-go-name": "ID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "created_at": { + "type": "string", + "x-go-name": "CreatedAt" + }, + "due_date": { + "type": "string", + "x-go-name": "DueDate" + }, + "id": { + "type": "string", + "x-go-name": "ID" + }, + "name": { + "type": "string", + "x-go-name": "Name" + }, + "project": { + "properties": { + "id": { + "description": "The ID of the project.", + "type": "string", + "x-go-name": "ID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "updated_at": { + "type": "string", + "x-go-name": "UpdatedAt" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + } + } + }, + "description": "" + }, + "400": { + "content": { + "application/json": { + "schema": { + "properties": { + "errors": { + "description": "The list of errors.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Errors" + }, + "exists_id": { + "description": "The ID of the object that already exists if this is a duplicate object error.", + "type": "string", + "x-go-name": "ExistsID" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + } + } + }, + "description": "" + }, + "404": { + "content": { + "application/json": { + "schema": { + "properties": { + "errors": { + "description": "The list of errors.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Errors" + }, + "exists_id": { + "description": "The ID of the object that already exists if this is a duplicate object error.", + "type": "string", + "x-go-name": "ExistsID" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + } + } + }, + "description": "" + } + }, + "tags": [ + "milestones" + ], + "x-moar-primitive-count": 0, + "x-moar-complexity-skipped": false + } + }, + "/milestones/{id}": { + "delete": { + "description": "Delete a milestone", + "operationId": "DeleteMilestone", + "parameters": [ + { + "description": "The ID of the milestone to delete.", + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string", + "x-go-name": "ID" + }, + "x-go-name": "ID" + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "properties": { + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + } + } + }, + "description": "" + }, + "400": { + "content": { + "application/json": { + "schema": { + "properties": { + "errors": { + "description": "The list of errors.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Errors" + }, + "exists_id": { + "description": "The ID of the object that already exists if this is a duplicate object error.", + "type": "string", + "x-go-name": "ExistsID" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + } + } + }, + "description": "" + }, + "404": { + "content": { + "application/json": { + "schema": { + "properties": { + "errors": { + "description": "The list of errors.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Errors" + }, + "exists_id": { + "description": "The ID of the object that already exists if this is a duplicate object error.", + "type": "string", + "x-go-name": "ExistsID" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + } + } + }, + "description": "" + } + }, + "tags": [ + "milestones" + ], + "x-moar-primitive-count": 0, + "x-moar-complexity-skipped": false + }, + "patch": { + "description": "Update a milestone", + "operationId": "UpdateMilestone", + "parameters": [ + { + "description": "The ID of the milestone to update.", + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string", + "x-go-name": "ID" + }, + "x-go-name": "ID" + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "properties": { + "due_date": { + "description": "Due date for this milestone, in RFC 3339 format", + "type": "string", + "x-go-name": "DueDate" + }, + "name": { + "description": "Name for this milestone", + "type": "string", + "x-go-name": "Name" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + } + } + }, + "required": false + }, + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "properties": { + "account": { + "properties": { + "id": { + "description": "The ID of the account.", + "type": "string", + "x-go-name": "ID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "created_at": { + "type": "string", + "x-go-name": "CreatedAt" + }, + "due_date": { + "type": "string", + "x-go-name": "DueDate" + }, + "id": { + "type": "string", + "x-go-name": "ID" + }, + "name": { + "type": "string", + "x-go-name": "Name" + }, + "project": { + "properties": { + "id": { + "description": "The ID of the project.", + "type": "string", + "x-go-name": "ID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "updated_at": { + "type": "string", + "x-go-name": "UpdatedAt" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + } + } + }, + "description": "" + }, + "400": { + "content": { + "application/json": { + "schema": { + "properties": { + "errors": { + "description": "The list of errors.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Errors" + }, + "exists_id": { + "description": "The ID of the object that already exists if this is a duplicate object error.", + "type": "string", + "x-go-name": "ExistsID" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + } + } + }, + "description": "" + }, + "404": { + "content": { + "application/json": { + "schema": { + "properties": { + "errors": { + "description": "The list of errors.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Errors" + }, + "exists_id": { + "description": "The ID of the object that already exists if this is a duplicate object error.", + "type": "string", + "x-go-name": "ExistsID" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + } + } + }, + "description": "" + } + }, + "tags": [ + "milestones" + ], + "x-codegen-request-body-name": "Body", + "x-moar-primitive-count": 2, + "x-moar-complexity-skipped": false + } + }, + "/projects": { + "post": { + "description": "Create a project", + "operationId": "CreateProject", + "parameters": [ + { + "description": "Name for this project", + "in": "query", + "name": "name", + "required": true, + "schema": { + "type": "string", + "x-go-name": "Name" + }, + "x-go-name": "Name" + }, + { + "description": "Description HTML for this project", + "in": "query", + "name": "description_html", + "schema": { + "type": "string", + "x-go-name": "DescriptionHTML" + }, + "x-go-name": "DescriptionHTML" + }, + { + "description": "Customer portal visible for this project", + "in": "query", + "name": "customer_portal_visible", + "schema": { + "default": false, + "type": "boolean", + "x-go-name": "CustomerPortalVisible" + }, + "x-go-name": "CustomerPortalVisible" + }, + { + "description": "Start date for this project, in RFC 3339 format", + "in": "query", + "name": "start_date", + "schema": { + "type": "string", + "x-go-name": "StartDate" + }, + "x-go-name": "StartDate" + }, + { + "description": "End date for this project, in RFC 3339 format", + "in": "query", + "name": "end_date", + "schema": { + "type": "string", + "x-go-name": "EndDate" + }, + "x-go-name": "EndDate" + }, + { + "description": "Account ID for this project", + "in": "query", + "name": "account_id", + "required": true, + "schema": { + "type": "string", + "x-go-name": "AccountID" + }, + "x-go-name": "AccountID" + }, + { + "description": "Owner ID for this project", + "in": "query", + "name": "owner_id", + "schema": { + "type": "string", + "x-go-name": "OwnerID" + }, + "x-go-name": "OwnerID" + }, + { + "description": "Project template ID for this project", + "in": "query", + "name": "project_template_id", + "schema": { + "type": "string", + "x-go-name": "ProjectTemplateID" + }, + "x-go-name": "ProjectTemplateID" + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "properties": { + "account": { + "properties": { + "id": { + "description": "The ID of the account.", + "type": "string", + "x-go-name": "ID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "archived_at": { + "description": "The archived at time of the project in RFC3339 format.", + "type": "string", + "x-go-name": "ArchivedAt" + }, + "created_at": { + "description": "The created at time of the project.", + "type": "string", + "x-go-name": "CreatedAt" + }, + "customer_portal_visible": { + "description": "The customer portal visible of the project.", + "type": "boolean", + "x-go-name": "CustomerPortalVisible" + }, + "description_html": { + "description": "The description of the project in HTML format.", + "type": "string", + "x-go-name": "DescriptionHTML" + }, + "end_date": { + "description": "The end date of the project in RFC3339 format.", + "type": "string", + "x-go-name": "EndDate" + }, + "id": { + "description": "The ID of the project.", + "type": "string", + "x-go-name": "ID" + }, + "is_archived": { + "description": "Whether the project is archived.", + "type": "boolean", + "x-go-name": "IsArchived" + }, + "name": { + "description": "The name of the project.", + "type": "string", + "x-go-name": "Name" + }, + "owner_id": { + "description": "The owner ID of the project.", + "type": "string", + "x-go-name": "OwnerID" + }, + "project_template": { + "properties": { + "id": { + "description": "The ID of the project template.", + "type": "string", + "x-go-name": "ID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "start_date": { + "description": "The start date of the project in RFC3339 format.", + "type": "string", + "x-go-name": "StartDate" + }, + "updated_at": { + "description": "The updated at time of the project.", + "type": "string", + "x-go-name": "UpdatedAt" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + } + } + }, + "description": "" + }, + "400": { + "content": { + "application/json": { + "schema": { + "properties": { + "errors": { + "description": "The list of errors.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Errors" + }, + "exists_id": { + "description": "The ID of the object that already exists if this is a duplicate object error.", + "type": "string", + "x-go-name": "ExistsID" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + } + } + }, + "description": "" + }, + "404": { + "content": { + "application/json": { + "schema": { + "properties": { + "errors": { + "description": "The list of errors.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Errors" + }, + "exists_id": { + "description": "The ID of the object that already exists if this is a duplicate object error.", + "type": "string", + "x-go-name": "ExistsID" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + } + } + }, + "description": "" + } + }, + "tags": [ + "projects" + ], + "x-moar-primitive-count": 0, + "x-moar-complexity-skipped": false + } + }, + "/projects/{id}": { + "delete": { + "description": "Delete an existing project", + "operationId": "DeleteProject", + "parameters": [ + { + "description": "The ID of the project to delete.", + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string", + "x-go-name": "ID" + }, + "x-go-name": "ID" + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "properties": { + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + } + } + }, + "description": "" + }, + "400": { + "content": { + "application/json": { + "schema": { + "properties": { + "errors": { + "description": "The list of errors.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Errors" + }, + "exists_id": { + "description": "The ID of the object that already exists if this is a duplicate object error.", + "type": "string", + "x-go-name": "ExistsID" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + } + } + }, + "description": "" + }, + "404": { + "content": { + "application/json": { + "schema": { + "properties": { + "errors": { + "description": "The list of errors.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Errors" + }, + "exists_id": { + "description": "The ID of the object that already exists if this is a duplicate object error.", + "type": "string", + "x-go-name": "ExistsID" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + } + } + }, + "description": "" + }, + "500": { + "content": { + "application/json": { + "schema": { + "properties": { + "errors": { + "description": "The list of errors.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Errors" + }, + "exists_id": { + "description": "The ID of the object that already exists if this is a duplicate object error.", + "type": "string", + "x-go-name": "ExistsID" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + } + } + }, + "description": "" + } + }, + "tags": [ + "projects" + ], + "x-moar-primitive-count": 0, + "x-moar-complexity-skipped": false + }, + "patch": { + "description": "Update a project", + "operationId": "UpdateProject", + "parameters": [ + { + "description": "The ID of the project to update.", + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string", + "x-go-name": "ID" + }, + "x-go-name": "ID" + }, + { + "description": "Name for this project", + "in": "query", + "name": "name", + "schema": { + "type": "string", + "x-go-name": "Name" + }, + "x-go-name": "Name" + }, + { + "description": "Description HTML for this project", + "in": "query", + "name": "description_html", + "schema": { + "type": "string", + "x-go-name": "DescriptionHTML" + }, + "x-go-name": "DescriptionHTML" + }, + { + "description": "Customer portal visible for this project", + "in": "query", + "name": "customer_portal_visible", + "schema": { + "type": "boolean", + "x-go-name": "CustomerPortalVisible" + }, + "x-go-name": "CustomerPortalVisible" + }, + { + "description": "Start date for this project, in RFC 3339 format", + "in": "query", + "name": "start_date", + "schema": { + "type": "string", + "x-go-name": "StartDate" + }, + "x-go-name": "StartDate" + }, + { + "description": "End date for this project, in RFC 3339 format", + "in": "query", + "name": "end_date", + "schema": { + "type": "string", + "x-go-name": "EndDate" + }, + "x-go-name": "EndDate" + }, + { + "description": "Owner ID for this project", + "in": "query", + "name": "owner_id", + "schema": { + "type": "string", + "x-go-name": "OwnerID" + }, + "x-go-name": "OwnerID" + }, + { + "description": "Whether the project is archived", + "in": "query", + "name": "is_archived", + "schema": { + "type": "boolean", + "x-go-name": "IsArchived" + }, + "x-go-name": "IsArchived" + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "properties": { + "customer_portal_visible": { + "description": "Customer portal visible for this project", + "type": "boolean", + "x-go-name": "CustomerPortalVisible" + }, + "description_html": { + "description": "Description HTML for this project", + "type": "string", + "x-go-name": "DescriptionHTML" + }, + "end_date": { + "description": "End date for this project, in RFC 3339 format", + "type": "string", + "x-go-name": "EndDate" + }, + "is_archived": { + "description": "Whether the project is archived", + "type": "boolean", + "x-go-name": "IsArchived" + }, + "name": { + "description": "Name for this project", + "type": "string", + "x-go-name": "Name" + }, + "owner_id": { + "description": "Owner ID for this project", + "type": "string", + "x-go-name": "OwnerID" + }, + "start_date": { + "description": "Start date for this project, in RFC 3339 format", + "type": "string", + "x-go-name": "StartDate" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + } + } + }, + "required": false + }, + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "properties": { + "account": { + "properties": { + "id": { + "description": "The ID of the account.", + "type": "string", + "x-go-name": "ID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "archived_at": { + "description": "The archived at time of the project in RFC3339 format.", + "type": "string", + "x-go-name": "ArchivedAt" + }, + "created_at": { + "description": "The created at time of the project.", + "type": "string", + "x-go-name": "CreatedAt" + }, + "customer_portal_visible": { + "description": "The customer portal visible of the project.", + "type": "boolean", + "x-go-name": "CustomerPortalVisible" + }, + "description_html": { + "description": "The description of the project in HTML format.", + "type": "string", + "x-go-name": "DescriptionHTML" + }, + "end_date": { + "description": "The end date of the project in RFC3339 format.", + "type": "string", + "x-go-name": "EndDate" + }, + "id": { + "description": "The ID of the project.", + "type": "string", + "x-go-name": "ID" + }, + "is_archived": { + "description": "Whether the project is archived.", + "type": "boolean", + "x-go-name": "IsArchived" + }, + "name": { + "description": "The name of the project.", + "type": "string", + "x-go-name": "Name" + }, + "owner_id": { + "description": "The owner ID of the project.", + "type": "string", + "x-go-name": "OwnerID" + }, + "project_template": { + "properties": { + "id": { + "description": "The ID of the project template.", + "type": "string", + "x-go-name": "ID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "start_date": { + "description": "The start date of the project in RFC3339 format.", + "type": "string", + "x-go-name": "StartDate" + }, + "updated_at": { + "description": "The updated at time of the project.", + "type": "string", + "x-go-name": "UpdatedAt" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + } + } + }, + "description": "" + }, + "400": { + "content": { + "application/json": { + "schema": { + "properties": { + "errors": { + "description": "The list of errors.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Errors" + }, + "exists_id": { + "description": "The ID of the object that already exists if this is a duplicate object error.", + "type": "string", + "x-go-name": "ExistsID" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + } + } + }, + "description": "" + }, + "404": { + "content": { + "application/json": { + "schema": { + "properties": { + "errors": { + "description": "The list of errors.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Errors" + }, + "exists_id": { + "description": "The ID of the object that already exists if this is a duplicate object error.", + "type": "string", + "x-go-name": "ExistsID" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + } + } + }, + "description": "" + } + }, + "tags": [ + "projects" + ], + "x-codegen-request-body-name": "Body", + "x-moar-primitive-count": 7, + "x-moar-complexity-skipped": false + } + }, + "/tags": { + "get": { + "description": "Get all tags", + "operationId": "GetTags", + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "description": "The data payload of the response.", + "items": { + "properties": { + "hex_color": { + "description": "The hex code of the tag's color.", + "type": "string", + "x-go-name": "HexColor" + }, + "id": { + "description": "The ID of the tag.", + "type": "string", + "x-go-name": "ID" + }, + "object_type": { + "description": "The object type of the tagged object.", + "type": "string", + "x-go-name": "ObjectType" + }, + "value": { + "description": "The value of the Tag.", + "type": "string", + "x-go-name": "Value" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "type": "array", + "x-go-name": "Data" + }, + "pagination": { + "properties": { + "cursor": { + "description": "The cursor for the next page of results.", + "type": "string", + "x-go-name": "Cursor" + }, + "has_next_page": { + "description": "Indicates if there is a next page of results.", + "type": "boolean", + "x-go-name": "HasNextPage" + } + }, + "required": [ + "cursor", + "has_next_page" + ], + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + } + } + }, + "description": "" + }, + "400": { + "content": { + "application/json": { + "schema": { + "properties": { + "errors": { + "description": "The list of errors.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Errors" + }, + "exists_id": { + "description": "The ID of the object that already exists if this is a duplicate object error.", + "type": "string", + "x-go-name": "ExistsID" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + } + } + }, + "description": "" + }, + "404": { + "content": { + "application/json": { + "schema": { + "properties": { + "errors": { + "description": "The list of errors.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Errors" + }, + "exists_id": { + "description": "The ID of the object that already exists if this is a duplicate object error.", + "type": "string", + "x-go-name": "ExistsID" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + } + } + }, + "description": "" + }, + "500": { + "content": { + "application/json": { + "schema": { + "properties": { + "errors": { + "description": "The list of errors.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Errors" + }, + "exists_id": { + "description": "The ID of the object that already exists if this is a duplicate object error.", + "type": "string", + "x-go-name": "ExistsID" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + } + } + }, + "description": "" + } + }, + "tags": [ + "tags" + ], + "x-moar-primitive-count": 0, + "x-moar-complexity-skipped": false + }, + "post": { + "description": "Create a new tag", + "operationId": "CreateTag", + "requestBody": { + "content": { + "application/json": { + "schema": { + "properties": { + "hex_color": { + "description": "The hex code of the tag's color.", + "type": "string", + "x-go-name": "HexColor" + }, + "object_type": { + "description": "The object type of the associated object. Can be \"account\", \"issue\", or \"contact\".", + "type": "string", + "x-go-name": "ObjectType" + }, + "value": { + "description": "The tag value.", + "type": "string", + "x-go-name": "Value" + } + }, + "required": [ + "object_type", + "value" + ], + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + } + } + }, + "required": false + }, + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "properties": { + "hex_color": { + "description": "The hex code of the tag's color.", + "type": "string", + "x-go-name": "HexColor" + }, + "id": { + "description": "The ID of the tag.", + "type": "string", + "x-go-name": "ID" + }, + "object_type": { + "description": "The object type of the tagged object.", + "type": "string", + "x-go-name": "ObjectType" + }, + "value": { + "description": "The value of the Tag.", + "type": "string", + "x-go-name": "Value" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + } + } + }, + "description": "" + }, + "400": { + "content": { + "application/json": { + "schema": { + "properties": { + "errors": { + "description": "The list of errors.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Errors" + }, + "exists_id": { + "description": "The ID of the object that already exists if this is a duplicate object error.", + "type": "string", + "x-go-name": "ExistsID" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + } + } + }, + "description": "" + }, + "404": { + "content": { + "application/json": { + "schema": { + "properties": { + "errors": { + "description": "The list of errors.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Errors" + }, + "exists_id": { + "description": "The ID of the object that already exists if this is a duplicate object error.", + "type": "string", + "x-go-name": "ExistsID" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + } + } + }, + "description": "" + }, + "500": { + "content": { + "application/json": { + "schema": { + "properties": { + "errors": { + "description": "The list of errors.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Errors" + }, + "exists_id": { + "description": "The ID of the object that already exists if this is a duplicate object error.", + "type": "string", + "x-go-name": "ExistsID" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + } + } + }, + "description": "" + } + }, + "tags": [ + "tags" + ], + "x-codegen-request-body-name": "Body", + "x-moar-primitive-count": 3, + "x-moar-complexity-skipped": false + } + }, + "/tags/{id}": { + "delete": { + "description": "Delete an existing tag", + "operationId": "DeleteTag", + "parameters": [ + { + "description": "The ID of the tag to update.", + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string", + "x-go-name": "ID" + }, + "x-go-name": "ID" + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "properties": { + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + } + } + }, + "description": "" + }, + "400": { + "content": { + "application/json": { + "schema": { + "properties": { + "errors": { + "description": "The list of errors.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Errors" + }, + "exists_id": { + "description": "The ID of the object that already exists if this is a duplicate object error.", + "type": "string", + "x-go-name": "ExistsID" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + } + } + }, + "description": "" + }, + "404": { + "content": { + "application/json": { + "schema": { + "properties": { + "errors": { + "description": "The list of errors.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Errors" + }, + "exists_id": { + "description": "The ID of the object that already exists if this is a duplicate object error.", + "type": "string", + "x-go-name": "ExistsID" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + } + } + }, + "description": "" + }, + "500": { + "content": { + "application/json": { + "schema": { + "properties": { + "errors": { + "description": "The list of errors.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Errors" + }, + "exists_id": { + "description": "The ID of the object that already exists if this is a duplicate object error.", + "type": "string", + "x-go-name": "ExistsID" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + } + } + }, + "description": "" + } + }, + "tags": [ + "tags" + ], + "x-moar-primitive-count": 0, + "x-moar-complexity-skipped": false + }, + "get": { + "description": "Get a tag by its ID", + "operationId": "GetTag", + "parameters": [ + { + "description": "The ID of the tag.", + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string", + "x-go-name": "ID" + }, + "x-go-name": "ID" + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "properties": { + "hex_color": { + "description": "The hex code of the tag's color.", + "type": "string", + "x-go-name": "HexColor" + }, + "id": { + "description": "The ID of the tag.", + "type": "string", + "x-go-name": "ID" + }, + "object_type": { + "description": "The object type of the tagged object.", + "type": "string", + "x-go-name": "ObjectType" + }, + "value": { + "description": "The value of the Tag.", + "type": "string", + "x-go-name": "Value" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + } + } + }, + "description": "" + }, + "400": { + "content": { + "application/json": { + "schema": { + "properties": { + "errors": { + "description": "The list of errors.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Errors" + }, + "exists_id": { + "description": "The ID of the object that already exists if this is a duplicate object error.", + "type": "string", + "x-go-name": "ExistsID" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + } + } + }, + "description": "" + }, + "404": { + "content": { + "application/json": { + "schema": { + "properties": { + "errors": { + "description": "The list of errors.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Errors" + }, + "exists_id": { + "description": "The ID of the object that already exists if this is a duplicate object error.", + "type": "string", + "x-go-name": "ExistsID" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + } + } + }, + "description": "" + }, + "500": { + "content": { + "application/json": { + "schema": { + "properties": { + "errors": { + "description": "The list of errors.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Errors" + }, + "exists_id": { + "description": "The ID of the object that already exists if this is a duplicate object error.", + "type": "string", + "x-go-name": "ExistsID" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + } + } + }, + "description": "" + } + }, + "tags": [ + "tags" + ], + "x-moar-primitive-count": 0, + "x-moar-complexity-skipped": false + }, + "patch": { + "description": "Update an existing tag", + "operationId": "UpdateTag", + "parameters": [ + { + "description": "The ID of the tag to update.", + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string", + "x-go-name": "ID" + }, + "x-go-name": "ID" + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "properties": { + "hex_color": { + "description": "The hex code of the tag's color.", + "type": "string", + "x-go-name": "HexColor" + }, + "value": { + "description": "in: body\n\nThe name of the tag.", + "type": "string", + "x-go-name": "Value" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + } + } + }, + "required": false + }, + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "properties": { + "hex_color": { + "description": "The hex code of the tag's color.", + "type": "string", + "x-go-name": "HexColor" + }, + "id": { + "description": "The ID of the tag.", + "type": "string", + "x-go-name": "ID" + }, + "object_type": { + "description": "The object type of the tagged object.", + "type": "string", + "x-go-name": "ObjectType" + }, + "value": { + "description": "The value of the Tag.", + "type": "string", + "x-go-name": "Value" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + } + } + }, + "description": "" + }, + "400": { + "content": { + "application/json": { + "schema": { + "properties": { + "errors": { + "description": "The list of errors.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Errors" + }, + "exists_id": { + "description": "The ID of the object that already exists if this is a duplicate object error.", + "type": "string", + "x-go-name": "ExistsID" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + } + } + }, + "description": "" + }, + "404": { + "content": { + "application/json": { + "schema": { + "properties": { + "errors": { + "description": "The list of errors.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Errors" + }, + "exists_id": { + "description": "The ID of the object that already exists if this is a duplicate object error.", + "type": "string", + "x-go-name": "ExistsID" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + } + } + }, + "description": "" + }, + "500": { + "content": { + "application/json": { + "schema": { + "properties": { + "errors": { + "description": "The list of errors.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Errors" + }, + "exists_id": { + "description": "The ID of the object that already exists if this is a duplicate object error.", + "type": "string", + "x-go-name": "ExistsID" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + } + } + }, + "description": "" + } + }, + "tags": [ + "tags" + ], + "x-codegen-request-body-name": "Body", + "x-moar-primitive-count": 2, + "x-moar-complexity-skipped": false + } + }, + "/tasks": { + "post": { + "description": "Create a task", + "operationId": "CreateTask", + "parameters": [ + { + "description": "Title for this task", + "in": "query", + "name": "title", + "required": true, + "schema": { + "type": "string", + "x-go-name": "Title" + }, + "x-go-name": "Title" + }, + { + "description": "Body HTML for this task", + "in": "query", + "name": "body_html", + "schema": { + "type": "string", + "x-go-name": "BodyHTML" + }, + "x-go-name": "BodyHTML" + }, + { + "description": "Milestone ID for this task", + "in": "query", + "name": "milestone_id", + "schema": { + "type": "string", + "x-go-name": "MilestoneID" + }, + "x-go-name": "MilestoneID" + }, + { + "description": "Status for this task\n\nnot_started TaskStatusNotStarted\n\nin_progress TaskStatusInProgress\n\ncompleted TaskStatusCompleted", + "in": "query", + "name": "status", + "schema": { + "enum": [ + "not_started", + "in_progress", + "completed" + ], + "type": "string", + "x-go-enum-desc": "not_started TaskStatusNotStarted\nin_progress TaskStatusInProgress\ncompleted TaskStatusCompleted", + "x-go-name": "Status" + }, + "x-go-enum-desc": "not_started TaskStatusNotStarted\nin_progress TaskStatusInProgress\ncompleted TaskStatusCompleted", + "x-go-name": "Status" + }, + { + "description": "Customer portal visible for this task", + "in": "query", + "name": "customer_portal_visible", + "schema": { + "default": false, + "type": "boolean", + "x-go-name": "CustomerPortalVisible" + }, + "x-go-name": "CustomerPortalVisible" + }, + { + "description": "Due date for this task, in RFC 3339 format", + "in": "query", + "name": "due_date", + "schema": { + "type": "string", + "x-go-name": "DueDate" + }, + "x-go-name": "DueDate" + }, + { + "description": "Assignee ID for this task", + "in": "query", + "name": "assignee_id", + "schema": { + "type": "string", + "x-go-name": "AssigneeID" + }, + "x-go-name": "AssigneeID" + }, + { + "description": "Account ID for this task", + "in": "query", + "name": "account_id", + "schema": { + "type": "string", + "x-go-name": "AccountID" + }, + "x-go-name": "AccountID" + }, + { + "description": "Project ID for this task", + "in": "query", + "name": "project_id", + "schema": { + "type": "string", + "x-go-name": "ProjectID" + }, + "x-go-name": "ProjectID" + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "properties": { + "account": { + "properties": { + "id": { + "description": "The ID of the account.", + "type": "string", + "x-go-name": "ID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "assignee": { + "properties": { + "contact": { + "properties": { + "email": { + "description": "The email of the contact.", + "type": "string", + "x-go-name": "Email" + }, + "id": { + "description": "The ID of the contact.", + "type": "string", + "x-go-name": "ID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "user": { + "properties": { + "email": { + "description": "The email of the user.", + "type": "string", + "x-go-name": "Email" + }, + "id": { + "description": "The ID of the user.", + "type": "string", + "x-go-name": "ID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "body_html": { + "description": "The body of the task in HTML format.", + "type": "string", + "x-go-name": "BodyHTML" + }, + "created_at": { + "description": "The created at time of the task.", + "type": "string", + "x-go-name": "CreatedAt" + }, + "customer_portal_visible": { + "description": "The customer portal visible of the task.", + "type": "boolean", + "x-go-name": "CustomerPortalVisible" + }, + "due_date": { + "description": "The due date of the task in RFC3339 format.", + "type": "string", + "x-go-name": "DueDate" + }, + "id": { + "description": "The ID of the task.", + "type": "string", + "x-go-name": "ID" + }, + "milestone": { + "properties": { + "id": { + "description": "The ID of the milestone.", + "type": "string", + "x-go-name": "ID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "project": { + "properties": { + "id": { + "description": "The ID of the project.", + "type": "string", + "x-go-name": "ID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "status": { + "description": "The status of the task.\n\n* not_started TaskStatusNotStarted\n\n* in_progress TaskStatusInProgress\n\n* completed TaskStatusCompleted", + "enum": [ + "not_started", + "in_progress", + "completed" + ], + "type": "string", + "x-go-enum-desc": "not_started TaskStatusNotStarted\nin_progress TaskStatusInProgress\ncompleted TaskStatusCompleted", + "x-go-name": "Status" + }, + "title": { + "description": "The title of the task.", + "type": "string", + "x-go-name": "Title" + }, + "updated_at": { + "description": "The updated at time of the task.", + "type": "string", + "x-go-name": "UpdatedAt" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + } + } + }, + "description": "" + }, + "400": { + "content": { + "application/json": { + "schema": { + "properties": { + "errors": { + "description": "The list of errors.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Errors" + }, + "exists_id": { + "description": "The ID of the object that already exists if this is a duplicate object error.", + "type": "string", + "x-go-name": "ExistsID" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + } + } + }, + "description": "" + }, + "404": { + "content": { + "application/json": { + "schema": { + "properties": { + "errors": { + "description": "The list of errors.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Errors" + }, + "exists_id": { + "description": "The ID of the object that already exists if this is a duplicate object error.", + "type": "string", + "x-go-name": "ExistsID" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + } + } + }, + "description": "" + } + }, + "tags": [ + "tasks" + ], + "x-moar-primitive-count": 0, + "x-moar-complexity-skipped": false + } + }, + "/tasks/{id}": { + "delete": { + "description": "Delete an existing task", + "operationId": "DeleteTask", + "parameters": [ + { + "description": "The ID of the task to delete.", + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string", + "x-go-name": "ID" + }, + "x-go-name": "ID" + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "properties": { + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + } + } + }, + "description": "" + }, + "400": { + "content": { + "application/json": { + "schema": { + "properties": { + "errors": { + "description": "The list of errors.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Errors" + }, + "exists_id": { + "description": "The ID of the object that already exists if this is a duplicate object error.", + "type": "string", + "x-go-name": "ExistsID" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + } + } + }, + "description": "" + }, + "404": { + "content": { + "application/json": { + "schema": { + "properties": { + "errors": { + "description": "The list of errors.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Errors" + }, + "exists_id": { + "description": "The ID of the object that already exists if this is a duplicate object error.", + "type": "string", + "x-go-name": "ExistsID" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + } + } + }, + "description": "" + }, + "500": { + "content": { + "application/json": { + "schema": { + "properties": { + "errors": { + "description": "The list of errors.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Errors" + }, + "exists_id": { + "description": "The ID of the object that already exists if this is a duplicate object error.", + "type": "string", + "x-go-name": "ExistsID" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + } + } + }, + "description": "" + } + }, + "tags": [ + "tasks" + ], + "x-moar-primitive-count": 0, + "x-moar-complexity-skipped": false + }, + "patch": { + "description": "Update a task", + "operationId": "UpdateTask", + "parameters": [ + { + "description": "The ID of the task to update.", + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string", + "x-go-name": "ID" + }, + "x-go-name": "ID" + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "properties": { + "assignee_id": { + "description": "Assignee ID for this task", + "type": "string", + "x-go-name": "AssigneeID" + }, + "body_html": { + "description": "Body HTML for this task", + "type": "string", + "x-go-name": "BodyHTML" + }, + "customer_portal_visible": { + "description": "Customer portal visible for this task", + "type": "boolean", + "x-go-name": "CustomerPortalVisible" + }, + "due_date": { + "description": "Due date for this task, in RFC 3339 format", + "type": "string", + "x-go-name": "DueDate" + }, + "milestone_id": { + "description": "Milestone ID for this task", + "type": "string", + "x-go-name": "MilestoneID" + }, + "project_id": { + "description": "Project ID for this task", + "type": "string", + "x-go-name": "ProjectID" + }, + "status": { + "description": "Status for this task\n\n* not_started TaskStatusNotStarted\n\n* in_progress TaskStatusInProgress\n\n* completed TaskStatusCompleted", + "enum": [ + "not_started", + "in_progress", + "completed" + ], + "type": "string", + "x-go-enum-desc": "not_started TaskStatusNotStarted\nin_progress TaskStatusInProgress\ncompleted TaskStatusCompleted", + "x-go-name": "Status" + }, + "title": { + "description": "Title for this task", + "type": "string", + "x-go-name": "Title" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + } + } + }, + "required": false + }, + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "properties": { + "account": { + "properties": { + "id": { + "description": "The ID of the account.", + "type": "string", + "x-go-name": "ID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "assignee": { + "properties": { + "contact": { + "properties": { + "email": { + "description": "The email of the contact.", + "type": "string", + "x-go-name": "Email" + }, + "id": { + "description": "The ID of the contact.", + "type": "string", + "x-go-name": "ID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "user": { + "properties": { + "email": { + "description": "The email of the user.", + "type": "string", + "x-go-name": "Email" + }, + "id": { + "description": "The ID of the user.", + "type": "string", + "x-go-name": "ID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "body_html": { + "description": "The body of the task in HTML format.", + "type": "string", + "x-go-name": "BodyHTML" + }, + "created_at": { + "description": "The created at time of the task.", + "type": "string", + "x-go-name": "CreatedAt" + }, + "customer_portal_visible": { + "description": "The customer portal visible of the task.", + "type": "boolean", + "x-go-name": "CustomerPortalVisible" + }, + "due_date": { + "description": "The due date of the task in RFC3339 format.", + "type": "string", + "x-go-name": "DueDate" + }, + "id": { + "description": "The ID of the task.", + "type": "string", + "x-go-name": "ID" + }, + "milestone": { + "properties": { + "id": { + "description": "The ID of the milestone.", + "type": "string", + "x-go-name": "ID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "project": { + "properties": { + "id": { + "description": "The ID of the project.", + "type": "string", + "x-go-name": "ID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "status": { + "description": "The status of the task.\n\n* not_started TaskStatusNotStarted\n\n* in_progress TaskStatusInProgress\n\n* completed TaskStatusCompleted", + "enum": [ + "not_started", + "in_progress", + "completed" + ], + "type": "string", + "x-go-enum-desc": "not_started TaskStatusNotStarted\nin_progress TaskStatusInProgress\ncompleted TaskStatusCompleted", + "x-go-name": "Status" + }, + "title": { + "description": "The title of the task.", + "type": "string", + "x-go-name": "Title" + }, + "updated_at": { + "description": "The updated at time of the task.", + "type": "string", + "x-go-name": "UpdatedAt" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + } + } + }, + "description": "" + }, + "400": { + "content": { + "application/json": { + "schema": { + "properties": { + "errors": { + "description": "The list of errors.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Errors" + }, + "exists_id": { + "description": "The ID of the object that already exists if this is a duplicate object error.", + "type": "string", + "x-go-name": "ExistsID" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + } + } + }, + "description": "" + }, + "404": { + "content": { + "application/json": { + "schema": { + "properties": { + "errors": { + "description": "The list of errors.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Errors" + }, + "exists_id": { + "description": "The ID of the object that already exists if this is a duplicate object error.", + "type": "string", + "x-go-name": "ExistsID" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + } + } + }, + "description": "" + } + }, + "tags": [ + "tasks" + ], + "x-codegen-request-body-name": "Body", + "x-moar-primitive-count": 8, + "x-moar-complexity-skipped": false + } + }, + "/teams": { + "get": { + "description": "Get a list of teams", + "operationId": "GetTeams", + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "description": "The data payload of the response.", + "items": { + "properties": { + "id": { + "description": "The ID of the team.", + "type": "string", + "x-go-name": "ID" + }, + "name": { + "description": "The name of the team.", + "type": "string", + "x-go-name": "Name" + }, + "users": { + "description": "The users in the team.", + "items": { + "properties": { + "email": { + "description": "The email of the user.", + "type": "string", + "x-go-name": "Email" + }, + "id": { + "description": "The ID of the user.", + "type": "string", + "x-go-name": "ID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "type": "array", + "x-go-name": "Users" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "type": "array", + "x-go-name": "Data" + }, + "pagination": { + "properties": { + "cursor": { + "description": "The cursor for the next page of results.", + "type": "string", + "x-go-name": "Cursor" + }, + "has_next_page": { + "description": "Indicates if there is a next page of results.", + "type": "boolean", + "x-go-name": "HasNextPage" + } + }, + "required": [ + "cursor", + "has_next_page" + ], + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + } + } + }, + "description": "" + }, + "400": { + "content": { + "application/json": { + "schema": { + "properties": { + "errors": { + "description": "The list of errors.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Errors" + }, + "exists_id": { + "description": "The ID of the object that already exists if this is a duplicate object error.", + "type": "string", + "x-go-name": "ExistsID" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + } + } + }, + "description": "" + }, + "404": { + "content": { + "application/json": { + "schema": { + "properties": { + "errors": { + "description": "The list of errors.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Errors" + }, + "exists_id": { + "description": "The ID of the object that already exists if this is a duplicate object error.", + "type": "string", + "x-go-name": "ExistsID" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + } + } + }, + "description": "" + }, + "500": { + "content": { + "application/json": { + "schema": { + "properties": { + "errors": { + "description": "The list of errors.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Errors" + }, + "exists_id": { + "description": "The ID of the object that already exists if this is a duplicate object error.", + "type": "string", + "x-go-name": "ExistsID" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + } + } + }, + "description": "" + } + }, + "tags": [ + "teams" + ], + "x-moar-primitive-count": 0, + "x-moar-complexity-skipped": false + }, + "post": { + "description": "Create a new team", + "operationId": "CreateTeam", + "requestBody": { + "content": { + "application/json": { + "schema": { + "properties": { + "name": { + "description": "The name of the team.", + "type": "string", + "x-go-name": "Name" + }, + "user_ids": { + "description": "The list of user IDs to add to the team.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "UserIDs" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + } + } + }, + "required": false + }, + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "properties": { + "id": { + "description": "The ID of the team.", + "type": "string", + "x-go-name": "ID" + }, + "name": { + "description": "The name of the team.", + "type": "string", + "x-go-name": "Name" + }, + "users": { + "description": "The users in the team.", + "items": { + "properties": { + "email": { + "description": "The email of the user.", + "type": "string", + "x-go-name": "Email" + }, + "id": { + "description": "The ID of the user.", + "type": "string", + "x-go-name": "ID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "type": "array", + "x-go-name": "Users" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + } + } + }, + "description": "" + }, + "400": { + "content": { + "application/json": { + "schema": { + "properties": { + "errors": { + "description": "The list of errors.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Errors" + }, + "exists_id": { + "description": "The ID of the object that already exists if this is a duplicate object error.", + "type": "string", + "x-go-name": "ExistsID" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + } + } + }, + "description": "" + }, + "404": { + "content": { + "application/json": { + "schema": { + "properties": { + "errors": { + "description": "The list of errors.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Errors" + }, + "exists_id": { + "description": "The ID of the object that already exists if this is a duplicate object error.", + "type": "string", + "x-go-name": "ExistsID" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + } + } + }, + "description": "" + }, + "500": { + "content": { + "application/json": { + "schema": { + "properties": { + "errors": { + "description": "The list of errors.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Errors" + }, + "exists_id": { + "description": "The ID of the object that already exists if this is a duplicate object error.", + "type": "string", + "x-go-name": "ExistsID" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + } + } + }, + "description": "" + } + }, + "tags": [ + "teams" + ], + "x-codegen-request-body-name": "Body", + "x-moar-primitive-count": 2, + "x-moar-complexity-skipped": false + } + }, + "/teams/{id}": { + "get": { + "description": "Get a team by its ID", + "operationId": "GetTeam", + "parameters": [ + { + "description": "The ID of the team to fetch.", + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string", + "x-go-name": "ID" + }, + "x-go-name": "ID" + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "properties": { + "id": { + "description": "The ID of the team.", + "type": "string", + "x-go-name": "ID" + }, + "name": { + "description": "The name of the team.", + "type": "string", + "x-go-name": "Name" + }, + "users": { + "description": "The users in the team.", + "items": { + "properties": { + "email": { + "description": "The email of the user.", + "type": "string", + "x-go-name": "Email" + }, + "id": { + "description": "The ID of the user.", + "type": "string", + "x-go-name": "ID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "type": "array", + "x-go-name": "Users" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + } + } + }, + "description": "" + }, + "400": { + "content": { + "application/json": { + "schema": { + "properties": { + "errors": { + "description": "The list of errors.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Errors" + }, + "exists_id": { + "description": "The ID of the object that already exists if this is a duplicate object error.", + "type": "string", + "x-go-name": "ExistsID" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + } + } + }, + "description": "" + }, + "404": { + "content": { + "application/json": { + "schema": { + "properties": { + "errors": { + "description": "The list of errors.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Errors" + }, + "exists_id": { + "description": "The ID of the object that already exists if this is a duplicate object error.", + "type": "string", + "x-go-name": "ExistsID" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + } + } + }, + "description": "" + }, + "500": { + "content": { + "application/json": { + "schema": { + "properties": { + "errors": { + "description": "The list of errors.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Errors" + }, + "exists_id": { + "description": "The ID of the object that already exists if this is a duplicate object error.", + "type": "string", + "x-go-name": "ExistsID" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + } + } + }, + "description": "" + } + }, + "tags": [ + "teams" + ], + "x-moar-primitive-count": 0, + "x-moar-complexity-skipped": false + }, + "patch": { + "description": "Update an existing team", + "operationId": "UpdateTeam", + "parameters": [ + { + "description": "The ID of the team to update.", + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string", + "x-go-name": "ID" + }, + "x-go-name": "ID" + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "properties": { + "name": { + "description": "The name of the team.", + "type": "string", + "x-go-name": "Name" + }, + "user_ids": { + "description": "The list of user IDs to add to the team. If provided, the team members will be updated to be exactly the given users.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "UserIDs" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + } + } + }, + "required": false + }, + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "properties": { + "id": { + "description": "The ID of the team.", + "type": "string", + "x-go-name": "ID" + }, + "name": { + "description": "The name of the team.", + "type": "string", + "x-go-name": "Name" + }, + "users": { + "description": "The users in the team.", + "items": { + "properties": { + "email": { + "description": "The email of the user.", + "type": "string", + "x-go-name": "Email" + }, + "id": { + "description": "The ID of the user.", + "type": "string", + "x-go-name": "ID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "type": "array", + "x-go-name": "Users" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + } + } + }, + "description": "" + }, + "400": { + "content": { + "application/json": { + "schema": { + "properties": { + "errors": { + "description": "The list of errors.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Errors" + }, + "exists_id": { + "description": "The ID of the object that already exists if this is a duplicate object error.", + "type": "string", + "x-go-name": "ExistsID" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + } + } + }, + "description": "" + }, + "404": { + "content": { + "application/json": { + "schema": { + "properties": { + "errors": { + "description": "The list of errors.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Errors" + }, + "exists_id": { + "description": "The ID of the object that already exists if this is a duplicate object error.", + "type": "string", + "x-go-name": "ExistsID" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + } + } + }, + "description": "" + }, + "500": { + "content": { + "application/json": { + "schema": { + "properties": { + "errors": { + "description": "The list of errors.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Errors" + }, + "exists_id": { + "description": "The ID of the object that already exists if this is a duplicate object error.", + "type": "string", + "x-go-name": "ExistsID" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + } + } + }, + "description": "" + } + }, + "tags": [ + "teams" + ], + "x-codegen-request-body-name": "Body", + "x-moar-primitive-count": 2, + "x-moar-complexity-skipped": false + } + }, + "/ticket-forms": { + "get": { + "description": "Get a list of ticket forms", + "operationId": "GetTicketForms", + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "description": "The data payload of the response.", + "items": { + "properties": { + "description_html": { + "description": "The description of the ticket form in HTML.", + "type": "string", + "x-go-name": "DescriptionHTML" + }, + "fields": { + "description": "The layout of the ticket form.", + "items": { + "properties": { + "description_html": { + "description": "The description of the ticket form layout field in HTML.", + "type": "string", + "x-go-name": "DescriptionHTML" + }, + "name": { + "description": "The name of the ticket form layout field.", + "type": "string", + "x-go-name": "Name" + }, + "slug": { + "description": "The slug of the ticket form layout field.", + "type": "string", + "x-go-name": "Slug" + }, + "type": { + "description": "The type of the ticket form layout field.", + "type": "string", + "x-go-name": "Type" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "type": "array", + "x-go-name": "Fields" + }, + "id": { + "description": "The ID of the ticket form.", + "type": "string", + "x-go-name": "ID" + }, + "is_public": { + "description": "Indicates if the ticket form is public.", + "type": "boolean", + "x-go-name": "IsPublic" + }, + "name": { + "description": "The name of the ticket form.", + "type": "string", + "x-go-name": "Name" + }, + "slug": { + "description": "The slug of the ticket form.", + "type": "string", + "x-go-name": "Slug" + }, + "url": { + "description": "The URL of the ticket form.", + "type": "string", + "x-go-name": "URL" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "type": "array", + "x-go-name": "Data" + }, + "pagination": { + "properties": { + "cursor": { + "description": "The cursor for the next page of results.", + "type": "string", + "x-go-name": "Cursor" + }, + "has_next_page": { + "description": "Indicates if there is a next page of results.", + "type": "boolean", + "x-go-name": "HasNextPage" + } + }, + "required": [ + "cursor", + "has_next_page" + ], + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + } + } + }, + "description": "" + }, + "400": { + "content": { + "application/json": { + "schema": { + "properties": { + "errors": { + "description": "The list of errors.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Errors" + }, + "exists_id": { + "description": "The ID of the object that already exists if this is a duplicate object error.", + "type": "string", + "x-go-name": "ExistsID" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + } + } + }, + "description": "" + }, + "404": { + "content": { + "application/json": { + "schema": { + "properties": { + "errors": { + "description": "The list of errors.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Errors" + }, + "exists_id": { + "description": "The ID of the object that already exists if this is a duplicate object error.", + "type": "string", + "x-go-name": "ExistsID" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + } + } + }, + "description": "" + }, + "500": { + "content": { + "application/json": { + "schema": { + "properties": { + "errors": { + "description": "The list of errors.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Errors" + }, + "exists_id": { + "description": "The ID of the object that already exists if this is a duplicate object error.", + "type": "string", + "x-go-name": "ExistsID" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + } + } + }, + "description": "" + } + }, + "tags": [ + "ticket-forms" + ], + "x-moar-primitive-count": 0, + "x-moar-complexity-skipped": false + } + }, + "/ticket-forms/{id}": { + "get": { + "description": "Get a ticket form", + "operationId": "GetTicketForm", + "parameters": [ + { + "description": "The ID of the ticket form to fetch.", + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string", + "x-go-name": "ID" + }, + "x-go-name": "ID" + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "properties": { + "description_html": { + "description": "The description of the ticket form in HTML.", + "type": "string", + "x-go-name": "DescriptionHTML" + }, + "fields": { + "description": "The layout of the ticket form.", + "items": { + "properties": { + "description_html": { + "description": "The description of the ticket form layout field in HTML.", + "type": "string", + "x-go-name": "DescriptionHTML" + }, + "name": { + "description": "The name of the ticket form layout field.", + "type": "string", + "x-go-name": "Name" + }, + "slug": { + "description": "The slug of the ticket form layout field.", + "type": "string", + "x-go-name": "Slug" + }, + "type": { + "description": "The type of the ticket form layout field.", + "type": "string", + "x-go-name": "Type" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "type": "array", + "x-go-name": "Fields" + }, + "id": { + "description": "The ID of the ticket form.", + "type": "string", + "x-go-name": "ID" + }, + "is_public": { + "description": "Indicates if the ticket form is public.", + "type": "boolean", + "x-go-name": "IsPublic" + }, + "name": { + "description": "The name of the ticket form.", + "type": "string", + "x-go-name": "Name" + }, + "slug": { + "description": "The slug of the ticket form.", + "type": "string", + "x-go-name": "Slug" + }, + "url": { + "description": "The URL of the ticket form.", + "type": "string", + "x-go-name": "URL" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + } + } + }, + "description": "" + }, + "400": { + "content": { + "application/json": { + "schema": { + "properties": { + "errors": { + "description": "The list of errors.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Errors" + }, + "exists_id": { + "description": "The ID of the object that already exists if this is a duplicate object error.", + "type": "string", + "x-go-name": "ExistsID" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + } + } + }, + "description": "" + }, + "404": { + "content": { + "application/json": { + "schema": { + "properties": { + "errors": { + "description": "The list of errors.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Errors" + }, + "exists_id": { + "description": "The ID of the object that already exists if this is a duplicate object error.", + "type": "string", + "x-go-name": "ExistsID" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + } + } + }, + "description": "" + }, + "500": { + "content": { + "application/json": { + "schema": { + "properties": { + "errors": { + "description": "The list of errors.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Errors" + }, + "exists_id": { + "description": "The ID of the object that already exists if this is a duplicate object error.", + "type": "string", + "x-go-name": "ExistsID" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + } + } + }, + "description": "" + } + }, + "tags": [ + "ticket-forms" + ], + "x-moar-primitive-count": 0, + "x-moar-complexity-skipped": false + } + }, + "/training-data": { + "get": { + "operationId": "ListTrainingData", + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "items": { + "properties": { + "created_at": { + "type": "string", + "x-go-name": "CreatedAt" + }, + "documents": { + "items": { + "properties": { + "external_id": { + "type": "string", + "x-go-name": "ExternalID" + }, + "file_name": { + "type": "string", + "x-go-name": "FileName" + }, + "file_size": { + "format": "int64", + "type": "integer", + "x-go-name": "FileSize" + }, + "file_type": { + "type": "string", + "x-go-name": "FileType" + }, + "id": { + "type": "string", + "x-go-name": "ID" + }, + "s3_key": { + "type": "string", + "x-go-name": "S3Key" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "type": "array", + "x-go-name": "Documents" + }, + "exclude_from_kb_search": { + "type": "boolean", + "x-go-name": "ExcludeFromKBSearch" + }, + "id": { + "type": "string", + "x-go-name": "ID" + }, + "name": { + "type": "string", + "x-go-name": "Name" + }, + "scrape_status": { + "properties": { + "last_scraped_at": { + "type": "string", + "x-go-name": "LastScrapedAt" + }, + "pages_scraped": { + "format": "int64", + "type": "integer", + "x-go-name": "PagesScraped" + }, + "status": { + "type": "string", + "x-go-name": "Status" + }, + "total_pages": { + "format": "int64", + "type": "integer", + "x-go-name": "TotalPages" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "type": { + "type": "string", + "x-go-name": "Type" + }, + "updated_at": { + "type": "string", + "x-go-name": "UpdatedAt" + }, + "visibility": { + "type": "string", + "x-go-name": "Visibility" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "type": "array", + "x-go-name": "Data" + }, + "request_id": { + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + } + } + }, + "description": "" + }, + "400": { + "content": { + "application/json": { + "schema": { + "properties": { + "errors": { + "description": "The list of errors.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Errors" + }, + "exists_id": { + "description": "The ID of the object that already exists if this is a duplicate object error.", + "type": "string", + "x-go-name": "ExistsID" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + } + } + }, + "description": "" + }, + "500": { + "content": { + "application/json": { + "schema": { + "properties": { + "errors": { + "description": "The list of errors.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Errors" + }, + "exists_id": { + "description": "The ID of the object that already exists if this is a duplicate object error.", + "type": "string", + "x-go-name": "ExistsID" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + } + } + }, + "description": "" + } + }, + "summary": "Retrieves a list of all training data configurations for the organization.", + "tags": [ + "training-data" + ], + "x-moar-primitive-count": 0, + "x-moar-complexity-skipped": false + }, + "post": { + "operationId": "CreateTrainingData", + "requestBody": { + "content": { + "application/json": { + "schema": { + "properties": { + "training_data_name": { + "description": "The name of the training data container.", + "type": "string", + "x-go-name": "TrainingDataName" + }, + "visibility": { + "description": "The visibility of the training data. Defaults to \"everyone\".\n\nValid values: \"everyone\", \"user_only\", \"ai_agent_only\"", + "type": "string", + "x-go-name": "Visibility" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + } + } + }, + "required": false + }, + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "properties": { + "created_at": { + "type": "string", + "x-go-name": "CreatedAt" + }, + "documents": { + "items": { + "properties": { + "external_id": { + "type": "string", + "x-go-name": "ExternalID" + }, + "file_name": { + "type": "string", + "x-go-name": "FileName" + }, + "file_size": { + "format": "int64", + "type": "integer", + "x-go-name": "FileSize" + }, + "file_type": { + "type": "string", + "x-go-name": "FileType" + }, + "id": { + "type": "string", + "x-go-name": "ID" + }, + "s3_key": { + "type": "string", + "x-go-name": "S3Key" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "type": "array", + "x-go-name": "Documents" + }, + "exclude_from_kb_search": { + "type": "boolean", + "x-go-name": "ExcludeFromKBSearch" + }, + "id": { + "type": "string", + "x-go-name": "ID" + }, + "name": { + "type": "string", + "x-go-name": "Name" + }, + "scrape_status": { + "properties": { + "last_scraped_at": { + "type": "string", + "x-go-name": "LastScrapedAt" + }, + "pages_scraped": { + "format": "int64", + "type": "integer", + "x-go-name": "PagesScraped" + }, + "status": { + "type": "string", + "x-go-name": "Status" + }, + "total_pages": { + "format": "int64", + "type": "integer", + "x-go-name": "TotalPages" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "type": { + "type": "string", + "x-go-name": "Type" + }, + "updated_at": { + "type": "string", + "x-go-name": "UpdatedAt" + }, + "visibility": { + "type": "string", + "x-go-name": "Visibility" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "request_id": { + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + } + } + }, + "description": "" + }, + "400": { + "content": { + "application/json": { + "schema": { + "properties": { + "errors": { + "description": "The list of errors.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Errors" + }, + "exists_id": { + "description": "The ID of the object that already exists if this is a duplicate object error.", + "type": "string", + "x-go-name": "ExistsID" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + } + } + }, + "description": "" + }, + "500": { + "content": { + "application/json": { + "schema": { + "properties": { + "errors": { + "description": "The list of errors.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Errors" + }, + "exists_id": { + "description": "The ID of the object that already exists if this is a duplicate object error.", + "type": "string", + "x-go-name": "ExistsID" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + } + } + }, + "description": "" + } + }, + "summary": "Creates a new training data configuration.", + "tags": [ + "training-data" + ], + "x-codegen-request-body-name": "Body", + "x-moar-primitive-count": 2, + "x-moar-complexity-skipped": false + } + }, + "/training-data/{id}": { + "get": { + "operationId": "GetTrainingData", + "parameters": [ + { + "description": "The ID of the training data.", + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string", + "x-go-name": "ID" + }, + "x-go-name": "ID" + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "properties": { + "created_at": { + "type": "string", + "x-go-name": "CreatedAt" + }, + "documents": { + "items": { + "properties": { + "external_id": { + "type": "string", + "x-go-name": "ExternalID" + }, + "file_name": { + "type": "string", + "x-go-name": "FileName" + }, + "file_size": { + "format": "int64", + "type": "integer", + "x-go-name": "FileSize" + }, + "file_type": { + "type": "string", + "x-go-name": "FileType" + }, + "id": { + "type": "string", + "x-go-name": "ID" + }, + "s3_key": { + "type": "string", + "x-go-name": "S3Key" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "type": "array", + "x-go-name": "Documents" + }, + "exclude_from_kb_search": { + "type": "boolean", + "x-go-name": "ExcludeFromKBSearch" + }, + "id": { + "type": "string", + "x-go-name": "ID" + }, + "name": { + "type": "string", + "x-go-name": "Name" + }, + "scrape_status": { + "properties": { + "last_scraped_at": { + "type": "string", + "x-go-name": "LastScrapedAt" + }, + "pages_scraped": { + "format": "int64", + "type": "integer", + "x-go-name": "PagesScraped" + }, + "status": { + "type": "string", + "x-go-name": "Status" + }, + "total_pages": { + "format": "int64", + "type": "integer", + "x-go-name": "TotalPages" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "type": { + "type": "string", + "x-go-name": "Type" + }, + "updated_at": { + "type": "string", + "x-go-name": "UpdatedAt" + }, + "visibility": { + "type": "string", + "x-go-name": "Visibility" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "request_id": { + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + } + } + }, + "description": "" + }, + "400": { + "content": { + "application/json": { + "schema": { + "properties": { + "errors": { + "description": "The list of errors.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Errors" + }, + "exists_id": { + "description": "The ID of the object that already exists if this is a duplicate object error.", + "type": "string", + "x-go-name": "ExistsID" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + } + } + }, + "description": "" + }, + "404": { + "content": { + "application/json": { + "schema": { + "properties": { + "errors": { + "description": "The list of errors.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Errors" + }, + "exists_id": { + "description": "The ID of the object that already exists if this is a duplicate object error.", + "type": "string", + "x-go-name": "ExistsID" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + } + } + }, + "description": "" + } + }, + "summary": "Retrieves a specific training data configuration by its ID.", + "tags": [ + "training-data" + ], + "x-moar-primitive-count": 0, + "x-moar-complexity-skipped": false + } + }, + "/training-data/{id}/documents": { + "delete": { + "operationId": "DeleteTrainingDataDocuments", + "parameters": [ + { + "description": "The ID of the training data.", + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string", + "x-go-name": "ID" + }, + "x-go-name": "ID" + }, + { + "description": "Document IDs to delete.", + "explode": false, + "in": "query", + "name": "document_ids", + "schema": { + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "DocumentIDs" + }, + "style": "form", + "x-go-name": "DocumentIDs" + }, + { + "description": "External IDs to delete.", + "explode": false, + "in": "query", + "name": "external_ids", + "schema": { + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "ExternalIDs" + }, + "style": "form", + "x-go-name": "ExternalIDs" + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "properties": { + "deleted_count": { + "format": "int64", + "type": "integer", + "x-go-name": "DeletedCount" + }, + "request_id": { + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + } + } + }, + "description": "" + }, + "400": { + "content": { + "application/json": { + "schema": { + "properties": { + "errors": { + "description": "The list of errors.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Errors" + }, + "exists_id": { + "description": "The ID of the object that already exists if this is a duplicate object error.", + "type": "string", + "x-go-name": "ExistsID" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + } + } + }, + "description": "" + }, + "404": { + "content": { + "application/json": { + "schema": { + "properties": { + "errors": { + "description": "The list of errors.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Errors" + }, + "exists_id": { + "description": "The ID of the object that already exists if this is a duplicate object error.", + "type": "string", + "x-go-name": "ExistsID" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + } + } + }, + "description": "" + }, + "500": { + "content": { + "application/json": { + "schema": { + "properties": { + "errors": { + "description": "The list of errors.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Errors" + }, + "exists_id": { + "description": "The ID of the object that already exists if this is a duplicate object error.", + "type": "string", + "x-go-name": "ExistsID" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + } + } + }, + "description": "" + } + }, + "summary": "Deletes documents from a training data configuration.", + "tags": [ + "training-data" + ], + "x-moar-primitive-count": 0, + "x-moar-complexity-skipped": false + } + }, + "/user-roles": { + "get": { + "description": "Get a list of all user roles", + "operationId": "GetUserRoles", + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "description": "The data payload of the response.", + "items": { + "properties": { + "id": { + "description": "The ID of the role.", + "type": "string", + "x-go-name": "ID" + }, + "name": { + "description": "The name of the role.", + "type": "string", + "x-go-name": "Name" + }, + "slug": { + "description": "The slug of the role.", + "type": "string", + "x-go-name": "Slug" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "type": "array", + "x-go-name": "Data" + }, + "pagination": { + "properties": { + "cursor": { + "description": "The cursor for the next page of results.", + "type": "string", + "x-go-name": "Cursor" + }, + "has_next_page": { + "description": "Indicates if there is a next page of results.", + "type": "boolean", + "x-go-name": "HasNextPage" + } + }, + "required": [ + "cursor", + "has_next_page" + ], + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + } + } + }, + "description": "" + }, + "400": { + "content": { + "application/json": { + "schema": { + "properties": { + "errors": { + "description": "The list of errors.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Errors" + }, + "exists_id": { + "description": "The ID of the object that already exists if this is a duplicate object error.", + "type": "string", + "x-go-name": "ExistsID" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + } + } + }, + "description": "" + }, + "404": { + "content": { + "application/json": { + "schema": { + "properties": { + "errors": { + "description": "The list of errors.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Errors" + }, + "exists_id": { + "description": "The ID of the object that already exists if this is a duplicate object error.", + "type": "string", + "x-go-name": "ExistsID" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + } + } + }, + "description": "" + }, + "500": { + "content": { + "application/json": { + "schema": { + "properties": { + "errors": { + "description": "The list of errors.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Errors" + }, + "exists_id": { + "description": "The ID of the object that already exists if this is a duplicate object error.", + "type": "string", + "x-go-name": "ExistsID" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + } + } + }, + "description": "" + } + }, + "tags": [ + "user-roles" + ], + "x-moar-primitive-count": 0, + "x-moar-complexity-skipped": false + } + }, + "/users": { + "get": { + "description": "Get a list of users", + "operationId": "GetUsers", + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "description": "The data payload of the response.", + "items": { + "properties": { + "avatar_url": { + "description": "The avatar URL of the user.", + "type": "string", + "x-go-name": "AvatarURL" + }, + "email": { + "description": "The primary email of the user.", + "type": "string", + "x-go-name": "Email" + }, + "emails": { + "description": "The list of all emails of the user.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Emails" + }, + "id": { + "description": "The ID of the user.", + "type": "string", + "x-go-name": "ID" + }, + "name": { + "description": "The name of the user.", + "type": "string", + "x-go-name": "Name" + }, + "role_id": { + "description": "The role_id of the user.", + "type": "string", + "x-go-name": "RoleID" + }, + "status": { + "description": "The status of the user.", + "type": "string", + "x-go-name": "Status" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "type": "array", + "x-go-name": "Data" + }, + "pagination": { + "properties": { + "cursor": { + "description": "The cursor for the next page of results.", + "type": "string", + "x-go-name": "Cursor" + }, + "has_next_page": { + "description": "Indicates if there is a next page of results.", + "type": "boolean", + "x-go-name": "HasNextPage" + } + }, + "required": [ + "cursor", + "has_next_page" + ], + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + } + } + }, + "description": "" + }, + "400": { + "content": { + "application/json": { + "schema": { + "properties": { + "errors": { + "description": "The list of errors.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Errors" + }, + "exists_id": { + "description": "The ID of the object that already exists if this is a duplicate object error.", + "type": "string", + "x-go-name": "ExistsID" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + } + } + }, + "description": "" + }, + "404": { + "content": { + "application/json": { + "schema": { + "properties": { + "errors": { + "description": "The list of errors.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Errors" + }, + "exists_id": { + "description": "The ID of the object that already exists if this is a duplicate object error.", + "type": "string", + "x-go-name": "ExistsID" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + } + } + }, + "description": "" + }, + "500": { + "content": { + "application/json": { + "schema": { + "properties": { + "errors": { + "description": "The list of errors.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Errors" + }, + "exists_id": { + "description": "The ID of the object that already exists if this is a duplicate object error.", + "type": "string", + "x-go-name": "ExistsID" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + } + } + }, + "description": "" + } + }, + "tags": [ + "users" + ], + "x-moar-primitive-count": 0, + "x-moar-complexity-skipped": false + } + }, + "/users/search": { + "post": { + "description": "Currently, the following fields are filterable for users:\n\n* email. Allowed operators: `equals`, `in`, `not_in`", + "operationId": "SearchUsers", + "requestBody": { + "content": { + "application/json": { + "schema": { + "properties": { + "cursor": { + "description": "The cursor to use for pagination.", + "type": "string", + "x-go-name": "Cursor" + }, + "filter": { + "properties": { + "field": { + "description": "The field for this filter. For allowed fields, see the documentation for\n\nthe specific endpoint you are using.\n\nFor non-compound filters (any operators other than \"and\" or \"or\"),\n\nField must be set, along with either Value or Values, depending on the operator.", + "type": "string", + "x-go-name": "Field" + }, + "operator": { + "description": "The operator for this filter.\n\n* equals FilterOperatorEquals Matches objects that are exactly equal to the value in the field.\n\n* not_equals FilterOperatorNotEquals Matches objects that are not exactly equal to the value in the field.\n\n* contains FilterOperatorContains For a multi-valued field, such as tags, this operator will match objects that contain any of the values in the field.\n\n* does_not_contain FilterOperatorDoesNotContain For a multi-valued field, such as tags, this operator will match objects that do not contain any of the values in the field.\n\n* in FilterOperatorIn Matches objects if the field is one of several possible values, as specified in the values array.\n\n* not_in FilterOperatorNotIn Matches objects if the field is none of several possible values, as specified in the values array.\n\n* and FilterOperatorAnd Matches objects only if all subfilters match.\n\n* or FilterOperatorOr Matches objects if any subfilter matches.\n\n* time_is_after FilterOperatorTimeIsAfter Matches objects if the field is after the given time.\n\n* time_is_before FilterOperatorTimeIsBefore Matches objects if the field is before the given time.\n\n* time_range FilterOperatorTimeRange Matches objects if the field is between the given times.\n\n* string_contains FilterOperatorStringContains Matches objects if the field contains the given string.\n\n* string_does_not_contain FilterOperatorStringDoesNotContain Matches objects if the field does not contain the given string.\n\n* is_set FilterOperatorIsSet FilterOperatorIsSet matches objects if the field is set.\n\n* is_unset FilterOperatorIsUnset FilterOperatorIsUnset matches objects if the field is unset.", + "enum": [ + "equals", + "not_equals", + "contains", + "does_not_contain", + "in", + "not_in", + "and", + "or", + "time_is_after", + "time_is_before", + "time_range", + "string_contains", + "string_does_not_contain", + "is_set", + "is_unset" + ], + "type": "string", + "x-go-enum-desc": "equals FilterOperatorEquals Matches objects that are exactly equal to the value in the field.\nnot_equals FilterOperatorNotEquals Matches objects that are not exactly equal to the value in the field.\ncontains FilterOperatorContains For a multi-valued field, such as tags, this operator will match objects that contain any of the values in the field.\ndoes_not_contain FilterOperatorDoesNotContain For a multi-valued field, such as tags, this operator will match objects that do not contain any of the values in the field.\nin FilterOperatorIn Matches objects if the field is one of several possible values, as specified in the values array.\nnot_in FilterOperatorNotIn Matches objects if the field is none of several possible values, as specified in the values array.\nand FilterOperatorAnd Matches objects only if all subfilters match.\nor FilterOperatorOr Matches objects if any subfilter matches.\ntime_is_after FilterOperatorTimeIsAfter Matches objects if the field is after the given time.\ntime_is_before FilterOperatorTimeIsBefore Matches objects if the field is before the given time.\ntime_range FilterOperatorTimeRange Matches objects if the field is between the given times.\nstring_contains FilterOperatorStringContains Matches objects if the field contains the given string.\nstring_does_not_contain FilterOperatorStringDoesNotContain Matches objects if the field does not contain the given string.\nis_set FilterOperatorIsSet FilterOperatorIsSet matches objects if the field is set.\nis_unset FilterOperatorIsUnset FilterOperatorIsUnset matches objects if the field is unset.", + "x-go-name": "Operator" + }, + "subfilters": { + "description": "Sub-filters for this filter. Valid only when operator is \"and\" or \"or\".\n\nThe maximum allowed depth for a tree of filters is 3.", + "items": { + "$ref": "#/components/schemas/Filter", + "has_circular_reference": true + }, + "type": "array", + "x-go-name": "Subfilters" + }, + "value": { + "description": "The value for this filter. Only used for single-valued operators\n\n(\"equals\", \"not_equals\", \"contains\", \"does_not_contain\")", + "type": "string", + "x-go-name": "Value" + }, + "values": { + "description": "The values for this filter. Only used for multi-valued operators (\"in\", \"not_in\").", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Values" + } + }, + "required": [ + "field", + "operator" + ], + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "limit": { + "description": "The number of users to fetch. Defaults to 100. Must be greater than 0 and less than 1000.", + "format": "int64", + "type": "integer", + "x-go-name": "Limit" + } + }, + "required": [ + "filter" + ], + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + } + } + }, + "required": false + }, + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "description": "The data payload of the response.", + "items": { + "properties": { + "avatar_url": { + "description": "The avatar URL of the user.", + "type": "string", + "x-go-name": "AvatarURL" + }, + "email": { + "description": "The primary email of the user.", + "type": "string", + "x-go-name": "Email" + }, + "emails": { + "description": "The list of all emails of the user.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Emails" + }, + "id": { + "description": "The ID of the user.", + "type": "string", + "x-go-name": "ID" + }, + "name": { + "description": "The name of the user.", + "type": "string", + "x-go-name": "Name" + }, + "role_id": { + "description": "The role_id of the user.", + "type": "string", + "x-go-name": "RoleID" + }, + "status": { + "description": "The status of the user.", + "type": "string", + "x-go-name": "Status" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "type": "array", + "x-go-name": "Data" + }, + "pagination": { + "properties": { + "cursor": { + "description": "The cursor for the next page of results.", + "type": "string", + "x-go-name": "Cursor" + }, + "has_next_page": { + "description": "Indicates if there is a next page of results.", + "type": "boolean", + "x-go-name": "HasNextPage" + } + }, + "required": [ + "cursor", + "has_next_page" + ], + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + } + } + }, + "description": "" + }, + "400": { + "content": { + "application/json": { + "schema": { + "properties": { + "errors": { + "description": "The list of errors.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Errors" + }, + "exists_id": { + "description": "The ID of the object that already exists if this is a duplicate object error.", + "type": "string", + "x-go-name": "ExistsID" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + } + } + }, + "description": "" + }, + "404": { + "content": { + "application/json": { + "schema": { + "properties": { + "errors": { + "description": "The list of errors.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Errors" + }, + "exists_id": { + "description": "The ID of the object that already exists if this is a duplicate object error.", + "type": "string", + "x-go-name": "ExistsID" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + } + } + }, + "description": "" + }, + "500": { + "content": { + "application/json": { + "schema": { + "properties": { + "errors": { + "description": "The list of errors.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Errors" + }, + "exists_id": { + "description": "The ID of the object that already exists if this is a duplicate object error.", + "type": "string", + "x-go-name": "ExistsID" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + } + } + }, + "description": "" + } + }, + "summary": "Search for users by a given filter", + "tags": [ + "users" + ], + "x-codegen-request-body-name": "Body", + "x-moar-primitive-count": 7, + "x-moar-complexity-skipped": false + } + }, + "/users/{id}": { + "get": { + "description": "Get a user by its ID", + "operationId": "GetUser", + "parameters": [ + { + "description": "The ID of the user to fetch.", + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string", + "x-go-name": "ID" + }, + "x-go-name": "ID" + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "properties": { + "avatar_url": { + "description": "The avatar URL of the user.", + "type": "string", + "x-go-name": "AvatarURL" + }, + "email": { + "description": "The primary email of the user.", + "type": "string", + "x-go-name": "Email" + }, + "emails": { + "description": "The list of all emails of the user.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Emails" + }, + "id": { + "description": "The ID of the user.", + "type": "string", + "x-go-name": "ID" + }, + "name": { + "description": "The name of the user.", + "type": "string", + "x-go-name": "Name" + }, + "role_id": { + "description": "The role_id of the user.", + "type": "string", + "x-go-name": "RoleID" + }, + "status": { + "description": "The status of the user.", + "type": "string", + "x-go-name": "Status" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + } + } + }, + "description": "" + }, + "400": { + "content": { + "application/json": { + "schema": { + "properties": { + "errors": { + "description": "The list of errors.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Errors" + }, + "exists_id": { + "description": "The ID of the object that already exists if this is a duplicate object error.", + "type": "string", + "x-go-name": "ExistsID" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + } + } + }, + "description": "" + }, + "404": { + "content": { + "application/json": { + "schema": { + "properties": { + "errors": { + "description": "The list of errors.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Errors" + }, + "exists_id": { + "description": "The ID of the object that already exists if this is a duplicate object error.", + "type": "string", + "x-go-name": "ExistsID" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + } + } + }, + "description": "" + }, + "500": { + "content": { + "application/json": { + "schema": { + "properties": { + "errors": { + "description": "The list of errors.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Errors" + }, + "exists_id": { + "description": "The ID of the object that already exists if this is a duplicate object error.", + "type": "string", + "x-go-name": "ExistsID" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + } + } + }, + "description": "" + } + }, + "tags": [ + "user" + ], + "x-moar-primitive-count": 0, + "x-moar-complexity-skipped": false + }, + "patch": { + "description": "Update a user", + "operationId": "UpdateUser", + "parameters": [ + { + "description": "The ID of the user to update.", + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string", + "x-go-name": "ID" + }, + "x-go-name": "ID" + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "properties": { + "role_id": { + "description": "The role_id of the user.", + "type": "string", + "x-go-name": "RoleID" + }, + "status": { + "description": "The new user status for the user. Can be one of `active`, `away`, or `out_of_office`.", + "type": "string", + "x-go-name": "Status" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + } + } + }, + "required": false + }, + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "properties": { + "avatar_url": { + "description": "The avatar URL of the user.", + "type": "string", + "x-go-name": "AvatarURL" + }, + "email": { + "description": "The primary email of the user.", + "type": "string", + "x-go-name": "Email" + }, + "emails": { + "description": "The list of all emails of the user.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Emails" + }, + "id": { + "description": "The ID of the user.", + "type": "string", + "x-go-name": "ID" + }, + "name": { + "description": "The name of the user.", + "type": "string", + "x-go-name": "Name" + }, + "role_id": { + "description": "The role_id of the user.", + "type": "string", + "x-go-name": "RoleID" + }, + "status": { + "description": "The status of the user.", + "type": "string", + "x-go-name": "Status" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/endpoints" + } + } + }, + "description": "" + }, + "400": { + "content": { + "application/json": { + "schema": { + "properties": { + "errors": { + "description": "The list of errors.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Errors" + }, + "exists_id": { + "description": "The ID of the object that already exists if this is a duplicate object error.", + "type": "string", + "x-go-name": "ExistsID" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + } + } + }, + "description": "" + }, + "404": { + "content": { + "application/json": { + "schema": { + "properties": { + "errors": { + "description": "The list of errors.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Errors" + }, + "exists_id": { + "description": "The ID of the object that already exists if this is a duplicate object error.", + "type": "string", + "x-go-name": "ExistsID" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + } + } + }, + "description": "" + }, + "500": { + "content": { + "application/json": { + "schema": { + "properties": { + "errors": { + "description": "The list of errors.", + "items": { + "type": "string" + }, + "type": "array", + "x-go-name": "Errors" + }, + "exists_id": { + "description": "The ID of the object that already exists if this is a duplicate object error.", + "type": "string", + "x-go-name": "ExistsID" + }, + "request_id": { + "description": "The request ID for tracking.", + "type": "string", + "x-go-name": "RequestID" + } + }, + "type": "object", + "x-go-package": "pylon/api/apiserver/apitypes" + } + } + }, + "description": "" + } + }, + "tags": [ + "user" + ], + "x-codegen-request-body-name": "Body", + "x-moar-primitive-count": 2, + "x-moar-complexity-skipped": false + } + } + }, + "security": [ + { + "bearerAuth": [] + } + ], + "servers": [ + { + "url": "https://api.usepylon.com" + } + ], + "x-original-swagger-version": "2.0" +} diff --git a/toolkits/pylon_api/pylon_api/moar/pylon.json b/toolkits/pylon_api/pylon_api/moar/pylon.json new file mode 100644 index 00000000..691e158e --- /dev/null +++ b/toolkits/pylon_api/pylon_api/moar/pylon.json @@ -0,0 +1,12264 @@ +{ + "name": "Pylon", + "spec_source": "openapi_spec", + "token_for_http_testing": "", + "package_name": "pylon_api", + "package_dir_path": "/Users/franciscojuniodelimaliberal/git/Team/arcade-mcp/toolkits/pylon_api/pylon_api", + "project_dir_path": "/Users/franciscojuniodelimaliberal/git/Team/arcade-mcp/toolkits/pylon_api", + "arcade_new_cmd_executed": true, + "api_endpoint_selection_customized": false, + "api_endpoint_for_http_testing": "", + "authorization_type": "basic", + "auth_provider_id": "", + "where_to_provide_token": "header", + "token_key_name": "Authorization", + "token_value": "Bearer {authorization}", + "secrets": [ + { + "arcade_key_name": "PYLON_SECRET_TOKEN", + "service_key_name": "Authorization", + "where_to_provide": "header", + "formatted_value": "Bearer {authorization}" + } + ], + "global_base_url": "https://api.usepylon.com", + "global_headers": {}, + "edit_operations": [], + "uuid": "c4116cf8-4e4e-4062-885e-2527037ca02c", + "api_endpoints": [ + { + "name": "GetAccounts", + "selected_for_wrapping": false, + "spec_built": true, + "wrap_finished": true, + "should_skip": false, + "skip_reason": null, + "wrapper_tool": { + "name": "get_account_list", + "description": { + "tagline": "Retrieve a list of accounts from the service.", + "detailed": "This tool fetches a complete list of accounts from the Pylon service. It should be called when you need to obtain account information." + }, + "return_annotation": "List of accounts with their details.", + "arguments": [ + { + "name": "account_fetch_limit", + "alternative_names": [ + "accounts_limit", + "fetch_limit" + ], + "description": "Specify the number of accounts to fetch, from 1 to 999. Defaults to 100 if not specified.", + "endpoint_argument_name": "limit" + }, + { + "name": "pagination_cursor", + "alternative_names": [ + "pagination_token", + "page_cursor" + ], + "description": "A string representing the cursor for pagination. Use this to fetch the next set of accounts.", + "endpoint_argument_name": "cursor" + } + ] + }, + "method": "GET", + "path": "/accounts", + "tags": [ + "accounts" + ], + "summary": "", + "description": "Get a list of accounts", + "requires_security": true, + "oauth_scopes": [], + "security_schemes": [ + "bearerAuth" + ], + "parameters": { + "query": [ + { + "name": "cursor", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The cursor to use for pagination." + }, + "description": "The cursor to use for pagination.", + "required": false, + "deprecated": false, + "default": null, + "location": "query", + "content_type": null, + "json_schema": { + "type": "string" + }, + "schema_required": false + }, + { + "name": "limit", + "value_schema": { + "val_type": "integer", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The number of accounts to fetch. Defaults to 100. Must be greater than 0 and less than 1000." + }, + "description": "The number of accounts to fetch. Defaults to 100. Must be greater than 0 and less than 1000.", + "required": true, + "deprecated": false, + "default": null, + "location": "query", + "content_type": null, + "json_schema": { + "type": "integer", + "format": "int64" + }, + "schema_required": false + } + ], + "path": [], + "header": [], + "cookie": [], + "body": [] + }, + "request_body_spec": null, + "use_request_body_schema_mode": false, + "validate_request_body_schema": false, + "use_flatten_mode": false + }, + { + "name": "UpdateAccounts", + "selected_for_wrapping": false, + "spec_built": true, + "wrap_finished": true, + "should_skip": false, + "skip_reason": null, + "wrapper_tool": { + "name": "update_multiple_accounts", + "description": { + "tagline": "Update multiple accounts simultaneously.", + "detailed": "Use this tool to update details for multiple accounts in one request. It is helpful for batch processing of account modifications." + }, + "return_annotation": "Confirmation of accounts update.", + "arguments": [ + { + "name": "update_accounts_request_body", + "alternative_names": [ + "accounts_update_payload", + "batch_accounts_update_request" + ], + "description": "JSON object containing account IDs, custom fields, owner ID, tags, and tags apply mode for updating multiple accounts.", + "endpoint_argument_name": "requestBody" + } + ] + }, + "method": "PATCH", + "path": "/accounts", + "tags": [ + "accounts" + ], + "summary": "", + "description": "Update multiple accounts", + "requires_security": true, + "oauth_scopes": [], + "security_schemes": [ + "bearerAuth" + ], + "parameters": { + "query": [], + "path": [], + "header": [], + "cookie": [], + "body": [ + { + "name": "requestBody", + "value_schema": { + "val_type": "json", + "inner_val_type": null, + "enum": null, + "properties": { + "account_ids": { + "val_type": "array", + "inner_val_type": "string", + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The account IDs to update. The number of accounts to update must be between 1 and 100." + }, + "custom_fields": { + "val_type": "array", + "inner_val_type": "json", + "enum": null, + "properties": null, + "inner_properties": { + "slug": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The slug of the custom field." + }, + "value": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The value of the custom field. Only to be used for single-valued custom fields. If unset, the custom field will be unset. If the custom field is a select field, the value must be the select option slug, which you can find from the GET /custom-fields endpoint." + }, + "values": { + "val_type": "array", + "inner_val_type": "string", + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The values of the custom field. Only to be used for multi-valued custom fields (ex. multiselect). If unset, the custom field will be unset. If the custom field is a multiselect field, the values must be the select option slugs which you can find from the GET /custom-fields endpoint." + } + }, + "description": "An array of custom fields to be updated on the accounts." + }, + "owner_id": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The ID of the new owner. If empty string is passed in, the owner will be removed." + }, + "tags": { + "val_type": "array", + "inner_val_type": "string", + "enum": null, + "properties": null, + "inner_properties": null, + "description": "An array of tags to be updated on the accounts." + }, + "tags_apply_mode": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The mode for applying tags. Valid values: \"append_only\", \"remove_only\", \"replace\". Defaults to \"replace\"." + } + }, + "inner_properties": null, + "description": "" + }, + "description": "", + "required": false, + "deprecated": false, + "default": null, + "location": "body", + "content_type": "application/json", + "json_schema": { + "type": "object", + "properties": { + "account_ids": { + "type": "array", + "description": "The account IDs to update. The number of accounts to update must be between 1 and 100.", + "items": { + "type": "string" + } + }, + "custom_fields": { + "type": "array", + "description": "An array of custom fields to be updated on the accounts.", + "items": { + "type": "object", + "properties": { + "slug": { + "type": "string", + "description": "The slug of the custom field." + }, + "value": { + "type": "string", + "description": "The value of the custom field. Only to be used for single-valued custom fields. If unset, the custom field will be unset. If the custom field is a select field, the value must be the select option slug, which you can find from the GET /custom-fields endpoint." + }, + "values": { + "type": "array", + "description": "The values of the custom field. Only to be used for multi-valued custom fields (ex. multiselect). If unset, the custom field will be unset. If the custom field is a multiselect field, the values must be the select option slugs which you can find from the GET /custom-fields endpoint.", + "items": { + "type": "string" + } + } + } + } + }, + "owner_id": { + "type": "string", + "description": "The ID of the new owner. If empty string is passed in, the owner will be removed." + }, + "tags": { + "type": "array", + "description": "An array of tags to be updated on the accounts.", + "items": { + "type": "string" + } + }, + "tags_apply_mode": { + "type": "string", + "description": "The mode for applying tags. Valid values: \"append_only\", \"remove_only\", \"replace\". Defaults to \"replace\"." + } + }, + "required": [ + "account_ids" + ] + }, + "schema_required": false + } + ] + }, + "request_body_spec": "{\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"properties\": {\n \"account_ids\": {\n \"description\": \"The account IDs to update. The number of accounts to update must be between 1 and 100.\",\n \"items\": {\n \"type\": \"string\"\n },\n \"type\": \"array\",\n \"x-go-name\": \"AccountIDs\"\n },\n \"custom_fields\": {\n \"description\": \"An array of custom fields to be updated on the accounts.\",\n \"items\": {\n \"properties\": {\n \"slug\": {\n \"description\": \"The slug of the custom field.\",\n \"type\": \"string\",\n \"x-go-name\": \"Slug\"\n },\n \"value\": {\n \"description\": \"The value of the custom field. Only to be used for single-valued custom fields. If unset, the custom field will be unset. If the custom field is a select field, the value must be the select option slug, which you can find from the GET /custom-fields endpoint.\",\n \"type\": \"string\",\n \"x-go-name\": \"Value\"\n },\n \"values\": {\n \"description\": \"The values of the custom field. Only to be used for multi-valued custom fields (ex. multiselect). If unset, the custom field will be unset. If the custom field is a multiselect field, the values must be the select option slugs which you can find from the GET /custom-fields endpoint.\",\n \"items\": {\n \"type\": \"string\"\n },\n \"type\": \"array\",\n \"x-go-name\": \"Values\"\n }\n },\n \"type\": \"object\",\n \"x-go-package\": \"pylon/api/apiserver/apitypes\"\n },\n \"type\": \"array\",\n \"x-go-name\": \"CustomFields\"\n },\n \"owner_id\": {\n \"description\": \"The ID of the new owner. If empty string is passed in, the owner will be removed.\",\n \"type\": \"string\",\n \"x-go-name\": \"OwnerID\"\n },\n \"tags\": {\n \"description\": \"An array of tags to be updated on the accounts.\",\n \"items\": {\n \"type\": \"string\"\n },\n \"type\": \"array\",\n \"x-go-name\": \"Tags\"\n },\n \"tags_apply_mode\": {\n \"description\": \"The mode for applying tags. Valid values: \\\"append_only\\\", \\\"remove_only\\\", \\\"replace\\\". Defaults to \\\"replace\\\".\",\n \"type\": \"string\",\n \"x-go-name\": \"TagsApplyMode\"\n }\n },\n \"required\": [\n \"account_ids\"\n ],\n \"type\": \"object\",\n \"x-go-package\": \"pylon/api/apiserver/endpoints\"\n }\n }\n },\n \"required\": false\n}", + "use_request_body_schema_mode": true, + "validate_request_body_schema": true, + "use_flatten_mode": false + }, + { + "name": "CreateAccount", + "selected_for_wrapping": false, + "spec_built": true, + "wrap_finished": true, + "should_skip": false, + "skip_reason": null, + "wrapper_tool": { + "name": "create_new_account", + "description": { + "tagline": "Creates a new user account.", + "detailed": "This tool should be called to create a new user account when registration or account opening is requested." + }, + "return_annotation": "Confirmation of new account creation.", + "arguments": [ + { + "name": "account_details", + "alternative_names": [ + "account_information", + "user_profile_data" + ], + "description": "JSON object containing account details like channels, custom fields, domains, external IDs, etc. for the new account.", + "endpoint_argument_name": "requestBody" + } + ] + }, + "method": "POST", + "path": "/accounts", + "tags": [ + "accounts" + ], + "summary": "", + "description": "Create a new account", + "requires_security": true, + "oauth_scopes": [], + "security_schemes": [ + "bearerAuth" + ], + "parameters": { + "query": [], + "path": [], + "header": [], + "cookie": [], + "body": [ + { + "name": "requestBody", + "value_schema": { + "val_type": "json", + "inner_val_type": null, + "enum": null, + "properties": { + "channels": { + "val_type": "array", + "inner_val_type": "json", + "enum": null, + "properties": null, + "inner_properties": { + "channel_id": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The ID of the channel. If this is a Microsoft Teams channel, the ID must be in the format of `{team_id}|{channel_id}`." + }, + "is_primary": { + "val_type": "boolean", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "Whether this channel is the primary channel for the account." + }, + "mirror_to": { + "val_type": "json", + "inner_val_type": null, + "enum": null, + "properties": { + "channel_id": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The ID of the channel. If this is a Microsoft Teams channel, the ID must be in the format of `{team_id}|{channel_id}`." + }, + "source": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The source, which can be one of `[\"slack\", \"microsoft_teams\", \"discord\"]`." + } + }, + "inner_properties": null, + "description": null + }, + "source": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The source, which can be one of `[\"slack\", \"microsoft_teams\", \"discord\"]`." + } + }, + "description": "An array of channels to be linked to this account." + }, + "custom_fields": { + "val_type": "array", + "inner_val_type": "json", + "enum": null, + "properties": null, + "inner_properties": { + "slug": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The slug of the custom field." + }, + "value": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The value of the custom field. Only to be used for single-valued custom fields. If unset, the custom field will be unset. If the custom field is a select field, the value must be the select option slug, which you can find from the GET /custom-fields endpoint." + }, + "values": { + "val_type": "array", + "inner_val_type": "string", + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The values of the custom field. Only to be used for multi-valued custom fields (ex. multiselect). If unset, the custom field will be unset. If the custom field is a multiselect field, the values must be the select option slugs which you can find from the GET /custom-fields endpoint." + } + }, + "description": "An array of custom fields to be used on this account." + }, + "domain": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "Deprecated. Please use Domains and PrimaryDomain instead." + }, + "domains": { + "val_type": "array", + "inner_val_type": "string", + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The domains of the account, without any leading scheme, for example stripe.com. Must specify one domain as primary." + }, + "external_ids": { + "val_type": "array", + "inner_val_type": "json", + "enum": null, + "properties": null, + "inner_properties": { + "external_id": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The external ID. Must be unique per object type (ex. account)." + }, + "label": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The label of the external ID. Must be unique per object." + } + }, + "description": "An array of external IDs to be used on this account. If provided, the accounts external IDs will be updated to the given external IDs." + }, + "logo_url": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The logo URL of the account. Must be a square .png, .jpg or .jpeg." + }, + "name": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The name of the account." + }, + "owner_id": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The ID of the owner of the account." + }, + "primary_domain": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "Must be in the list of domains. If there are any domains, there must be exactly one primary domain." + }, + "tags": { + "val_type": "array", + "inner_val_type": "string", + "enum": null, + "properties": null, + "inner_properties": null, + "description": "An array of strings to use as tags on this account. If provided, the accounts tags will be updated to the given tags." + } + }, + "inner_properties": null, + "description": "" + }, + "description": "", + "required": false, + "deprecated": false, + "default": null, + "location": "body", + "content_type": "application/json", + "json_schema": { + "type": "object", + "properties": { + "channels": { + "type": "array", + "description": "An array of channels to be linked to this account.", + "items": { + "type": "object", + "properties": { + "channel_id": { + "type": "string", + "description": "The ID of the channel. If this is a Microsoft Teams channel, the ID must be in the format of `{team_id}|{channel_id}`." + }, + "is_primary": { + "type": "boolean", + "description": "Whether this channel is the primary channel for the account." + }, + "mirror_to": { + "type": "object", + "properties": { + "channel_id": { + "type": "string", + "description": "The ID of the channel. If this is a Microsoft Teams channel, the ID must be in the format of `{team_id}|{channel_id}`." + }, + "source": { + "type": "string", + "description": "The source, which can be one of `[\"slack\", \"microsoft_teams\", \"discord\"]`." + } + } + }, + "source": { + "type": "string", + "description": "The source, which can be one of `[\"slack\", \"microsoft_teams\", \"discord\"]`." + } + } + } + }, + "custom_fields": { + "type": "array", + "description": "An array of custom fields to be used on this account.", + "items": { + "type": "object", + "properties": { + "slug": { + "type": "string", + "description": "The slug of the custom field." + }, + "value": { + "type": "string", + "description": "The value of the custom field. Only to be used for single-valued custom fields. If unset, the custom field will be unset. If the custom field is a select field, the value must be the select option slug, which you can find from the GET /custom-fields endpoint." + }, + "values": { + "type": "array", + "description": "The values of the custom field. Only to be used for multi-valued custom fields (ex. multiselect). If unset, the custom field will be unset. If the custom field is a multiselect field, the values must be the select option slugs which you can find from the GET /custom-fields endpoint.", + "items": { + "type": "string" + } + } + } + } + }, + "domain": { + "type": "string", + "description": "Deprecated. Please use Domains and PrimaryDomain instead." + }, + "domains": { + "type": "array", + "description": "The domains of the account, without any leading scheme, for example stripe.com. Must specify one domain as primary.", + "items": { + "type": "string" + } + }, + "external_ids": { + "type": "array", + "description": "An array of external IDs to be used on this account. If provided, the accounts external IDs will be updated to the given external IDs.", + "items": { + "type": "object", + "properties": { + "external_id": { + "type": "string", + "description": "The external ID. Must be unique per object type (ex. account)." + }, + "label": { + "type": "string", + "description": "The label of the external ID. Must be unique per object." + } + } + } + }, + "logo_url": { + "type": "string", + "description": "The logo URL of the account. Must be a square .png, .jpg or .jpeg." + }, + "name": { + "type": "string", + "description": "The name of the account." + }, + "owner_id": { + "type": "string", + "description": "The ID of the owner of the account." + }, + "primary_domain": { + "type": "string", + "description": "Must be in the list of domains. If there are any domains, there must be exactly one primary domain." + }, + "tags": { + "type": "array", + "description": "An array of strings to use as tags on this account. If provided, the accounts tags will be updated to the given tags.", + "items": { + "type": "string" + } + } + }, + "required": [ + "name" + ] + }, + "schema_required": false + } + ] + }, + "request_body_spec": "{\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"properties\": {\n \"channels\": {\n \"description\": \"An array of channels to be linked to this account.\",\n \"items\": {\n \"properties\": {\n \"channel_id\": {\n \"description\": \"The ID of the channel. If this is a Microsoft Teams channel, the ID must be in the format of `{team_id}|{channel_id}`.\",\n \"type\": \"string\",\n \"x-go-name\": \"ChannelID\"\n },\n \"is_primary\": {\n \"description\": \"Whether this channel is the primary channel for the account.\",\n \"type\": \"boolean\",\n \"x-go-name\": \"IsPrimary\"\n },\n \"mirror_to\": {\n \"properties\": {\n \"channel_id\": {\n \"description\": \"The ID of the channel. If this is a Microsoft Teams channel, the ID must be in the format of `{team_id}|{channel_id}`.\",\n \"type\": \"string\",\n \"x-go-name\": \"ChannelID\"\n },\n \"source\": {\n \"description\": \"The source, which can be one of `[\\\"slack\\\", \\\"microsoft_teams\\\", \\\"discord\\\"]`.\",\n \"type\": \"string\",\n \"x-go-name\": \"Source\"\n }\n },\n \"type\": \"object\",\n \"x-go-package\": \"pylon/api/apiserver/apitypes\"\n },\n \"source\": {\n \"description\": \"The source, which can be one of `[\\\"slack\\\", \\\"microsoft_teams\\\", \\\"discord\\\"]`.\",\n \"type\": \"string\",\n \"x-go-name\": \"Source\"\n }\n },\n \"type\": \"object\",\n \"x-go-package\": \"pylon/api/apiserver/apitypes\"\n },\n \"type\": \"array\",\n \"x-go-name\": \"Channels\"\n },\n \"custom_fields\": {\n \"description\": \"An array of custom fields to be used on this account.\",\n \"items\": {\n \"properties\": {\n \"slug\": {\n \"description\": \"The slug of the custom field.\",\n \"type\": \"string\",\n \"x-go-name\": \"Slug\"\n },\n \"value\": {\n \"description\": \"The value of the custom field. Only to be used for single-valued custom fields. If unset, the custom field will be unset. If the custom field is a select field, the value must be the select option slug, which you can find from the GET /custom-fields endpoint.\",\n \"type\": \"string\",\n \"x-go-name\": \"Value\"\n },\n \"values\": {\n \"description\": \"The values of the custom field. Only to be used for multi-valued custom fields (ex. multiselect). If unset, the custom field will be unset. If the custom field is a multiselect field, the values must be the select option slugs which you can find from the GET /custom-fields endpoint.\",\n \"items\": {\n \"type\": \"string\"\n },\n \"type\": \"array\",\n \"x-go-name\": \"Values\"\n }\n },\n \"type\": \"object\",\n \"x-go-package\": \"pylon/api/apiserver/apitypes\"\n },\n \"type\": \"array\",\n \"x-go-name\": \"CustomFields\"\n },\n \"domain\": {\n \"description\": \"Deprecated. Please use Domains and PrimaryDomain instead.\",\n \"type\": \"string\",\n \"x-go-name\": \"Domain\"\n },\n \"domains\": {\n \"description\": \"The domains of the account, without any leading scheme, for example stripe.com. Must specify one domain as primary.\",\n \"items\": {\n \"type\": \"string\"\n },\n \"type\": \"array\",\n \"x-go-name\": \"Domains\"\n },\n \"external_ids\": {\n \"description\": \"An array of external IDs to be used on this account. If provided, the accounts external IDs will be updated to the given external IDs.\",\n \"items\": {\n \"properties\": {\n \"external_id\": {\n \"description\": \"The external ID. Must be unique per object type (ex. account).\",\n \"type\": \"string\",\n \"x-go-name\": \"ExternalID\"\n },\n \"label\": {\n \"description\": \"The label of the external ID. Must be unique per object.\",\n \"type\": \"string\",\n \"x-go-name\": \"Label\"\n }\n },\n \"type\": \"object\",\n \"x-go-package\": \"pylon/api/apiserver/apitypes\"\n },\n \"type\": \"array\",\n \"x-go-name\": \"ExternalIDs\"\n },\n \"logo_url\": {\n \"description\": \"The logo URL of the account. Must be a square .png, .jpg or .jpeg.\",\n \"type\": \"string\",\n \"x-go-name\": \"LogoURL\"\n },\n \"name\": {\n \"description\": \"The name of the account.\",\n \"type\": \"string\",\n \"x-go-name\": \"Name\"\n },\n \"owner_id\": {\n \"description\": \"The ID of the owner of the account.\",\n \"type\": \"string\",\n \"x-go-name\": \"OwnerID\"\n },\n \"primary_domain\": {\n \"description\": \"Must be in the list of domains. If there are any domains, there must be exactly one primary domain.\",\n \"type\": \"string\",\n \"x-go-name\": \"PrimaryDomain\"\n },\n \"tags\": {\n \"description\": \"An array of strings to use as tags on this account. If provided, the accounts tags will be updated to the given tags.\",\n \"items\": {\n \"type\": \"string\"\n },\n \"type\": \"array\",\n \"x-go-name\": \"Tags\"\n }\n },\n \"required\": [\n \"name\"\n ],\n \"type\": \"object\",\n \"x-go-package\": \"pylon/api/apiserver/endpoints\"\n }\n }\n },\n \"required\": false\n}", + "use_request_body_schema_mode": true, + "validate_request_body_schema": true, + "use_flatten_mode": false + }, + { + "name": "SearchAccounts", + "selected_for_wrapping": false, + "spec_built": true, + "wrap_finished": true, + "should_skip": false, + "skip_reason": null, + "wrapper_tool": { + "name": "search_accounts", + "description": { + "tagline": "Search and filter accounts using various criteria.", + "detailed": "This tool allows searching and filtering of accounts with specific criteria such as domains, tags, name, external IDs, and custom fields. It supports operators like 'contains', 'equals', 'in', 'not_in', and others, enabling detailed account queries." + }, + "return_annotation": "A list of filtered accounts based on specified criteria.", + "arguments": [ + { + "name": "account_search_criteria", + "alternative_names": [ + "account_filter_conditions", + "account_query_parameters" + ], + "description": "JSON object specifying pagination, filters, and limit. Includes cursor, filter details like field, operator, value(s), and limit for number of accounts.", + "endpoint_argument_name": "requestBody" + } + ] + }, + "method": "POST", + "path": "/accounts/search", + "tags": [ + "accounts" + ], + "summary": "Search for accounts by a given filter", + "description": "Currently, the following fields are filterable for accounts:\n\n* domains. Allowed operators: `contains`, `does_not_contain`, `in`, `not_in`\n\n* tags. Allowed operators: `contains`, `does_not_contain`, `in`, `not_in`\n\n* name. Allowed operators: `equals`, `in`, `not_in`\n\n* external_ids. Allowed operators: `equals`, `in`, `not_in`, `is_set`, `is_unset`\n\n* custom fields (pass in the slug of the custom field)", + "requires_security": true, + "oauth_scopes": [], + "security_schemes": [ + "bearerAuth" + ], + "parameters": { + "query": [], + "path": [], + "header": [], + "cookie": [], + "body": [ + { + "name": "requestBody", + "value_schema": { + "val_type": "json", + "inner_val_type": null, + "enum": null, + "properties": { + "cursor": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The cursor to use for pagination." + }, + "filter": { + "val_type": "json", + "inner_val_type": null, + "enum": null, + "properties": { + "field": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The field for this filter. For allowed fields, see the documentation for\n\nthe specific endpoint you are using.\n\nFor non-compound filters (any operators other than \"and\" or \"or\"),\n\nField must be set, along with either Value or Values, depending on the operator." + }, + "operator": { + "val_type": "string", + "inner_val_type": null, + "enum": [ + "equals", + "not_equals", + "contains", + "does_not_contain", + "in", + "not_in", + "and", + "or", + "time_is_after", + "time_is_before", + "time_range", + "string_contains", + "string_does_not_contain", + "is_set", + "is_unset" + ], + "properties": null, + "inner_properties": null, + "description": "The operator for this filter.\n\n* equals FilterOperatorEquals Matches objects that are exactly equal to the value in the field.\n\n* not_equals FilterOperatorNotEquals Matches objects that are not exactly equal to the value in the field.\n\n* contains FilterOperatorContains For a multi-valued field, such as tags, this operator will match objects that contain any of the values in the field.\n\n* does_not_contain FilterOperatorDoesNotContain For a multi-valued field, such as tags, this operator will match objects that do not contain any of the values in the field.\n\n* in FilterOperatorIn Matches objects if the field is one of several possible values, as specified in the values array.\n\n* not_in FilterOperatorNotIn Matches objects if the field is none of several possible values, as specified in the values array.\n\n* and FilterOperatorAnd Matches objects only if all subfilters match.\n\n* or FilterOperatorOr Matches objects if any subfilter matches.\n\n* time_is_after FilterOperatorTimeIsAfter Matches objects if the field is after the given time.\n\n* time_is_before FilterOperatorTimeIsBefore Matches objects if the field is before the given time.\n\n* time_range FilterOperatorTimeRange Matches objects if the field is between the given times.\n\n* string_contains FilterOperatorStringContains Matches objects if the field contains the given string.\n\n* string_does_not_contain FilterOperatorStringDoesNotContain Matches objects if the field does not contain the given string.\n\n* is_set FilterOperatorIsSet FilterOperatorIsSet matches objects if the field is set.\n\n* is_unset FilterOperatorIsUnset FilterOperatorIsUnset matches objects if the field is unset." + }, + "subfilters": { + "val_type": "array", + "inner_val_type": "json", + "enum": null, + "properties": null, + "inner_properties": {}, + "description": "Sub-filters for this filter. Valid only when operator is \"and\" or \"or\".\n\nThe maximum allowed depth for a tree of filters is 3." + }, + "value": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The value for this filter. Only used for single-valued operators\n\n(\"equals\", \"not_equals\", \"contains\", \"does_not_contain\")" + }, + "values": { + "val_type": "array", + "inner_val_type": "string", + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The values for this filter. Only used for multi-valued operators (\"in\", \"not_in\")." + } + }, + "inner_properties": null, + "description": null + }, + "limit": { + "val_type": "integer", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The number of accounts to fetch. Defaults to 100. Must be greater than 0 and less than 1000." + } + }, + "inner_properties": null, + "description": "" + }, + "description": "", + "required": false, + "deprecated": false, + "default": null, + "location": "body", + "content_type": "application/json", + "json_schema": { + "type": "object", + "properties": { + "cursor": { + "type": "string", + "description": "The cursor to use for pagination." + }, + "filter": { + "type": "object", + "properties": { + "field": { + "type": "string", + "description": "The field for this filter. For allowed fields, see the documentation for\n\nthe specific endpoint you are using.\n\nFor non-compound filters (any operators other than \"and\" or \"or\"),\n\nField must be set, along with either Value or Values, depending on the operator." + }, + "operator": { + "type": "string", + "description": "The operator for this filter.\n\n* equals FilterOperatorEquals Matches objects that are exactly equal to the value in the field.\n\n* not_equals FilterOperatorNotEquals Matches objects that are not exactly equal to the value in the field.\n\n* contains FilterOperatorContains For a multi-valued field, such as tags, this operator will match objects that contain any of the values in the field.\n\n* does_not_contain FilterOperatorDoesNotContain For a multi-valued field, such as tags, this operator will match objects that do not contain any of the values in the field.\n\n* in FilterOperatorIn Matches objects if the field is one of several possible values, as specified in the values array.\n\n* not_in FilterOperatorNotIn Matches objects if the field is none of several possible values, as specified in the values array.\n\n* and FilterOperatorAnd Matches objects only if all subfilters match.\n\n* or FilterOperatorOr Matches objects if any subfilter matches.\n\n* time_is_after FilterOperatorTimeIsAfter Matches objects if the field is after the given time.\n\n* time_is_before FilterOperatorTimeIsBefore Matches objects if the field is before the given time.\n\n* time_range FilterOperatorTimeRange Matches objects if the field is between the given times.\n\n* string_contains FilterOperatorStringContains Matches objects if the field contains the given string.\n\n* string_does_not_contain FilterOperatorStringDoesNotContain Matches objects if the field does not contain the given string.\n\n* is_set FilterOperatorIsSet FilterOperatorIsSet matches objects if the field is set.\n\n* is_unset FilterOperatorIsUnset FilterOperatorIsUnset matches objects if the field is unset.", + "enum": [ + "equals", + "not_equals", + "contains", + "does_not_contain", + "in", + "not_in", + "and", + "or", + "time_is_after", + "time_is_before", + "time_range", + "string_contains", + "string_does_not_contain", + "is_set", + "is_unset" + ] + }, + "subfilters": { + "type": "array", + "description": "Sub-filters for this filter. Valid only when operator is \"and\" or \"or\".\n\nThe maximum allowed depth for a tree of filters is 3.", + "items": { + "type": "object", + "properties": {} + } + }, + "value": { + "type": "string", + "description": "The value for this filter. Only used for single-valued operators\n\n(\"equals\", \"not_equals\", \"contains\", \"does_not_contain\")" + }, + "values": { + "type": "array", + "description": "The values for this filter. Only used for multi-valued operators (\"in\", \"not_in\").", + "items": { + "type": "string" + } + } + }, + "required": [ + "field", + "operator" + ] + }, + "limit": { + "type": "integer", + "description": "The number of accounts to fetch. Defaults to 100. Must be greater than 0 and less than 1000.", + "format": "int64" + } + }, + "required": [ + "filter" + ] + }, + "schema_required": false + } + ] + }, + "request_body_spec": "{\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"properties\": {\n \"cursor\": {\n \"description\": \"The cursor to use for pagination.\",\n \"type\": \"string\",\n \"x-go-name\": \"Cursor\"\n },\n \"filter\": {\n \"properties\": {\n \"field\": {\n \"description\": \"The field for this filter. For allowed fields, see the documentation for\\n\\nthe specific endpoint you are using.\\n\\nFor non-compound filters (any operators other than \\\"and\\\" or \\\"or\\\"),\\n\\nField must be set, along with either Value or Values, depending on the operator.\",\n \"type\": \"string\",\n \"x-go-name\": \"Field\"\n },\n \"operator\": {\n \"description\": \"The operator for this filter.\\n\\n* equals FilterOperatorEquals Matches objects that are exactly equal to the value in the field.\\n\\n* not_equals FilterOperatorNotEquals Matches objects that are not exactly equal to the value in the field.\\n\\n* contains FilterOperatorContains For a multi-valued field, such as tags, this operator will match objects that contain any of the values in the field.\\n\\n* does_not_contain FilterOperatorDoesNotContain For a multi-valued field, such as tags, this operator will match objects that do not contain any of the values in the field.\\n\\n* in FilterOperatorIn Matches objects if the field is one of several possible values, as specified in the values array.\\n\\n* not_in FilterOperatorNotIn Matches objects if the field is none of several possible values, as specified in the values array.\\n\\n* and FilterOperatorAnd Matches objects only if all subfilters match.\\n\\n* or FilterOperatorOr Matches objects if any subfilter matches.\\n\\n* time_is_after FilterOperatorTimeIsAfter Matches objects if the field is after the given time.\\n\\n* time_is_before FilterOperatorTimeIsBefore Matches objects if the field is before the given time.\\n\\n* time_range FilterOperatorTimeRange Matches objects if the field is between the given times.\\n\\n* string_contains FilterOperatorStringContains Matches objects if the field contains the given string.\\n\\n* string_does_not_contain FilterOperatorStringDoesNotContain Matches objects if the field does not contain the given string.\\n\\n* is_set FilterOperatorIsSet FilterOperatorIsSet matches objects if the field is set.\\n\\n* is_unset FilterOperatorIsUnset FilterOperatorIsUnset matches objects if the field is unset.\",\n \"enum\": [\n \"equals\",\n \"not_equals\",\n \"contains\",\n \"does_not_contain\",\n \"in\",\n \"not_in\",\n \"and\",\n \"or\",\n \"time_is_after\",\n \"time_is_before\",\n \"time_range\",\n \"string_contains\",\n \"string_does_not_contain\",\n \"is_set\",\n \"is_unset\"\n ],\n \"type\": \"string\",\n \"x-go-enum-desc\": \"equals FilterOperatorEquals Matches objects that are exactly equal to the value in the field.\\nnot_equals FilterOperatorNotEquals Matches objects that are not exactly equal to the value in the field.\\ncontains FilterOperatorContains For a multi-valued field, such as tags, this operator will match objects that contain any of the values in the field.\\ndoes_not_contain FilterOperatorDoesNotContain For a multi-valued field, such as tags, this operator will match objects that do not contain any of the values in the field.\\nin FilterOperatorIn Matches objects if the field is one of several possible values, as specified in the values array.\\nnot_in FilterOperatorNotIn Matches objects if the field is none of several possible values, as specified in the values array.\\nand FilterOperatorAnd Matches objects only if all subfilters match.\\nor FilterOperatorOr Matches objects if any subfilter matches.\\ntime_is_after FilterOperatorTimeIsAfter Matches objects if the field is after the given time.\\ntime_is_before FilterOperatorTimeIsBefore Matches objects if the field is before the given time.\\ntime_range FilterOperatorTimeRange Matches objects if the field is between the given times.\\nstring_contains FilterOperatorStringContains Matches objects if the field contains the given string.\\nstring_does_not_contain FilterOperatorStringDoesNotContain Matches objects if the field does not contain the given string.\\nis_set FilterOperatorIsSet FilterOperatorIsSet matches objects if the field is set.\\nis_unset FilterOperatorIsUnset FilterOperatorIsUnset matches objects if the field is unset.\",\n \"x-go-name\": \"Operator\"\n },\n \"subfilters\": {\n \"description\": \"Sub-filters for this filter. Valid only when operator is \\\"and\\\" or \\\"or\\\".\\n\\nThe maximum allowed depth for a tree of filters is 3.\",\n \"items\": {\n \"$ref\": \"#/components/schemas/Filter\",\n \"has_circular_reference\": true\n },\n \"type\": \"array\",\n \"x-go-name\": \"Subfilters\"\n },\n \"value\": {\n \"description\": \"The value for this filter. Only used for single-valued operators\\n\\n(\\\"equals\\\", \\\"not_equals\\\", \\\"contains\\\", \\\"does_not_contain\\\")\",\n \"type\": \"string\",\n \"x-go-name\": \"Value\"\n },\n \"values\": {\n \"description\": \"The values for this filter. Only used for multi-valued operators (\\\"in\\\", \\\"not_in\\\").\",\n \"items\": {\n \"type\": \"string\"\n },\n \"type\": \"array\",\n \"x-go-name\": \"Values\"\n }\n },\n \"required\": [\n \"field\",\n \"operator\"\n ],\n \"type\": \"object\",\n \"x-go-package\": \"pylon/api/apiserver/apitypes\"\n },\n \"limit\": {\n \"description\": \"The number of accounts to fetch. Defaults to 100. Must be greater than 0 and less than 1000.\",\n \"format\": \"int64\",\n \"type\": \"integer\",\n \"x-go-name\": \"Limit\"\n }\n },\n \"required\": [\n \"filter\"\n ],\n \"type\": \"object\",\n \"x-go-package\": \"pylon/api/apiserver/endpoints\"\n }\n }\n },\n \"required\": false\n}", + "use_request_body_schema_mode": true, + "validate_request_body_schema": false, + "use_flatten_mode": false + }, + { + "name": "CreateAccountHighlight", + "selected_for_wrapping": false, + "spec_built": true, + "wrap_finished": true, + "should_skip": false, + "skip_reason": null, + "wrapper_tool": { + "name": "create_account_highlight", + "description": { + "tagline": "Create a highlight for a specified account.", + "detailed": "This tool is used to create a highlight for an account, using either an internal account ID in UUID format or an external ID in string format. It should be called when there is a need to add or update a highlight for an account." + }, + "return_annotation": "A confirmation of the account highlight creation.", + "arguments": [ + { + "name": "account_identifier", + "alternative_names": [ + "account_id_string", + "account_external_id" + ], + "description": "The ID (UUID) or external ID (string) of the account for the highlight.", + "endpoint_argument_name": "account_id" + }, + { + "name": "highlight_details", + "alternative_names": [ + "highlight_content", + "highlight_data" + ], + "description": "A JSON object containing 'content_html' for the highlight's HTML content, and 'expires_at' for the expiration timestamp (optional, RFC3339 format).", + "endpoint_argument_name": "requestBody" + } + ] + }, + "method": "POST", + "path": "/accounts/{account_id}/highlights", + "tags": [ + "account-highlights" + ], + "summary": "Creates a new account highlight.", + "description": "The {account_id} parameter accepts either:\n\nInternal account ID (UUID format)\n\nExternal ID (any string format)", + "requires_security": true, + "oauth_scopes": [], + "security_schemes": [ + "bearerAuth" + ], + "parameters": { + "query": [], + "path": [ + { + "name": "account_id", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The ID or external ID of the account that the highlight belongs to." + }, + "description": "The ID or external ID of the account that the highlight belongs to.", + "required": true, + "deprecated": false, + "default": null, + "location": "path", + "content_type": null, + "json_schema": { + "type": "string" + }, + "schema_required": false + } + ], + "header": [], + "cookie": [], + "body": [ + { + "name": "requestBody", + "value_schema": { + "val_type": "json", + "inner_val_type": null, + "enum": null, + "properties": { + "content_html": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The HTML content for this highlight." + }, + "expires_at": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "Optional RFC3339 timestamp of when this highlight will expire." + } + }, + "inner_properties": null, + "description": "" + }, + "description": "", + "required": false, + "deprecated": false, + "default": null, + "location": "body", + "content_type": "application/json", + "json_schema": { + "type": "object", + "properties": { + "content_html": { + "type": "string", + "description": "The HTML content for this highlight." + }, + "expires_at": { + "type": "string", + "description": "Optional RFC3339 timestamp of when this highlight will expire." + } + }, + "required": [ + "content_html" + ] + }, + "schema_required": false + } + ] + }, + "request_body_spec": "{\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"properties\": {\n \"content_html\": {\n \"description\": \"The HTML content for this highlight.\",\n \"type\": \"string\",\n \"x-go-name\": \"ContentHTML\"\n },\n \"expires_at\": {\n \"description\": \"Optional RFC3339 timestamp of when this highlight will expire.\",\n \"type\": \"string\",\n \"x-go-name\": \"ExpiresAt\"\n }\n },\n \"required\": [\n \"content_html\"\n ],\n \"type\": \"object\",\n \"x-go-package\": \"pylon/api/apiserver/endpoints\"\n }\n }\n },\n \"required\": false\n}", + "use_request_body_schema_mode": true, + "validate_request_body_schema": true, + "use_flatten_mode": false + }, + { + "name": "DeleteAccountHighlight", + "selected_for_wrapping": false, + "spec_built": true, + "wrap_finished": true, + "should_skip": false, + "skip_reason": null, + "wrapper_tool": { + "name": "delete_account_highlight", + "description": { + "tagline": "Delete a specific highlight from an account.", + "detailed": "Use this tool to delete a specific highlight by providing the account ID and highlight ID. It should be called when a user wants to remove a highlight linked to an account." + }, + "return_annotation": "Confirmation of account highlight deletion.", + "arguments": [ + { + "name": "account_identifier", + "alternative_names": [ + "account_id_value", + "external_account_id" + ], + "description": "The ID or external ID of the account that the highlight belongs to. Can be a UUID or any string.", + "endpoint_argument_name": "account_id" + }, + { + "name": "highlight_id", + "alternative_names": [ + "highlight_identifier", + "highlight_key" + ], + "description": "The unique ID of the highlight you intend to delete.", + "endpoint_argument_name": "highlight_id" + } + ] + }, + "method": "DELETE", + "path": "/accounts/{account_id}/highlights/{highlight_id}", + "tags": [ + "account-highlights" + ], + "summary": "Deletes an account highlight.", + "description": "The {account_id} parameter accepts either:\n\nInternal account ID (UUID format)\n\nExternal ID (any string format)", + "requires_security": true, + "oauth_scopes": [], + "security_schemes": [ + "bearerAuth" + ], + "parameters": { + "query": [], + "path": [ + { + "name": "account_id", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The ID or external ID of the account that the highlight belongs to." + }, + "description": "The ID or external ID of the account that the highlight belongs to.", + "required": true, + "deprecated": false, + "default": null, + "location": "path", + "content_type": null, + "json_schema": { + "type": "string" + }, + "schema_required": false + }, + { + "name": "highlight_id", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The ID of the highlight to delete." + }, + "description": "The ID of the highlight to delete.", + "required": true, + "deprecated": false, + "default": null, + "location": "path", + "content_type": null, + "json_schema": { + "type": "string" + }, + "schema_required": false + } + ], + "header": [], + "cookie": [], + "body": [] + }, + "request_body_spec": null, + "use_request_body_schema_mode": false, + "validate_request_body_schema": false, + "use_flatten_mode": false + }, + { + "name": "UpdateAccountHighlight", + "selected_for_wrapping": false, + "spec_built": true, + "wrap_finished": true, + "should_skip": false, + "skip_reason": null, + "wrapper_tool": { + "name": "update_account_highlight", + "description": { + "tagline": "Updates the highlight for a specified account.", + "detailed": "Use this tool to update the highlight information for a given account by specifying either the internal account ID or an external ID. Appropriate when modifications to account highlights are needed." + }, + "return_annotation": "Confirmation of account highlight update.", + "arguments": [ + { + "name": "highlight_id", + "alternative_names": [ + "highlight_identifier", + "highlight_reference_id" + ], + "description": "The unique identifier of the highlight you wish to update. Ensure this accurately corresponds to the highlight needing modification.", + "endpoint_argument_name": "highlight_id" + }, + { + "name": "account_identifier", + "alternative_names": [ + "account_id_value", + "account_reference" + ], + "description": "The internal account ID (UUID) or external ID (any string) of the account associated with the highlight.", + "endpoint_argument_name": "account_id" + }, + { + "name": "updated_html_content", + "alternative_names": [ + "html_content_update", + "highlight_html_content" + ], + "description": "The updated HTML content for the account highlight.", + "endpoint_argument_name": "content_html" + }, + { + "name": "updated_expiration_timestamp", + "alternative_names": [ + "new_expiry_timestamp", + "expiry_timestamp_update" + ], + "description": "The new expiration timestamp for the highlight in RFC3339 format.", + "endpoint_argument_name": "expires_at" + } + ] + }, + "method": "PATCH", + "path": "/accounts/{account_id}/highlights/{highlight_id}", + "tags": [ + "account-highlights" + ], + "summary": "Updates an account highlight.", + "description": "The {account_id} parameter accepts either:\n\nInternal account ID (UUID format)\n\nExternal ID (any string format)", + "requires_security": true, + "oauth_scopes": [], + "security_schemes": [ + "bearerAuth" + ], + "parameters": { + "query": [], + "path": [ + { + "name": "highlight_id", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The ID of the highlight to update." + }, + "description": "The ID of the highlight to update.", + "required": true, + "deprecated": false, + "default": null, + "location": "path", + "content_type": null, + "json_schema": { + "type": "string" + }, + "schema_required": false + }, + { + "name": "account_id", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The ID or external ID of the account that the highlight belongs to." + }, + "description": "The ID or external ID of the account that the highlight belongs to.", + "required": true, + "deprecated": false, + "default": null, + "location": "path", + "content_type": null, + "json_schema": { + "type": "string" + }, + "schema_required": false + } + ], + "header": [], + "cookie": [], + "body": [ + { + "name": "content_html", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The updated HTML content for this highlight." + }, + "description": "The updated HTML content for this highlight.", + "required": false, + "deprecated": false, + "default": null, + "location": "body", + "content_type": "application/json", + "json_schema": { + "type": "string", + "description": "The updated HTML content for this highlight." + }, + "schema_required": false + }, + { + "name": "expires_at", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The updated expires at timestamp (RFC3339)." + }, + "description": "The updated expires at timestamp (RFC3339).", + "required": false, + "deprecated": false, + "default": null, + "location": "body", + "content_type": "application/json", + "json_schema": { + "type": "string", + "description": "The updated expires at timestamp (RFC3339)." + }, + "schema_required": false + } + ] + }, + "request_body_spec": "{\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"properties\": {\n \"content_html\": {\n \"description\": \"The updated HTML content for this highlight.\",\n \"type\": \"string\",\n \"x-go-name\": \"ContentHTML\"\n },\n \"expires_at\": {\n \"description\": \"The updated expires at timestamp (RFC3339).\",\n \"type\": \"string\",\n \"x-go-name\": \"ExpiresAt\"\n }\n },\n \"type\": \"object\",\n \"x-go-package\": \"pylon/api/apiserver/endpoints\"\n }\n }\n },\n \"required\": false\n}", + "use_request_body_schema_mode": false, + "validate_request_body_schema": false, + "use_flatten_mode": true + }, + { + "name": "DeleteAccount", + "selected_for_wrapping": false, + "spec_built": true, + "wrap_finished": true, + "should_skip": false, + "skip_reason": null, + "wrapper_tool": { + "name": "delete_account", + "description": { + "tagline": "Delete an existing account.", + "detailed": "This tool deletes an existing account based on the provided account ID. Call this tool when you need to permanently remove an account." + }, + "return_annotation": "Confirmation of account deletion.", + "arguments": [ + { + "name": "account_id", + "alternative_names": [ + "account_identifier", + "user_account_id" + ], + "description": "The ID or external ID of the account to delete.", + "endpoint_argument_name": "id" + } + ] + }, + "method": "DELETE", + "path": "/accounts/{id}", + "tags": [ + "accounts" + ], + "summary": "", + "description": "Delete an existing account", + "requires_security": true, + "oauth_scopes": [], + "security_schemes": [ + "bearerAuth" + ], + "parameters": { + "query": [], + "path": [ + { + "name": "id", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The ID or external ID of the account to delete." + }, + "description": "The ID or external ID of the account to delete.", + "required": true, + "deprecated": false, + "default": null, + "location": "path", + "content_type": null, + "json_schema": { + "type": "string" + }, + "schema_required": false + } + ], + "header": [], + "cookie": [], + "body": [] + }, + "request_body_spec": null, + "use_request_body_schema_mode": false, + "validate_request_body_schema": false, + "use_flatten_mode": false + }, + { + "name": "GetAccount", + "selected_for_wrapping": false, + "spec_built": true, + "wrap_finished": true, + "should_skip": false, + "skip_reason": null, + "wrapper_tool": { + "name": "get_account_info", + "description": { + "tagline": "Retrieve an account's details using its ID or external ID.", + "detailed": "Call this tool to obtain detailed information about an account by providing either the account ID or external ID." + }, + "return_annotation": "Returns account details by ID or external ID.", + "arguments": [ + { + "name": "account_id", + "alternative_names": [ + "id", + "external_account_id" + ], + "description": "The ID or external ID of the account to fetch.", + "endpoint_argument_name": "id" + } + ] + }, + "method": "GET", + "path": "/accounts/{id}", + "tags": [ + "accounts" + ], + "summary": "", + "description": "Get an account by its ID or external ID", + "requires_security": true, + "oauth_scopes": [], + "security_schemes": [ + "bearerAuth" + ], + "parameters": { + "query": [], + "path": [ + { + "name": "id", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The ID or external ID of the account to fetch." + }, + "description": "The ID or external ID of the account to fetch.", + "required": true, + "deprecated": false, + "default": null, + "location": "path", + "content_type": null, + "json_schema": { + "type": "string" + }, + "schema_required": false + } + ], + "header": [], + "cookie": [], + "body": [] + }, + "request_body_spec": null, + "use_request_body_schema_mode": false, + "validate_request_body_schema": false, + "use_flatten_mode": false + }, + { + "name": "UpdateAccount", + "selected_for_wrapping": false, + "spec_built": true, + "wrap_finished": true, + "should_skip": false, + "skip_reason": null, + "wrapper_tool": { + "name": "update_account", + "description": { + "tagline": "Update details of an existing account.", + "detailed": "Use this tool to modify the information of an existing account by providing the account ID and new details. It should be called when account information needs to be updated." + }, + "return_annotation": "Confirmation of account update.", + "arguments": [ + { + "name": "account_id", + "alternative_names": [ + "account_identifier", + "external_id" + ], + "description": "The ID or external ID of the account to update.", + "endpoint_argument_name": "id" + }, + { + "name": "account_update_details", + "alternative_names": [ + "update_payload", + "account_modification_data" + ], + "description": "JSON containing details to update an account like channels, custom fields, domains, etc.", + "endpoint_argument_name": "requestBody" + } + ] + }, + "method": "PATCH", + "path": "/accounts/{id}", + "tags": [ + "accounts" + ], + "summary": "", + "description": "Update an existing account", + "requires_security": true, + "oauth_scopes": [], + "security_schemes": [ + "bearerAuth" + ], + "parameters": { + "query": [], + "path": [ + { + "name": "id", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The ID or external ID of the account to update." + }, + "description": "The ID or external ID of the account to update.", + "required": true, + "deprecated": false, + "default": null, + "location": "path", + "content_type": null, + "json_schema": { + "type": "string" + }, + "schema_required": false + } + ], + "header": [], + "cookie": [], + "body": [ + { + "name": "requestBody", + "value_schema": { + "val_type": "json", + "inner_val_type": null, + "enum": null, + "properties": { + "channels": { + "val_type": "array", + "inner_val_type": "json", + "enum": null, + "properties": null, + "inner_properties": { + "channel_id": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The ID of the channel. If this is a Microsoft Teams channel, the ID must be in the format of `{team_id}|{channel_id}`." + }, + "is_primary": { + "val_type": "boolean", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "Whether this channel is the primary channel for the account." + }, + "mirror_to": { + "val_type": "json", + "inner_val_type": null, + "enum": null, + "properties": { + "channel_id": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The ID of the channel. If this is a Microsoft Teams channel, the ID must be in the format of `{team_id}|{channel_id}`." + }, + "source": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The source, which can be one of `[\"slack\", \"microsoft_teams\", \"discord\"]`." + } + }, + "inner_properties": null, + "description": null + }, + "source": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The source, which can be one of `[\"slack\", \"microsoft_teams\", \"discord\"]`." + } + }, + "description": "An array of channels to be linked to this account." + }, + "custom_fields": { + "val_type": "array", + "inner_val_type": "json", + "enum": null, + "properties": null, + "inner_properties": { + "slug": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The slug of the custom field." + }, + "value": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The value of the custom field. Only to be used for single-valued custom fields. If unset, the custom field will be unset. If the custom field is a select field, the value must be the select option slug, which you can find from the GET /custom-fields endpoint." + }, + "values": { + "val_type": "array", + "inner_val_type": "string", + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The values of the custom field. Only to be used for multi-valued custom fields (ex. multiselect). If unset, the custom field will be unset. If the custom field is a multiselect field, the values must be the select option slugs which you can find from the GET /custom-fields endpoint." + } + }, + "description": "An array of custom fields to be used on this account." + }, + "domains": { + "val_type": "array", + "inner_val_type": "string", + "enum": null, + "properties": null, + "inner_properties": null, + "description": "Domains of the account. Must specify one domain as primary." + }, + "external_ids": { + "val_type": "array", + "inner_val_type": "json", + "enum": null, + "properties": null, + "inner_properties": { + "external_id": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The external ID. Must be unique per object type (ex. account)." + }, + "label": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The label of the external ID. Must be unique per object." + } + }, + "description": "An array of external IDs to be used on this account. If provided, the accounts external IDs will be updated to the given external IDs." + }, + "logo_url": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "Logo URL of the account." + }, + "name": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The name of the account." + }, + "owner_id": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The ID of the owner of the account." + }, + "primary_domain": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "Must be in the list of domains. If there are any domains, there must be exactly one primary domain." + }, + "tags": { + "val_type": "array", + "inner_val_type": "string", + "enum": null, + "properties": null, + "inner_properties": null, + "description": "An array of strings to use as tags on this account. If provided, the accounts tags will be updated to the given tags." + } + }, + "inner_properties": null, + "description": "" + }, + "description": "", + "required": false, + "deprecated": false, + "default": null, + "location": "body", + "content_type": "application/json", + "json_schema": { + "type": "object", + "properties": { + "channels": { + "type": "array", + "description": "An array of channels to be linked to this account.", + "items": { + "type": "object", + "properties": { + "channel_id": { + "type": "string", + "description": "The ID of the channel. If this is a Microsoft Teams channel, the ID must be in the format of `{team_id}|{channel_id}`." + }, + "is_primary": { + "type": "boolean", + "description": "Whether this channel is the primary channel for the account." + }, + "mirror_to": { + "type": "object", + "properties": { + "channel_id": { + "type": "string", + "description": "The ID of the channel. If this is a Microsoft Teams channel, the ID must be in the format of `{team_id}|{channel_id}`." + }, + "source": { + "type": "string", + "description": "The source, which can be one of `[\"slack\", \"microsoft_teams\", \"discord\"]`." + } + } + }, + "source": { + "type": "string", + "description": "The source, which can be one of `[\"slack\", \"microsoft_teams\", \"discord\"]`." + } + } + } + }, + "custom_fields": { + "type": "array", + "description": "An array of custom fields to be used on this account.", + "items": { + "type": "object", + "properties": { + "slug": { + "type": "string", + "description": "The slug of the custom field." + }, + "value": { + "type": "string", + "description": "The value of the custom field. Only to be used for single-valued custom fields. If unset, the custom field will be unset. If the custom field is a select field, the value must be the select option slug, which you can find from the GET /custom-fields endpoint." + }, + "values": { + "type": "array", + "description": "The values of the custom field. Only to be used for multi-valued custom fields (ex. multiselect). If unset, the custom field will be unset. If the custom field is a multiselect field, the values must be the select option slugs which you can find from the GET /custom-fields endpoint.", + "items": { + "type": "string" + } + } + } + } + }, + "domains": { + "type": "array", + "description": "Domains of the account. Must specify one domain as primary.", + "items": { + "type": "string" + } + }, + "external_ids": { + "type": "array", + "description": "An array of external IDs to be used on this account. If provided, the accounts external IDs will be updated to the given external IDs.", + "items": { + "type": "object", + "properties": { + "external_id": { + "type": "string", + "description": "The external ID. Must be unique per object type (ex. account)." + }, + "label": { + "type": "string", + "description": "The label of the external ID. Must be unique per object." + } + } + } + }, + "logo_url": { + "type": "string", + "description": "Logo URL of the account." + }, + "name": { + "type": "string", + "description": "The name of the account." + }, + "owner_id": { + "type": "string", + "description": "The ID of the owner of the account." + }, + "primary_domain": { + "type": "string", + "description": "Must be in the list of domains. If there are any domains, there must be exactly one primary domain." + }, + "tags": { + "type": "array", + "description": "An array of strings to use as tags on this account. If provided, the accounts tags will be updated to the given tags.", + "items": { + "type": "string" + } + } + } + }, + "schema_required": false + } + ] + }, + "request_body_spec": "{\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"properties\": {\n \"channels\": {\n \"description\": \"An array of channels to be linked to this account.\",\n \"items\": {\n \"properties\": {\n \"channel_id\": {\n \"description\": \"The ID of the channel. If this is a Microsoft Teams channel, the ID must be in the format of `{team_id}|{channel_id}`.\",\n \"type\": \"string\",\n \"x-go-name\": \"ChannelID\"\n },\n \"is_primary\": {\n \"description\": \"Whether this channel is the primary channel for the account.\",\n \"type\": \"boolean\",\n \"x-go-name\": \"IsPrimary\"\n },\n \"mirror_to\": {\n \"properties\": {\n \"channel_id\": {\n \"description\": \"The ID of the channel. If this is a Microsoft Teams channel, the ID must be in the format of `{team_id}|{channel_id}`.\",\n \"type\": \"string\",\n \"x-go-name\": \"ChannelID\"\n },\n \"source\": {\n \"description\": \"The source, which can be one of `[\\\"slack\\\", \\\"microsoft_teams\\\", \\\"discord\\\"]`.\",\n \"type\": \"string\",\n \"x-go-name\": \"Source\"\n }\n },\n \"type\": \"object\",\n \"x-go-package\": \"pylon/api/apiserver/apitypes\"\n },\n \"source\": {\n \"description\": \"The source, which can be one of `[\\\"slack\\\", \\\"microsoft_teams\\\", \\\"discord\\\"]`.\",\n \"type\": \"string\",\n \"x-go-name\": \"Source\"\n }\n },\n \"type\": \"object\",\n \"x-go-package\": \"pylon/api/apiserver/apitypes\"\n },\n \"type\": \"array\",\n \"x-go-name\": \"Channels\"\n },\n \"custom_fields\": {\n \"description\": \"An array of custom fields to be used on this account.\",\n \"items\": {\n \"properties\": {\n \"slug\": {\n \"description\": \"The slug of the custom field.\",\n \"type\": \"string\",\n \"x-go-name\": \"Slug\"\n },\n \"value\": {\n \"description\": \"The value of the custom field. Only to be used for single-valued custom fields. If unset, the custom field will be unset. If the custom field is a select field, the value must be the select option slug, which you can find from the GET /custom-fields endpoint.\",\n \"type\": \"string\",\n \"x-go-name\": \"Value\"\n },\n \"values\": {\n \"description\": \"The values of the custom field. Only to be used for multi-valued custom fields (ex. multiselect). If unset, the custom field will be unset. If the custom field is a multiselect field, the values must be the select option slugs which you can find from the GET /custom-fields endpoint.\",\n \"items\": {\n \"type\": \"string\"\n },\n \"type\": \"array\",\n \"x-go-name\": \"Values\"\n }\n },\n \"type\": \"object\",\n \"x-go-package\": \"pylon/api/apiserver/apitypes\"\n },\n \"type\": \"array\",\n \"x-go-name\": \"CustomFields\"\n },\n \"domains\": {\n \"description\": \"Domains of the account. Must specify one domain as primary.\",\n \"items\": {\n \"type\": \"string\"\n },\n \"type\": \"array\",\n \"x-go-name\": \"Domains\"\n },\n \"external_ids\": {\n \"description\": \"An array of external IDs to be used on this account. If provided, the accounts external IDs will be updated to the given external IDs.\",\n \"items\": {\n \"properties\": {\n \"external_id\": {\n \"description\": \"The external ID. Must be unique per object type (ex. account).\",\n \"type\": \"string\",\n \"x-go-name\": \"ExternalID\"\n },\n \"label\": {\n \"description\": \"The label of the external ID. Must be unique per object.\",\n \"type\": \"string\",\n \"x-go-name\": \"Label\"\n }\n },\n \"type\": \"object\",\n \"x-go-package\": \"pylon/api/apiserver/apitypes\"\n },\n \"type\": \"array\",\n \"x-go-name\": \"ExternalIDs\"\n },\n \"logo_url\": {\n \"description\": \"Logo URL of the account.\",\n \"type\": \"string\",\n \"x-go-name\": \"LogoURL\"\n },\n \"name\": {\n \"description\": \"The name of the account.\",\n \"type\": \"string\",\n \"x-go-name\": \"Name\"\n },\n \"owner_id\": {\n \"description\": \"The ID of the owner of the account.\",\n \"type\": \"string\",\n \"x-go-name\": \"OwnerID\"\n },\n \"primary_domain\": {\n \"description\": \"Must be in the list of domains. If there are any domains, there must be exactly one primary domain.\",\n \"type\": \"string\",\n \"x-go-name\": \"PrimaryDomain\"\n },\n \"tags\": {\n \"description\": \"An array of strings to use as tags on this account. If provided, the accounts tags will be updated to the given tags.\",\n \"items\": {\n \"type\": \"string\"\n },\n \"type\": \"array\",\n \"x-go-name\": \"Tags\"\n }\n },\n \"type\": \"object\",\n \"x-go-package\": \"pylon/api/apiserver/endpoints\"\n }\n }\n },\n \"required\": false\n}", + "use_request_body_schema_mode": true, + "validate_request_body_schema": true, + "use_flatten_mode": false + }, + { + "name": "CreateActivity", + "selected_for_wrapping": false, + "spec_built": true, + "wrap_finished": true, + "should_skip": false, + "skip_reason": null, + "wrapper_tool": { + "name": "create_account_activity", + "description": { + "tagline": "Creates a new activity for a specified account.", + "detailed": "Use this tool to add a new activity to an account by providing the account's internal or external ID. It will confirm the creation of the activity." + }, + "return_annotation": "Confirmation of the created activity for the account.", + "arguments": [ + { + "name": "account_id_for_activity", + "alternative_names": [ + "activity_account_id", + "account_identifier_for_activity" + ], + "description": "The internal or external ID of the account to create the activity for. Accepts a UUID or any string format.", + "endpoint_argument_name": "id" + }, + { + "name": "activity_details", + "alternative_names": [ + "activity_info", + "activity_data" + ], + "description": "JSON object containing details about the activity, including optional fields like body_html, contact_id, happened_at, link, link_text, slug, and user_id.", + "endpoint_argument_name": "requestBody" + } + ] + }, + "method": "POST", + "path": "/accounts/{id}/activities", + "tags": [ + "accounts" + ], + "summary": "", + "description": "Create a new activity for an account\n\nThe {id} parameter accepts either:\n\nInternal account ID (UUID format)\n\nExternal ID (any string format)", + "requires_security": true, + "oauth_scopes": [], + "security_schemes": [ + "bearerAuth" + ], + "parameters": { + "query": [], + "path": [ + { + "name": "id", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The ID or external ID of the account to create the activity for." + }, + "description": "The ID or external ID of the account to create the activity for.", + "required": true, + "deprecated": false, + "default": null, + "location": "path", + "content_type": null, + "json_schema": { + "type": "string" + }, + "schema_required": false + } + ], + "header": [], + "cookie": [], + "body": [ + { + "name": "requestBody", + "value_schema": { + "val_type": "json", + "inner_val_type": null, + "enum": null, + "properties": { + "body_html": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "Optional HTML content to display in the activity." + }, + "contact_id": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "Optional contact ID of the actor of the activity." + }, + "happened_at": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "Timestamp (RFC3339) of when the activity happened. Defaults to the current time if empty." + }, + "link": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "Optional link to add to the activity." + }, + "link_text": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "Optional link text to display on the activity. Defaults to \"Open link\" if not provided. Applies only if a link is provided." + }, + "slug": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The slug of the activity to create." + }, + "user_id": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "Optional user ID of the actor of the activity." + } + }, + "inner_properties": null, + "description": "" + }, + "description": "", + "required": false, + "deprecated": false, + "default": null, + "location": "body", + "content_type": "application/json", + "json_schema": { + "type": "object", + "properties": { + "body_html": { + "type": "string", + "description": "Optional HTML content to display in the activity." + }, + "contact_id": { + "type": "string", + "description": "Optional contact ID of the actor of the activity." + }, + "happened_at": { + "type": "string", + "description": "Timestamp (RFC3339) of when the activity happened. Defaults to the current time if empty." + }, + "link": { + "type": "string", + "description": "Optional link to add to the activity." + }, + "link_text": { + "type": "string", + "description": "Optional link text to display on the activity. Defaults to \"Open link\" if not provided. Applies only if a link is provided." + }, + "slug": { + "type": "string", + "description": "The slug of the activity to create." + }, + "user_id": { + "type": "string", + "description": "Optional user ID of the actor of the activity." + } + }, + "required": [ + "slug" + ] + }, + "schema_required": false + } + ] + }, + "request_body_spec": "{\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"properties\": {\n \"body_html\": {\n \"description\": \"Optional HTML content to display in the activity.\",\n \"type\": \"string\",\n \"x-go-name\": \"BodyHTML\"\n },\n \"contact_id\": {\n \"description\": \"Optional contact ID of the actor of the activity.\",\n \"type\": \"string\",\n \"x-go-name\": \"ContactID\"\n },\n \"happened_at\": {\n \"description\": \"Timestamp (RFC3339) of when the activity happened. Defaults to the current time if empty.\",\n \"type\": \"string\",\n \"x-go-name\": \"HappenedAt\"\n },\n \"link\": {\n \"description\": \"Optional link to add to the activity.\",\n \"type\": \"string\",\n \"x-go-name\": \"Link\"\n },\n \"link_text\": {\n \"description\": \"Optional link text to display on the activity. Defaults to \\\"Open link\\\" if not provided. Applies only if a link is provided.\",\n \"type\": \"string\",\n \"x-go-name\": \"LinkText\"\n },\n \"slug\": {\n \"description\": \"The slug of the activity to create.\",\n \"type\": \"string\",\n \"x-go-name\": \"Slug\"\n },\n \"user_id\": {\n \"description\": \"Optional user ID of the actor of the activity.\",\n \"type\": \"string\",\n \"x-go-name\": \"UserID\"\n }\n },\n \"required\": [\n \"slug\"\n ],\n \"type\": \"object\",\n \"x-go-package\": \"pylon/api/apiserver/endpoints\"\n }\n }\n },\n \"required\": false\n}", + "use_request_body_schema_mode": true, + "validate_request_body_schema": true, + "use_flatten_mode": false + }, + { + "name": "UploadAccountFile", + "selected_for_wrapping": false, + "spec_built": true, + "wrap_finished": false, + "should_skip": true, + "skip_reason": "Only file-related content types available: multipart/form-data", + "wrapper_tool": null, + "method": "POST", + "path": "/accounts/{id}/files", + "tags": [ + "accounts" + ], + "summary": "", + "description": "Upload files to an account", + "requires_security": true, + "oauth_scopes": [], + "security_schemes": [ + "bearerAuth" + ], + "parameters": { + "query": [], + "path": [ + { + "name": "id", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The ID or external ID of the account to upload files to." + }, + "description": "The ID or external ID of the account to upload files to.", + "required": true, + "deprecated": false, + "default": null, + "location": "path", + "content_type": null, + "json_schema": { + "type": "string" + }, + "schema_required": false + } + ], + "header": [], + "cookie": [], + "body": [] + }, + "request_body_spec": null, + "use_request_body_schema_mode": false, + "validate_request_body_schema": false, + "use_flatten_mode": false + }, + { + "name": "GetActivityTypes", + "selected_for_wrapping": false, + "spec_built": true, + "wrap_finished": true, + "should_skip": false, + "skip_reason": null, + "wrapper_tool": { + "name": "get_custom_activity_types", + "description": { + "tagline": "Retrieve a list of custom activity types.", + "detailed": "Use this tool to get a list of custom activity types that are available. It should be called when there's a need to know what custom activity types exist." + }, + "return_annotation": "List of custom activity types available.", + "arguments": [] + }, + "method": "GET", + "path": "/activity-types", + "tags": [ + "activity-types" + ], + "summary": "", + "description": "Get custom activity types", + "requires_security": true, + "oauth_scopes": [], + "security_schemes": [ + "bearerAuth" + ], + "parameters": { + "query": [], + "path": [], + "header": [], + "cookie": [], + "body": [] + }, + "request_body_spec": null, + "use_request_body_schema_mode": false, + "validate_request_body_schema": false, + "use_flatten_mode": false + }, + { + "name": "CreateAttachment", + "selected_for_wrapping": false, + "spec_built": true, + "wrap_finished": false, + "should_skip": true, + "skip_reason": "Only file-related content types available: multipart/form-data", + "wrapper_tool": null, + "method": "POST", + "path": "/attachments", + "tags": [ + "attachments" + ], + "summary": "", + "description": "Create an attachment", + "requires_security": true, + "oauth_scopes": [], + "security_schemes": [ + "bearerAuth" + ], + "parameters": { + "query": [], + "path": [], + "header": [], + "cookie": [], + "body": [] + }, + "request_body_spec": null, + "use_request_body_schema_mode": false, + "validate_request_body_schema": false, + "use_flatten_mode": false + }, + { + "name": "GetContacts", + "selected_for_wrapping": false, + "spec_built": true, + "wrap_finished": true, + "should_skip": false, + "skip_reason": null, + "wrapper_tool": { + "name": "get_all_contacts", + "description": { + "tagline": "Retrieve all contacts from the service.", + "detailed": "This tool retrieves all contacts using the Pylon service. It should be called when there's a need to fetch a complete list of contacts from the service." + }, + "return_annotation": "List of all contacts from the service.", + "arguments": [] + }, + "method": "GET", + "path": "/contacts", + "tags": [ + "contacts" + ], + "summary": "", + "description": "Get all contacts", + "requires_security": true, + "oauth_scopes": [], + "security_schemes": [ + "bearerAuth" + ], + "parameters": { + "query": [], + "path": [], + "header": [], + "cookie": [], + "body": [] + }, + "request_body_spec": null, + "use_request_body_schema_mode": false, + "validate_request_body_schema": false, + "use_flatten_mode": false + }, + { + "name": "CreateContact", + "selected_for_wrapping": false, + "spec_built": true, + "wrap_finished": true, + "should_skip": false, + "skip_reason": null, + "wrapper_tool": { + "name": "create_new_contact", + "description": { + "tagline": "Create a new contact in the system.", + "detailed": "This tool creates a new contact by sending the necessary details to the endpoint. Use it when you need to add a new person's contact information to the database." + }, + "return_annotation": "Details of the newly created contact.", + "arguments": [ + { + "name": "contact_details", + "alternative_names": [ + "contact_info", + "new_contact_data" + ], + "description": "A JSON object containing the details of the contact to be created, such as name, email, account details, avatar URL, custom fields, and portal role.", + "endpoint_argument_name": "requestBody" + } + ] + }, + "method": "POST", + "path": "/contacts", + "tags": [ + "contacts" + ], + "summary": "", + "description": "Create a new contact", + "requires_security": true, + "oauth_scopes": [], + "security_schemes": [ + "bearerAuth" + ], + "parameters": { + "query": [], + "path": [], + "header": [], + "cookie": [], + "body": [ + { + "name": "requestBody", + "value_schema": { + "val_type": "json", + "inner_val_type": null, + "enum": null, + "properties": { + "account_external_id": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The external ID of the account that this contact belongs to. Cannot be used together with account_id." + }, + "account_id": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The account that this contact belongs to." + }, + "avatar_url": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The avatar URL of the contact. Must be a square .png, .jpg or .jpeg." + }, + "custom_fields": { + "val_type": "array", + "inner_val_type": "json", + "enum": null, + "properties": null, + "inner_properties": { + "slug": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The slug of the custom field." + }, + "value": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The value of the custom field. Only to be used for single-valued custom fields. If unset, the custom field will be unset. If the custom field is a select field, the value must be the select option slug, which you can find from the GET /custom-fields endpoint." + }, + "values": { + "val_type": "array", + "inner_val_type": "string", + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The values of the custom field. Only to be used for multi-valued custom fields (ex. multiselect). If unset, the custom field will be unset. If the custom field is a multiselect field, the values must be the select option slugs which you can find from the GET /custom-fields endpoint." + } + }, + "description": "An array of custom fields to be applied to this contact." + }, + "email": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The email of the contact." + }, + "name": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The name of the contact." + }, + "portal_role": { + "val_type": "string", + "inner_val_type": null, + "enum": [ + "no_access", + "member", + "admin" + ], + "properties": null, + "inner_properties": null, + "description": "The portal role to assign to the contact. If not provided uses the default portal role from the portal settings.\n\n* no_access PortalRoleNoAccess\n\n* member PortalRoleMember\n\n* admin PortalRoleAdmin" + } + }, + "inner_properties": null, + "description": "" + }, + "description": "", + "required": false, + "deprecated": false, + "default": null, + "location": "body", + "content_type": "application/json", + "json_schema": { + "type": "object", + "properties": { + "account_external_id": { + "type": "string", + "description": "The external ID of the account that this contact belongs to. Cannot be used together with account_id." + }, + "account_id": { + "type": "string", + "description": "The account that this contact belongs to." + }, + "avatar_url": { + "type": "string", + "description": "The avatar URL of the contact. Must be a square .png, .jpg or .jpeg." + }, + "custom_fields": { + "type": "array", + "description": "An array of custom fields to be applied to this contact.", + "items": { + "type": "object", + "properties": { + "slug": { + "type": "string", + "description": "The slug of the custom field." + }, + "value": { + "type": "string", + "description": "The value of the custom field. Only to be used for single-valued custom fields. If unset, the custom field will be unset. If the custom field is a select field, the value must be the select option slug, which you can find from the GET /custom-fields endpoint." + }, + "values": { + "type": "array", + "description": "The values of the custom field. Only to be used for multi-valued custom fields (ex. multiselect). If unset, the custom field will be unset. If the custom field is a multiselect field, the values must be the select option slugs which you can find from the GET /custom-fields endpoint.", + "items": { + "type": "string" + } + } + } + } + }, + "email": { + "type": "string", + "description": "The email of the contact." + }, + "name": { + "type": "string", + "description": "The name of the contact." + }, + "portal_role": { + "type": "string", + "description": "The portal role to assign to the contact. If not provided uses the default portal role from the portal settings.\n\n* no_access PortalRoleNoAccess\n\n* member PortalRoleMember\n\n* admin PortalRoleAdmin", + "enum": [ + "no_access", + "member", + "admin" + ] + } + }, + "required": [ + "name" + ] + }, + "schema_required": false + } + ] + }, + "request_body_spec": "{\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"properties\": {\n \"account_external_id\": {\n \"description\": \"The external ID of the account that this contact belongs to. Cannot be used together with account_id.\",\n \"type\": \"string\",\n \"x-go-name\": \"AccountExternalID\"\n },\n \"account_id\": {\n \"description\": \"The account that this contact belongs to.\",\n \"type\": \"string\",\n \"x-go-name\": \"AccountID\"\n },\n \"avatar_url\": {\n \"description\": \"The avatar URL of the contact. Must be a square .png, .jpg or .jpeg.\",\n \"type\": \"string\",\n \"x-go-name\": \"AvatarUrl\"\n },\n \"custom_fields\": {\n \"description\": \"An array of custom fields to be applied to this contact.\",\n \"items\": {\n \"properties\": {\n \"slug\": {\n \"description\": \"The slug of the custom field.\",\n \"type\": \"string\",\n \"x-go-name\": \"Slug\"\n },\n \"value\": {\n \"description\": \"The value of the custom field. Only to be used for single-valued custom fields. If unset, the custom field will be unset. If the custom field is a select field, the value must be the select option slug, which you can find from the GET /custom-fields endpoint.\",\n \"type\": \"string\",\n \"x-go-name\": \"Value\"\n },\n \"values\": {\n \"description\": \"The values of the custom field. Only to be used for multi-valued custom fields (ex. multiselect). If unset, the custom field will be unset. If the custom field is a multiselect field, the values must be the select option slugs which you can find from the GET /custom-fields endpoint.\",\n \"items\": {\n \"type\": \"string\"\n },\n \"type\": \"array\",\n \"x-go-name\": \"Values\"\n }\n },\n \"type\": \"object\",\n \"x-go-package\": \"pylon/api/apiserver/apitypes\"\n },\n \"type\": \"array\",\n \"x-go-name\": \"CustomFields\"\n },\n \"email\": {\n \"description\": \"The email of the contact.\",\n \"type\": \"string\",\n \"x-go-name\": \"Email\"\n },\n \"name\": {\n \"description\": \"The name of the contact.\",\n \"type\": \"string\",\n \"x-go-name\": \"Name\"\n },\n \"portal_role\": {\n \"description\": \"The portal role to assign to the contact. If not provided uses the default portal role from the portal settings.\\n\\n* no_access PortalRoleNoAccess\\n\\n* member PortalRoleMember\\n\\n* admin PortalRoleAdmin\",\n \"enum\": [\n \"no_access\",\n \"member\",\n \"admin\"\n ],\n \"type\": \"string\",\n \"x-go-enum-desc\": \"no_access PortalRoleNoAccess\\nmember PortalRoleMember\\nadmin PortalRoleAdmin\",\n \"x-go-name\": \"PortalRole\"\n }\n },\n \"required\": [\n \"name\"\n ],\n \"type\": \"object\",\n \"x-go-package\": \"pylon/api/apiserver/endpoints\"\n }\n }\n },\n \"required\": false\n}", + "use_request_body_schema_mode": true, + "validate_request_body_schema": true, + "use_flatten_mode": false + }, + { + "name": "SearchContacts", + "selected_for_wrapping": false, + "spec_built": true, + "wrap_finished": true, + "should_skip": false, + "skip_reason": null, + "wrapper_tool": { + "name": "search_contacts", + "description": { + "tagline": "Search for contacts using various filter criteria.", + "detailed": "This tool allows you to search for contacts by applying filters on fields such as id, email, custom fields, and account_id. Use it to find specific contacts based on these criteria." + }, + "return_annotation": "Filtered search results of contacts.", + "arguments": [ + { + "name": "contact_search_filters", + "alternative_names": [ + "contact_filters", + "search_criteria" + ], + "description": "A JSON object specifying the search filters for contacts, including pagination, filtering fields, operator types, and limits.", + "endpoint_argument_name": "requestBody" + } + ] + }, + "method": "POST", + "path": "/contacts/search", + "tags": [ + "contacts" + ], + "summary": "Search for contacts by a given filter", + "description": "Currently, the following fields are filterable for contacts:\n\n* id. Allowed operators: `equals`, `in`, `not_in`\n\n* email. Allowed operators: `equals`, `in`, `not_in`, `string_contains`\n\n* custom fields (pass in the slug of the custom field)\n\n* account_id. Allowed operators: `equals`, `in`, `not_in`", + "requires_security": true, + "oauth_scopes": [], + "security_schemes": [ + "bearerAuth" + ], + "parameters": { + "query": [], + "path": [], + "header": [], + "cookie": [], + "body": [ + { + "name": "requestBody", + "value_schema": { + "val_type": "json", + "inner_val_type": null, + "enum": null, + "properties": { + "cursor": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The cursor to use for pagination." + }, + "filter": { + "val_type": "json", + "inner_val_type": null, + "enum": null, + "properties": { + "field": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The field for this filter. For allowed fields, see the documentation for\n\nthe specific endpoint you are using.\n\nFor non-compound filters (any operators other than \"and\" or \"or\"),\n\nField must be set, along with either Value or Values, depending on the operator." + }, + "operator": { + "val_type": "string", + "inner_val_type": null, + "enum": [ + "equals", + "not_equals", + "contains", + "does_not_contain", + "in", + "not_in", + "and", + "or", + "time_is_after", + "time_is_before", + "time_range", + "string_contains", + "string_does_not_contain", + "is_set", + "is_unset" + ], + "properties": null, + "inner_properties": null, + "description": "The operator for this filter.\n\n* equals FilterOperatorEquals Matches objects that are exactly equal to the value in the field.\n\n* not_equals FilterOperatorNotEquals Matches objects that are not exactly equal to the value in the field.\n\n* contains FilterOperatorContains For a multi-valued field, such as tags, this operator will match objects that contain any of the values in the field.\n\n* does_not_contain FilterOperatorDoesNotContain For a multi-valued field, such as tags, this operator will match objects that do not contain any of the values in the field.\n\n* in FilterOperatorIn Matches objects if the field is one of several possible values, as specified in the values array.\n\n* not_in FilterOperatorNotIn Matches objects if the field is none of several possible values, as specified in the values array.\n\n* and FilterOperatorAnd Matches objects only if all subfilters match.\n\n* or FilterOperatorOr Matches objects if any subfilter matches.\n\n* time_is_after FilterOperatorTimeIsAfter Matches objects if the field is after the given time.\n\n* time_is_before FilterOperatorTimeIsBefore Matches objects if the field is before the given time.\n\n* time_range FilterOperatorTimeRange Matches objects if the field is between the given times.\n\n* string_contains FilterOperatorStringContains Matches objects if the field contains the given string.\n\n* string_does_not_contain FilterOperatorStringDoesNotContain Matches objects if the field does not contain the given string.\n\n* is_set FilterOperatorIsSet FilterOperatorIsSet matches objects if the field is set.\n\n* is_unset FilterOperatorIsUnset FilterOperatorIsUnset matches objects if the field is unset." + }, + "subfilters": { + "val_type": "array", + "inner_val_type": "json", + "enum": null, + "properties": null, + "inner_properties": {}, + "description": "Sub-filters for this filter. Valid only when operator is \"and\" or \"or\".\n\nThe maximum allowed depth for a tree of filters is 3." + }, + "value": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The value for this filter. Only used for single-valued operators\n\n(\"equals\", \"not_equals\", \"contains\", \"does_not_contain\")" + }, + "values": { + "val_type": "array", + "inner_val_type": "string", + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The values for this filter. Only used for multi-valued operators (\"in\", \"not_in\")." + } + }, + "inner_properties": null, + "description": null + }, + "limit": { + "val_type": "integer", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The number of contacts to fetch. Defaults to 100. Must be greater than 0 and less than 1000." + } + }, + "inner_properties": null, + "description": "" + }, + "description": "", + "required": false, + "deprecated": false, + "default": null, + "location": "body", + "content_type": "application/json", + "json_schema": { + "type": "object", + "properties": { + "cursor": { + "type": "string", + "description": "The cursor to use for pagination." + }, + "filter": { + "type": "object", + "properties": { + "field": { + "type": "string", + "description": "The field for this filter. For allowed fields, see the documentation for\n\nthe specific endpoint you are using.\n\nFor non-compound filters (any operators other than \"and\" or \"or\"),\n\nField must be set, along with either Value or Values, depending on the operator." + }, + "operator": { + "type": "string", + "description": "The operator for this filter.\n\n* equals FilterOperatorEquals Matches objects that are exactly equal to the value in the field.\n\n* not_equals FilterOperatorNotEquals Matches objects that are not exactly equal to the value in the field.\n\n* contains FilterOperatorContains For a multi-valued field, such as tags, this operator will match objects that contain any of the values in the field.\n\n* does_not_contain FilterOperatorDoesNotContain For a multi-valued field, such as tags, this operator will match objects that do not contain any of the values in the field.\n\n* in FilterOperatorIn Matches objects if the field is one of several possible values, as specified in the values array.\n\n* not_in FilterOperatorNotIn Matches objects if the field is none of several possible values, as specified in the values array.\n\n* and FilterOperatorAnd Matches objects only if all subfilters match.\n\n* or FilterOperatorOr Matches objects if any subfilter matches.\n\n* time_is_after FilterOperatorTimeIsAfter Matches objects if the field is after the given time.\n\n* time_is_before FilterOperatorTimeIsBefore Matches objects if the field is before the given time.\n\n* time_range FilterOperatorTimeRange Matches objects if the field is between the given times.\n\n* string_contains FilterOperatorStringContains Matches objects if the field contains the given string.\n\n* string_does_not_contain FilterOperatorStringDoesNotContain Matches objects if the field does not contain the given string.\n\n* is_set FilterOperatorIsSet FilterOperatorIsSet matches objects if the field is set.\n\n* is_unset FilterOperatorIsUnset FilterOperatorIsUnset matches objects if the field is unset.", + "enum": [ + "equals", + "not_equals", + "contains", + "does_not_contain", + "in", + "not_in", + "and", + "or", + "time_is_after", + "time_is_before", + "time_range", + "string_contains", + "string_does_not_contain", + "is_set", + "is_unset" + ] + }, + "subfilters": { + "type": "array", + "description": "Sub-filters for this filter. Valid only when operator is \"and\" or \"or\".\n\nThe maximum allowed depth for a tree of filters is 3.", + "items": { + "type": "object", + "properties": {} + } + }, + "value": { + "type": "string", + "description": "The value for this filter. Only used for single-valued operators\n\n(\"equals\", \"not_equals\", \"contains\", \"does_not_contain\")" + }, + "values": { + "type": "array", + "description": "The values for this filter. Only used for multi-valued operators (\"in\", \"not_in\").", + "items": { + "type": "string" + } + } + }, + "required": [ + "field", + "operator" + ] + }, + "limit": { + "type": "integer", + "description": "The number of contacts to fetch. Defaults to 100. Must be greater than 0 and less than 1000.", + "format": "int64" + } + }, + "required": [ + "filter" + ] + }, + "schema_required": false + } + ] + }, + "request_body_spec": "{\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"properties\": {\n \"cursor\": {\n \"description\": \"The cursor to use for pagination.\",\n \"type\": \"string\",\n \"x-go-name\": \"Cursor\"\n },\n \"filter\": {\n \"properties\": {\n \"field\": {\n \"description\": \"The field for this filter. For allowed fields, see the documentation for\\n\\nthe specific endpoint you are using.\\n\\nFor non-compound filters (any operators other than \\\"and\\\" or \\\"or\\\"),\\n\\nField must be set, along with either Value or Values, depending on the operator.\",\n \"type\": \"string\",\n \"x-go-name\": \"Field\"\n },\n \"operator\": {\n \"description\": \"The operator for this filter.\\n\\n* equals FilterOperatorEquals Matches objects that are exactly equal to the value in the field.\\n\\n* not_equals FilterOperatorNotEquals Matches objects that are not exactly equal to the value in the field.\\n\\n* contains FilterOperatorContains For a multi-valued field, such as tags, this operator will match objects that contain any of the values in the field.\\n\\n* does_not_contain FilterOperatorDoesNotContain For a multi-valued field, such as tags, this operator will match objects that do not contain any of the values in the field.\\n\\n* in FilterOperatorIn Matches objects if the field is one of several possible values, as specified in the values array.\\n\\n* not_in FilterOperatorNotIn Matches objects if the field is none of several possible values, as specified in the values array.\\n\\n* and FilterOperatorAnd Matches objects only if all subfilters match.\\n\\n* or FilterOperatorOr Matches objects if any subfilter matches.\\n\\n* time_is_after FilterOperatorTimeIsAfter Matches objects if the field is after the given time.\\n\\n* time_is_before FilterOperatorTimeIsBefore Matches objects if the field is before the given time.\\n\\n* time_range FilterOperatorTimeRange Matches objects if the field is between the given times.\\n\\n* string_contains FilterOperatorStringContains Matches objects if the field contains the given string.\\n\\n* string_does_not_contain FilterOperatorStringDoesNotContain Matches objects if the field does not contain the given string.\\n\\n* is_set FilterOperatorIsSet FilterOperatorIsSet matches objects if the field is set.\\n\\n* is_unset FilterOperatorIsUnset FilterOperatorIsUnset matches objects if the field is unset.\",\n \"enum\": [\n \"equals\",\n \"not_equals\",\n \"contains\",\n \"does_not_contain\",\n \"in\",\n \"not_in\",\n \"and\",\n \"or\",\n \"time_is_after\",\n \"time_is_before\",\n \"time_range\",\n \"string_contains\",\n \"string_does_not_contain\",\n \"is_set\",\n \"is_unset\"\n ],\n \"type\": \"string\",\n \"x-go-enum-desc\": \"equals FilterOperatorEquals Matches objects that are exactly equal to the value in the field.\\nnot_equals FilterOperatorNotEquals Matches objects that are not exactly equal to the value in the field.\\ncontains FilterOperatorContains For a multi-valued field, such as tags, this operator will match objects that contain any of the values in the field.\\ndoes_not_contain FilterOperatorDoesNotContain For a multi-valued field, such as tags, this operator will match objects that do not contain any of the values in the field.\\nin FilterOperatorIn Matches objects if the field is one of several possible values, as specified in the values array.\\nnot_in FilterOperatorNotIn Matches objects if the field is none of several possible values, as specified in the values array.\\nand FilterOperatorAnd Matches objects only if all subfilters match.\\nor FilterOperatorOr Matches objects if any subfilter matches.\\ntime_is_after FilterOperatorTimeIsAfter Matches objects if the field is after the given time.\\ntime_is_before FilterOperatorTimeIsBefore Matches objects if the field is before the given time.\\ntime_range FilterOperatorTimeRange Matches objects if the field is between the given times.\\nstring_contains FilterOperatorStringContains Matches objects if the field contains the given string.\\nstring_does_not_contain FilterOperatorStringDoesNotContain Matches objects if the field does not contain the given string.\\nis_set FilterOperatorIsSet FilterOperatorIsSet matches objects if the field is set.\\nis_unset FilterOperatorIsUnset FilterOperatorIsUnset matches objects if the field is unset.\",\n \"x-go-name\": \"Operator\"\n },\n \"subfilters\": {\n \"description\": \"Sub-filters for this filter. Valid only when operator is \\\"and\\\" or \\\"or\\\".\\n\\nThe maximum allowed depth for a tree of filters is 3.\",\n \"items\": {\n \"$ref\": \"#/components/schemas/Filter\",\n \"has_circular_reference\": true\n },\n \"type\": \"array\",\n \"x-go-name\": \"Subfilters\"\n },\n \"value\": {\n \"description\": \"The value for this filter. Only used for single-valued operators\\n\\n(\\\"equals\\\", \\\"not_equals\\\", \\\"contains\\\", \\\"does_not_contain\\\")\",\n \"type\": \"string\",\n \"x-go-name\": \"Value\"\n },\n \"values\": {\n \"description\": \"The values for this filter. Only used for multi-valued operators (\\\"in\\\", \\\"not_in\\\").\",\n \"items\": {\n \"type\": \"string\"\n },\n \"type\": \"array\",\n \"x-go-name\": \"Values\"\n }\n },\n \"required\": [\n \"field\",\n \"operator\"\n ],\n \"type\": \"object\",\n \"x-go-package\": \"pylon/api/apiserver/apitypes\"\n },\n \"limit\": {\n \"description\": \"The number of contacts to fetch. Defaults to 100. Must be greater than 0 and less than 1000.\",\n \"format\": \"int64\",\n \"type\": \"integer\",\n \"x-go-name\": \"Limit\"\n }\n },\n \"required\": [\n \"filter\"\n ],\n \"type\": \"object\",\n \"x-go-package\": \"pylon/api/apiserver/endpoints\"\n }\n }\n },\n \"required\": false\n}", + "use_request_body_schema_mode": true, + "validate_request_body_schema": false, + "use_flatten_mode": false + }, + { + "name": "DeleteContact", + "selected_for_wrapping": false, + "spec_built": true, + "wrap_finished": true, + "should_skip": false, + "skip_reason": null, + "wrapper_tool": { + "name": "delete_contact", + "description": { + "tagline": "Delete an existing contact by ID.", + "detailed": "This tool deletes a contact by its ID. It should be called when a user needs to remove a contact from the system." + }, + "return_annotation": "Confirmation of contact deletion.", + "arguments": [ + { + "name": "contact_id", + "alternative_names": [ + "contact_identifier", + "id_of_contact" + ], + "description": "The ID of the contact to be deleted.", + "endpoint_argument_name": "id" + } + ] + }, + "method": "DELETE", + "path": "/contacts/{id}", + "tags": [ + "contacts" + ], + "summary": "", + "description": "Delete an existing contact", + "requires_security": true, + "oauth_scopes": [], + "security_schemes": [ + "bearerAuth" + ], + "parameters": { + "query": [], + "path": [ + { + "name": "id", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The ID of the contact to delete." + }, + "description": "The ID of the contact to delete.", + "required": true, + "deprecated": false, + "default": null, + "location": "path", + "content_type": null, + "json_schema": { + "type": "string" + }, + "schema_required": false + } + ], + "header": [], + "cookie": [], + "body": [] + }, + "request_body_spec": null, + "use_request_body_schema_mode": false, + "validate_request_body_schema": false, + "use_flatten_mode": false + }, + { + "name": "GetContact", + "selected_for_wrapping": false, + "spec_built": true, + "wrap_finished": true, + "should_skip": false, + "skip_reason": null, + "wrapper_tool": { + "name": "get_contact_by_id", + "description": { + "tagline": "Retrieve contact details using the contact ID.", + "detailed": "This tool fetches and returns contact details by querying with a specified contact ID. Use it when you need to obtain specific contact information." + }, + "return_annotation": "Returns contact details based on the provided ID.", + "arguments": [ + { + "name": "number_of_accounts_to_fetch", + "alternative_names": [ + "fetch_limit", + "accounts_fetch_limit" + ], + "description": "Specifies the number of accounts to fetch. Must be between 1 and 999. Defaults to 100 if not provided.", + "endpoint_argument_name": "limit" + }, + { + "name": "contact_id", + "alternative_names": [ + "id_of_contact", + "contact_identifier" + ], + "description": "The unique identifier for the contact to fetch details.", + "endpoint_argument_name": "id" + }, + { + "name": "pagination_cursor", + "alternative_names": [ + "page_cursor", + "navigation_cursor" + ], + "description": "A string representing the cursor for pagination purposes, used to fetch the next set of results in a paginated response.", + "endpoint_argument_name": "cursor" + } + ] + }, + "method": "GET", + "path": "/contacts/{id}", + "tags": [ + "contacts" + ], + "summary": "", + "description": "Get a contact by its ID", + "requires_security": true, + "oauth_scopes": [], + "security_schemes": [ + "bearerAuth" + ], + "parameters": { + "query": [ + { + "name": "cursor", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The cursor to use for pagination." + }, + "description": "The cursor to use for pagination.", + "required": false, + "deprecated": false, + "default": null, + "location": "query", + "content_type": null, + "json_schema": { + "type": "string" + }, + "schema_required": false + }, + { + "name": "limit", + "value_schema": { + "val_type": "integer", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The number of accounts to fetch. Defaults to 100. Must be greater than 0 and less than 1000." + }, + "description": "The number of accounts to fetch. Defaults to 100. Must be greater than 0 and less than 1000.", + "required": true, + "deprecated": false, + "default": null, + "location": "query", + "content_type": null, + "json_schema": { + "type": "integer", + "format": "int64" + }, + "schema_required": false + } + ], + "path": [ + { + "name": "id", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The ID of the contact." + }, + "description": "The ID of the contact.", + "required": true, + "deprecated": false, + "default": null, + "location": "path", + "content_type": null, + "json_schema": { + "type": "string" + }, + "schema_required": false + } + ], + "header": [], + "cookie": [], + "body": [] + }, + "request_body_spec": null, + "use_request_body_schema_mode": false, + "validate_request_body_schema": false, + "use_flatten_mode": false + }, + { + "name": "UpdateContact", + "selected_for_wrapping": false, + "spec_built": true, + "wrap_finished": true, + "should_skip": false, + "skip_reason": null, + "wrapper_tool": { + "name": "update_contact_info", + "description": { + "tagline": "Updates an existing contact's information.", + "detailed": "Use this tool to update the details of an existing contact when modifications are needed." + }, + "return_annotation": "Confirmation of contact update.", + "arguments": [ + { + "name": "contact_id", + "alternative_names": [ + "contact_identifier", + "contact_number" + ], + "description": "The unique identifier of the contact to be updated. This should match the existing contact's ID in the system.", + "endpoint_argument_name": "id" + }, + { + "name": "contact_update_details", + "alternative_names": [ + "contact_modification_payload", + "updated_contact_data" + ], + "description": "JSON object with updated contact details, including account ID, avatar URL, custom fields, email, name, and portal role. Use either 'account_id' or 'account_external_id', not both.", + "endpoint_argument_name": "requestBody" + } + ] + }, + "method": "PATCH", + "path": "/contacts/{id}", + "tags": [ + "contacts" + ], + "summary": "", + "description": "Update an existing contact", + "requires_security": true, + "oauth_scopes": [], + "security_schemes": [ + "bearerAuth" + ], + "parameters": { + "query": [], + "path": [ + { + "name": "id", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The ID of the contact to update." + }, + "description": "The ID of the contact to update.", + "required": true, + "deprecated": false, + "default": null, + "location": "path", + "content_type": null, + "json_schema": { + "type": "string" + }, + "schema_required": false + } + ], + "header": [], + "cookie": [], + "body": [ + { + "name": "requestBody", + "value_schema": { + "val_type": "json", + "inner_val_type": null, + "enum": null, + "properties": { + "account_external_id": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The external ID of the account to move the contact to. Cannot be used together with account_id." + }, + "account_id": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The account to move the contact to." + }, + "avatar_url": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The avatar URL of the contact. Must be a square .png, .jpg or .jpeg." + }, + "custom_fields": { + "val_type": "array", + "inner_val_type": "json", + "enum": null, + "properties": null, + "inner_properties": { + "slug": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The slug of the custom field." + }, + "value": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The value of the custom field. Only to be used for single-valued custom fields. If unset, the custom field will be unset. If the custom field is a select field, the value must be the select option slug, which you can find from the GET /custom-fields endpoint." + }, + "values": { + "val_type": "array", + "inner_val_type": "string", + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The values of the custom field. Only to be used for multi-valued custom fields (ex. multiselect). If unset, the custom field will be unset. If the custom field is a multiselect field, the values must be the select option slugs which you can find from the GET /custom-fields endpoint." + } + }, + "description": "An array of custom fields to be applied to this contact." + }, + "email": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The email of the contact." + }, + "name": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "in: body\n\nThe name of the contact." + }, + "portal_role": { + "val_type": "string", + "inner_val_type": null, + "enum": [ + "no_access", + "member", + "admin" + ], + "properties": null, + "inner_properties": null, + "description": "The portal role to assign to the contact. Can be one of `no_access`, `member`, or `admin`.\n\n* no_access PortalRoleNoAccess\n\n* member PortalRoleMember\n\n* admin PortalRoleAdmin" + } + }, + "inner_properties": null, + "description": "" + }, + "description": "", + "required": false, + "deprecated": false, + "default": null, + "location": "body", + "content_type": "application/json", + "json_schema": { + "type": "object", + "properties": { + "account_external_id": { + "type": "string", + "description": "The external ID of the account to move the contact to. Cannot be used together with account_id." + }, + "account_id": { + "type": "string", + "description": "The account to move the contact to." + }, + "avatar_url": { + "type": "string", + "description": "The avatar URL of the contact. Must be a square .png, .jpg or .jpeg." + }, + "custom_fields": { + "type": "array", + "description": "An array of custom fields to be applied to this contact.", + "items": { + "type": "object", + "properties": { + "slug": { + "type": "string", + "description": "The slug of the custom field." + }, + "value": { + "type": "string", + "description": "The value of the custom field. Only to be used for single-valued custom fields. If unset, the custom field will be unset. If the custom field is a select field, the value must be the select option slug, which you can find from the GET /custom-fields endpoint." + }, + "values": { + "type": "array", + "description": "The values of the custom field. Only to be used for multi-valued custom fields (ex. multiselect). If unset, the custom field will be unset. If the custom field is a multiselect field, the values must be the select option slugs which you can find from the GET /custom-fields endpoint.", + "items": { + "type": "string" + } + } + } + } + }, + "email": { + "type": "string", + "description": "The email of the contact." + }, + "name": { + "type": "string", + "description": "in: body\n\nThe name of the contact." + }, + "portal_role": { + "type": "string", + "description": "The portal role to assign to the contact. Can be one of `no_access`, `member`, or `admin`.\n\n* no_access PortalRoleNoAccess\n\n* member PortalRoleMember\n\n* admin PortalRoleAdmin", + "enum": [ + "no_access", + "member", + "admin" + ] + } + } + }, + "schema_required": false + } + ] + }, + "request_body_spec": "{\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"properties\": {\n \"account_external_id\": {\n \"description\": \"The external ID of the account to move the contact to. Cannot be used together with account_id.\",\n \"type\": \"string\",\n \"x-go-name\": \"AccountExternalID\"\n },\n \"account_id\": {\n \"description\": \"The account to move the contact to.\",\n \"type\": \"string\",\n \"x-go-name\": \"AccountID\"\n },\n \"avatar_url\": {\n \"description\": \"The avatar URL of the contact. Must be a square .png, .jpg or .jpeg.\",\n \"type\": \"string\",\n \"x-go-name\": \"AvatarUrl\"\n },\n \"custom_fields\": {\n \"description\": \"An array of custom fields to be applied to this contact.\",\n \"items\": {\n \"properties\": {\n \"slug\": {\n \"description\": \"The slug of the custom field.\",\n \"type\": \"string\",\n \"x-go-name\": \"Slug\"\n },\n \"value\": {\n \"description\": \"The value of the custom field. Only to be used for single-valued custom fields. If unset, the custom field will be unset. If the custom field is a select field, the value must be the select option slug, which you can find from the GET /custom-fields endpoint.\",\n \"type\": \"string\",\n \"x-go-name\": \"Value\"\n },\n \"values\": {\n \"description\": \"The values of the custom field. Only to be used for multi-valued custom fields (ex. multiselect). If unset, the custom field will be unset. If the custom field is a multiselect field, the values must be the select option slugs which you can find from the GET /custom-fields endpoint.\",\n \"items\": {\n \"type\": \"string\"\n },\n \"type\": \"array\",\n \"x-go-name\": \"Values\"\n }\n },\n \"type\": \"object\",\n \"x-go-package\": \"pylon/api/apiserver/apitypes\"\n },\n \"type\": \"array\",\n \"x-go-name\": \"CustomFields\"\n },\n \"email\": {\n \"description\": \"The email of the contact.\",\n \"type\": \"string\",\n \"x-go-name\": \"Email\"\n },\n \"name\": {\n \"description\": \"in: body\\n\\nThe name of the contact.\",\n \"type\": \"string\",\n \"x-go-name\": \"Name\"\n },\n \"portal_role\": {\n \"description\": \"The portal role to assign to the contact. Can be one of `no_access`, `member`, or `admin`.\\n\\n* no_access PortalRoleNoAccess\\n\\n* member PortalRoleMember\\n\\n* admin PortalRoleAdmin\",\n \"enum\": [\n \"no_access\",\n \"member\",\n \"admin\"\n ],\n \"type\": \"string\",\n \"x-go-enum-desc\": \"no_access PortalRoleNoAccess\\nmember PortalRoleMember\\nadmin PortalRoleAdmin\",\n \"x-go-name\": \"PortalRole\"\n }\n },\n \"type\": \"object\",\n \"x-go-package\": \"pylon/api/apiserver/endpoints\"\n }\n }\n },\n \"required\": false\n}", + "use_request_body_schema_mode": true, + "validate_request_body_schema": true, + "use_flatten_mode": false + }, + { + "name": "GetCustomFields", + "selected_for_wrapping": false, + "spec_built": true, + "wrap_finished": true, + "should_skip": false, + "skip_reason": null, + "wrapper_tool": { + "name": "get_all_custom_fields", + "description": { + "tagline": "Retrieve all custom fields from the system.", + "detailed": "This tool is used to get a complete list of custom fields. It should be called when you need information about available custom fields." + }, + "return_annotation": "List of all custom fields available.", + "arguments": [ + { + "name": "custom_field_object_type", + "alternative_names": [ + "field_object_type", + "custom_field_category" + ], + "description": "Specify the object type for custom fields. Options: \"account\", \"issue\", or \"contact\".", + "endpoint_argument_name": "object_type" + } + ] + }, + "method": "GET", + "path": "/custom-fields", + "tags": [ + "custom-fields" + ], + "summary": "", + "description": "Get all custom fields", + "requires_security": true, + "oauth_scopes": [], + "security_schemes": [ + "bearerAuth" + ], + "parameters": { + "query": [ + { + "name": "object_type", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The object type of the custom fields. Can be \"account\", \"issue\", or \"contact\"." + }, + "description": "The object type of the custom fields. Can be \"account\", \"issue\", or \"contact\".", + "required": true, + "deprecated": false, + "default": null, + "location": "query", + "content_type": null, + "json_schema": { + "type": "string" + }, + "schema_required": false + } + ], + "path": [], + "header": [], + "cookie": [], + "body": [] + }, + "request_body_spec": null, + "use_request_body_schema_mode": false, + "validate_request_body_schema": false, + "use_flatten_mode": false + }, + { + "name": "CreateCustomField", + "selected_for_wrapping": false, + "spec_built": true, + "wrap_finished": true, + "should_skip": false, + "skip_reason": null, + "wrapper_tool": { + "name": "create_custom_field", + "description": { + "tagline": "Create a new custom field in the system.", + "detailed": "Use this tool to add a custom field to your database or application configuration. It allows for extending the available data fields to include additional, personalized information." + }, + "return_annotation": "Information about the newly created custom field.", + "arguments": [ + { + "name": "custom_field_details", + "alternative_names": [ + "field_specifications", + "field_attributes" + ], + "description": "JSON object containing details such as label, type, object type, default values, and selection options for the custom field.", + "endpoint_argument_name": "requestBody" + } + ] + }, + "method": "POST", + "path": "/custom-fields", + "tags": [ + "custom-fields" + ], + "summary": "", + "description": "Create a custom field", + "requires_security": true, + "oauth_scopes": [], + "security_schemes": [ + "bearerAuth" + ], + "parameters": { + "query": [], + "path": [], + "header": [], + "cookie": [], + "body": [ + { + "name": "requestBody", + "value_schema": { + "val_type": "json", + "inner_val_type": null, + "enum": null, + "properties": { + "default_value": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The default value for single-valued custom fields." + }, + "default_values": { + "val_type": "array", + "inner_val_type": "string", + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The default values for multi-valued custom fields." + }, + "description": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The description of the custom field." + }, + "label": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The label of the custom field." + }, + "object_type": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The object type of the custom field. Can be \"account\", \"issue\", or \"contact\"" + }, + "select_options": { + "val_type": "array", + "inner_val_type": "json", + "enum": null, + "properties": null, + "inner_properties": { + "label": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The label of the option." + }, + "slug": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The slug of the option." + } + }, + "description": "The list options of the select custom field. This is only present for select and multiselect custom fields." + }, + "slug": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The slug of the custom field." + }, + "type": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The type of the custom field. Can be one of `text`, `number`, `decimal`, `boolean`, `date`, `datetime`, `user`, `url`, `select`, or `multiselect`." + } + }, + "inner_properties": null, + "description": "" + }, + "description": "", + "required": false, + "deprecated": false, + "default": null, + "location": "body", + "content_type": "application/json", + "json_schema": { + "type": "object", + "properties": { + "default_value": { + "type": "string", + "description": "The default value for single-valued custom fields." + }, + "default_values": { + "type": "array", + "description": "The default values for multi-valued custom fields.", + "items": { + "type": "string" + } + }, + "description": { + "type": "string", + "description": "The description of the custom field." + }, + "label": { + "type": "string", + "description": "The label of the custom field." + }, + "object_type": { + "type": "string", + "description": "The object type of the custom field. Can be \"account\", \"issue\", or \"contact\"" + }, + "select_options": { + "type": "array", + "description": "The list options of the select custom field. This is only present for select and multiselect custom fields.", + "items": { + "type": "object", + "properties": { + "label": { + "type": "string", + "description": "The label of the option." + }, + "slug": { + "type": "string", + "description": "The slug of the option." + } + } + } + }, + "slug": { + "type": "string", + "description": "The slug of the custom field." + }, + "type": { + "type": "string", + "description": "The type of the custom field. Can be one of `text`, `number`, `decimal`, `boolean`, `date`, `datetime`, `user`, `url`, `select`, or `multiselect`." + } + }, + "required": [ + "label", + "object_type", + "type" + ] + }, + "schema_required": false + } + ] + }, + "request_body_spec": "{\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"properties\": {\n \"default_value\": {\n \"description\": \"The default value for single-valued custom fields.\",\n \"type\": \"string\",\n \"x-go-name\": \"DefaultValue\"\n },\n \"default_values\": {\n \"description\": \"The default values for multi-valued custom fields.\",\n \"items\": {\n \"type\": \"string\"\n },\n \"type\": \"array\",\n \"x-go-name\": \"DefaultValues\"\n },\n \"description\": {\n \"description\": \"The description of the custom field.\",\n \"type\": \"string\",\n \"x-go-name\": \"Description\"\n },\n \"label\": {\n \"description\": \"The label of the custom field.\",\n \"type\": \"string\",\n \"x-go-name\": \"Label\"\n },\n \"object_type\": {\n \"description\": \"The object type of the custom field. Can be \\\"account\\\", \\\"issue\\\", or \\\"contact\\\"\",\n \"type\": \"string\",\n \"x-go-name\": \"ObjectType\"\n },\n \"select_options\": {\n \"description\": \"The list options of the select custom field. This is only present for select and multiselect custom fields.\",\n \"items\": {\n \"properties\": {\n \"label\": {\n \"description\": \"The label of the option.\",\n \"type\": \"string\",\n \"x-go-name\": \"Label\"\n },\n \"slug\": {\n \"description\": \"The slug of the option.\",\n \"type\": \"string\",\n \"x-go-name\": \"Slug\"\n }\n },\n \"type\": \"object\",\n \"x-go-package\": \"pylon/api/apiserver/apitypes\"\n },\n \"type\": \"array\",\n \"x-go-name\": \"SelectOptions\"\n },\n \"slug\": {\n \"description\": \"The slug of the custom field.\",\n \"type\": \"string\",\n \"x-go-name\": \"Slug\"\n },\n \"type\": {\n \"description\": \"The type of the custom field. Can be one of `text`, `number`, `decimal`, `boolean`, `date`, `datetime`, `user`, `url`, `select`, or `multiselect`.\",\n \"type\": \"string\",\n \"x-go-name\": \"Type\"\n }\n },\n \"required\": [\n \"label\",\n \"object_type\",\n \"type\"\n ],\n \"type\": \"object\",\n \"x-go-package\": \"pylon/api/apiserver/endpoints\"\n }\n }\n },\n \"required\": false\n}", + "use_request_body_schema_mode": true, + "validate_request_body_schema": true, + "use_flatten_mode": false + }, + { + "name": "GetCustomField", + "selected_for_wrapping": false, + "spec_built": true, + "wrap_finished": true, + "should_skip": false, + "skip_reason": null, + "wrapper_tool": { + "name": "get_custom_field", + "description": { + "tagline": "Retrieve a custom field by its ID.", + "detailed": "Use this tool to obtain details of a specific custom field using its unique identifier." + }, + "return_annotation": "Custom field details by its ID.", + "arguments": [ + { + "name": "custom_field_id", + "alternative_names": [ + "field_id", + "custom_id" + ], + "description": "The unique identifier of the custom field to retrieve.", + "endpoint_argument_name": "id" + } + ] + }, + "method": "GET", + "path": "/custom-fields/{id}", + "tags": [ + "custom-fields" + ], + "summary": "", + "description": "Get a custom field by its ID", + "requires_security": true, + "oauth_scopes": [], + "security_schemes": [ + "bearerAuth" + ], + "parameters": { + "query": [], + "path": [ + { + "name": "id", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The ID of the custom field." + }, + "description": "The ID of the custom field.", + "required": true, + "deprecated": false, + "default": null, + "location": "path", + "content_type": null, + "json_schema": { + "type": "string" + }, + "schema_required": false + } + ], + "header": [], + "cookie": [], + "body": [] + }, + "request_body_spec": null, + "use_request_body_schema_mode": false, + "validate_request_body_schema": false, + "use_flatten_mode": false + }, + { + "name": "UpdateCustomField", + "selected_for_wrapping": false, + "spec_built": true, + "wrap_finished": true, + "should_skip": false, + "skip_reason": null, + "wrapper_tool": { + "name": "update_custom_field", + "description": { + "tagline": "Update a custom field in a record.", + "detailed": "" + }, + "return_annotation": "Confirmation of custom field update.", + "arguments": [ + { + "name": "custom_field_id", + "alternative_names": [ + "field_id", + "identifier" + ], + "description": "The unique identifier for the custom field to be updated.", + "endpoint_argument_name": "id" + }, + { + "name": "custom_field_update_data", + "alternative_names": [ + "custom_field_data", + "field_update_data" + ], + "description": "JSON object containing details for updating the custom field, including 'default_value', 'default_values', 'description', 'label', 'select_options', and 'slug'.", + "endpoint_argument_name": "requestBody" + } + ] + }, + "method": "PATCH", + "path": "/custom-fields/{id}", + "tags": [ + "custom-fields" + ], + "summary": "", + "description": "Update a custom field", + "requires_security": true, + "oauth_scopes": [], + "security_schemes": [ + "bearerAuth" + ], + "parameters": { + "query": [], + "path": [ + { + "name": "id", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The ID of the custom field." + }, + "description": "The ID of the custom field.", + "required": true, + "deprecated": false, + "default": null, + "location": "path", + "content_type": null, + "json_schema": { + "type": "string" + }, + "schema_required": false + } + ], + "header": [], + "cookie": [], + "body": [ + { + "name": "requestBody", + "value_schema": { + "val_type": "json", + "inner_val_type": null, + "enum": null, + "properties": { + "default_value": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The default value for single-valued custom fields." + }, + "default_values": { + "val_type": "array", + "inner_val_type": "string", + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The default values for multi-valued custom fields." + }, + "description": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The description of the custom field." + }, + "label": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The label of the custom field." + }, + "select_options": { + "val_type": "array", + "inner_val_type": "json", + "enum": null, + "properties": null, + "inner_properties": { + "label": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The label of the option." + }, + "slug": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The slug of the option." + } + }, + "description": "The list options of the select custom field. This is only present for select and multiselect custom fields." + }, + "slug": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The slug of the custom field." + } + }, + "inner_properties": null, + "description": "" + }, + "description": "", + "required": false, + "deprecated": false, + "default": null, + "location": "body", + "content_type": "application/json", + "json_schema": { + "type": "object", + "properties": { + "default_value": { + "type": "string", + "description": "The default value for single-valued custom fields." + }, + "default_values": { + "type": "array", + "description": "The default values for multi-valued custom fields.", + "items": { + "type": "string" + } + }, + "description": { + "type": "string", + "description": "The description of the custom field." + }, + "label": { + "type": "string", + "description": "The label of the custom field." + }, + "select_options": { + "type": "array", + "description": "The list options of the select custom field. This is only present for select and multiselect custom fields.", + "items": { + "type": "object", + "properties": { + "label": { + "type": "string", + "description": "The label of the option." + }, + "slug": { + "type": "string", + "description": "The slug of the option." + } + } + } + }, + "slug": { + "type": "string", + "description": "The slug of the custom field." + } + } + }, + "schema_required": false + } + ] + }, + "request_body_spec": "{\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"properties\": {\n \"default_value\": {\n \"description\": \"The default value for single-valued custom fields.\",\n \"type\": \"string\",\n \"x-go-name\": \"DefaultValue\"\n },\n \"default_values\": {\n \"description\": \"The default values for multi-valued custom fields.\",\n \"items\": {\n \"type\": \"string\"\n },\n \"type\": \"array\",\n \"x-go-name\": \"DefaultValues\"\n },\n \"description\": {\n \"description\": \"The description of the custom field.\",\n \"type\": \"string\",\n \"x-go-name\": \"Description\"\n },\n \"label\": {\n \"description\": \"The label of the custom field.\",\n \"type\": \"string\",\n \"x-go-name\": \"Label\"\n },\n \"select_options\": {\n \"description\": \"The list options of the select custom field. This is only present for select and multiselect custom fields.\",\n \"items\": {\n \"properties\": {\n \"label\": {\n \"description\": \"The label of the option.\",\n \"type\": \"string\",\n \"x-go-name\": \"Label\"\n },\n \"slug\": {\n \"description\": \"The slug of the option.\",\n \"type\": \"string\",\n \"x-go-name\": \"Slug\"\n }\n },\n \"type\": \"object\",\n \"x-go-package\": \"pylon/api/apiserver/apitypes\"\n },\n \"type\": \"array\",\n \"x-go-name\": \"SelectOptions\"\n },\n \"slug\": {\n \"description\": \"The slug of the custom field.\",\n \"type\": \"string\",\n \"x-go-name\": \"Slug\"\n }\n },\n \"type\": \"object\",\n \"x-go-package\": \"pylon/api/apiserver/endpoints\"\n }\n }\n },\n \"required\": false\n}", + "use_request_body_schema_mode": true, + "validate_request_body_schema": true, + "use_flatten_mode": false + }, + { + "name": "ImportContact", + "selected_for_wrapping": false, + "spec_built": true, + "wrap_finished": true, + "should_skip": false, + "skip_reason": null, + "wrapper_tool": { + "name": "import_new_contact", + "description": { + "tagline": "Import a new contact into the system.", + "detailed": "Use this tool to import a new contact into the system whenever you need to add contact information." + }, + "return_annotation": "Confirmation of contact import status.", + "arguments": [ + { + "name": "contact_details", + "alternative_names": [ + "contact_information", + "contact_data" + ], + "description": "A JSON object containing the contact's details, such as account ID, avatar URL, custom fields, email, name, and portal role.", + "endpoint_argument_name": "requestBody" + } + ] + }, + "method": "POST", + "path": "/import/contacts", + "tags": [ + "import" + ], + "summary": "", + "description": "Import a new contact", + "requires_security": true, + "oauth_scopes": [], + "security_schemes": [ + "bearerAuth" + ], + "parameters": { + "query": [], + "path": [], + "header": [], + "cookie": [], + "body": [ + { + "name": "requestBody", + "value_schema": { + "val_type": "json", + "inner_val_type": null, + "enum": null, + "properties": { + "account_id": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The account that this contact belongs to." + }, + "avatar_url": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The avatar URL of the contact. Must be a square .png, .jpg or .jpeg." + }, + "custom_fields": { + "val_type": "array", + "inner_val_type": "json", + "enum": null, + "properties": null, + "inner_properties": { + "slug": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The slug of the custom field." + }, + "value": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The value of the custom field. Only to be used for single-valued custom fields. If unset, the custom field will be unset. If the custom field is a select field, the value must be the select option slug, which you can find from the GET /custom-fields endpoint." + }, + "values": { + "val_type": "array", + "inner_val_type": "string", + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The values of the custom field. Only to be used for multi-valued custom fields (ex. multiselect). If unset, the custom field will be unset. If the custom field is a multiselect field, the values must be the select option slugs which you can find from the GET /custom-fields endpoint." + } + }, + "description": "An array of custom fields to be applied to this contact." + }, + "email": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The email of the contact." + }, + "name": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The name of the contact." + }, + "portal_role": { + "val_type": "string", + "inner_val_type": null, + "enum": [ + "no_access", + "member", + "admin" + ], + "properties": null, + "inner_properties": null, + "description": "The portal role to assign to the contact. If not provided uses the default portal role from the portal settings.\n\n* no_access PortalRoleNoAccess\n\n* member PortalRoleMember\n\n* admin PortalRoleAdmin" + } + }, + "inner_properties": null, + "description": "" + }, + "description": "", + "required": false, + "deprecated": false, + "default": null, + "location": "body", + "content_type": "application/json", + "json_schema": { + "type": "object", + "properties": { + "account_id": { + "type": "string", + "description": "The account that this contact belongs to." + }, + "avatar_url": { + "type": "string", + "description": "The avatar URL of the contact. Must be a square .png, .jpg or .jpeg." + }, + "custom_fields": { + "type": "array", + "description": "An array of custom fields to be applied to this contact.", + "items": { + "type": "object", + "properties": { + "slug": { + "type": "string", + "description": "The slug of the custom field." + }, + "value": { + "type": "string", + "description": "The value of the custom field. Only to be used for single-valued custom fields. If unset, the custom field will be unset. If the custom field is a select field, the value must be the select option slug, which you can find from the GET /custom-fields endpoint." + }, + "values": { + "type": "array", + "description": "The values of the custom field. Only to be used for multi-valued custom fields (ex. multiselect). If unset, the custom field will be unset. If the custom field is a multiselect field, the values must be the select option slugs which you can find from the GET /custom-fields endpoint.", + "items": { + "type": "string" + } + } + } + } + }, + "email": { + "type": "string", + "description": "The email of the contact." + }, + "name": { + "type": "string", + "description": "The name of the contact." + }, + "portal_role": { + "type": "string", + "description": "The portal role to assign to the contact. If not provided uses the default portal role from the portal settings.\n\n* no_access PortalRoleNoAccess\n\n* member PortalRoleMember\n\n* admin PortalRoleAdmin", + "enum": [ + "no_access", + "member", + "admin" + ] + } + }, + "required": [ + "email", + "name" + ] + }, + "schema_required": false + } + ] + }, + "request_body_spec": "{\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"properties\": {\n \"account_id\": {\n \"description\": \"The account that this contact belongs to.\",\n \"type\": \"string\",\n \"x-go-name\": \"AccountID\"\n },\n \"avatar_url\": {\n \"description\": \"The avatar URL of the contact. Must be a square .png, .jpg or .jpeg.\",\n \"type\": \"string\",\n \"x-go-name\": \"AvatarUrl\"\n },\n \"custom_fields\": {\n \"description\": \"An array of custom fields to be applied to this contact.\",\n \"items\": {\n \"properties\": {\n \"slug\": {\n \"description\": \"The slug of the custom field.\",\n \"type\": \"string\",\n \"x-go-name\": \"Slug\"\n },\n \"value\": {\n \"description\": \"The value of the custom field. Only to be used for single-valued custom fields. If unset, the custom field will be unset. If the custom field is a select field, the value must be the select option slug, which you can find from the GET /custom-fields endpoint.\",\n \"type\": \"string\",\n \"x-go-name\": \"Value\"\n },\n \"values\": {\n \"description\": \"The values of the custom field. Only to be used for multi-valued custom fields (ex. multiselect). If unset, the custom field will be unset. If the custom field is a multiselect field, the values must be the select option slugs which you can find from the GET /custom-fields endpoint.\",\n \"items\": {\n \"type\": \"string\"\n },\n \"type\": \"array\",\n \"x-go-name\": \"Values\"\n }\n },\n \"type\": \"object\",\n \"x-go-package\": \"pylon/api/apiserver/apitypes\"\n },\n \"type\": \"array\",\n \"x-go-name\": \"CustomFields\"\n },\n \"email\": {\n \"description\": \"The email of the contact.\",\n \"type\": \"string\",\n \"x-go-name\": \"Email\"\n },\n \"name\": {\n \"description\": \"The name of the contact.\",\n \"type\": \"string\",\n \"x-go-name\": \"Name\"\n },\n \"portal_role\": {\n \"description\": \"The portal role to assign to the contact. If not provided uses the default portal role from the portal settings.\\n\\n* no_access PortalRoleNoAccess\\n\\n* member PortalRoleMember\\n\\n* admin PortalRoleAdmin\",\n \"enum\": [\n \"no_access\",\n \"member\",\n \"admin\"\n ],\n \"type\": \"string\",\n \"x-go-enum-desc\": \"no_access PortalRoleNoAccess\\nmember PortalRoleMember\\nadmin PortalRoleAdmin\",\n \"x-go-name\": \"PortalRole\"\n }\n },\n \"required\": [\n \"email\",\n \"name\"\n ],\n \"type\": \"object\",\n \"x-go-package\": \"pylon/api/apiserver/endpoints\"\n }\n }\n },\n \"required\": false\n}", + "use_request_body_schema_mode": true, + "validate_request_body_schema": true, + "use_flatten_mode": false + }, + { + "name": "ImportIssue", + "selected_for_wrapping": false, + "spec_built": true, + "wrap_finished": true, + "should_skip": false, + "skip_reason": null, + "wrapper_tool": { + "name": "import_issue", + "description": { + "tagline": "Import an issue into the system.", + "detailed": "This tool is used to import an issue into the Pylon system. Use it when you need to add new issues by importing them through a specified format or integration." + }, + "return_annotation": "Details of the imported issue.", + "arguments": [ + { + "name": "issue_import_request", + "alternative_names": [ + "issue_request_body", + "import_issue_data" + ], + "description": "A JSON object with details for the issue import, including account ID, assignee, attachments, created time, and more.", + "endpoint_argument_name": "requestBody" + } + ] + }, + "method": "POST", + "path": "/import/issues", + "tags": [ + "import" + ], + "summary": "", + "description": "Import an issue", + "requires_security": true, + "oauth_scopes": [], + "security_schemes": [ + "bearerAuth" + ], + "parameters": { + "query": [], + "path": [], + "header": [], + "cookie": [], + "body": [ + { + "name": "requestBody", + "value_schema": { + "val_type": "json", + "inner_val_type": null, + "enum": null, + "properties": { + "account_id": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "AccountID that the issue should belong to." + }, + "assignee_id": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "UserID that the issue should be assigned to." + }, + "attachment_urls": { + "val_type": "array", + "inner_val_type": "string", + "enum": null, + "properties": null, + "inner_properties": null, + "description": "An array of attachment URLs to attach to this issue." + }, + "created_at": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "CreatedAt is the time the issue was created (RFC3339)." + }, + "custom_fields": { + "val_type": "array", + "inner_val_type": "json", + "enum": null, + "properties": null, + "inner_properties": { + "slug": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The slug of the custom field." + }, + "value": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The value of the custom field. Only to be used for single-valued custom fields. If unset, the custom field will be unset. If the custom field is a select field, the value must be the select option slug, which you can find from the GET /custom-fields endpoint." + }, + "values": { + "val_type": "array", + "inner_val_type": "string", + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The values of the custom field. Only to be used for multi-valued custom fields (ex. multiselect). If unset, the custom field will be unset. If the custom field is a multiselect field, the values must be the select option slugs which you can find from the GET /custom-fields endpoint." + } + }, + "description": "An array of custom fields to be used on this issue." + }, + "external_issues": { + "val_type": "array", + "inner_val_type": "json", + "enum": null, + "properties": null, + "inner_properties": { + "external_issue_id": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The ID of the external issue in the source system." + }, + "source": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The source system of the external issue (e.g., \"linear\", \"asana\", \"jira\", \"github\")." + } + }, + "description": "External issues to link to this issue." + }, + "external_refs": { + "val_type": "json", + "inner_val_type": null, + "enum": null, + "properties": { + "intercom_conversation_id": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The Intercom conversation ID associated with this issue, if any." + }, + "zendesk_ticket_id": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The Zendesk ticket ID associated with this issue, if any." + } + }, + "inner_properties": null, + "description": null + }, + "first_response_time": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "FirstResponseTime is the time the issue was first responded to (RFC3339)." + }, + "messages": { + "val_type": "array", + "inner_val_type": "json", + "enum": null, + "properties": null, + "inner_properties": { + "attachment_urls": { + "val_type": "array", + "inner_val_type": "string", + "enum": null, + "properties": null, + "inner_properties": null, + "description": "An array of attachment URLs to attach to this message." + }, + "body_html": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The HTML content of the message." + }, + "contact_id": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The contact that sent the message. Only one of user_id or contact_id can be specified." + }, + "created_at": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "CreatedAt is the time the message was created (RFC3339)." + }, + "is_private": { + "val_type": "boolean", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "Whether the message is private." + }, + "user_id": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The user that sent the message. Only one of user_id or contact_id can be specified." + } + }, + "description": "Messages to be imported for this issue. At least one message is required." + }, + "requester_id": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "ContactID that the issue should be on behalf of." + }, + "resolution_time": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "ResolutionTime is the time the issue was resolved (RFC3339)." + }, + "state": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The state of the issue. Can be one of new, waiting_on_you, waiting_on_customer, on_hold, closed, or a custom status." + }, + "tags": { + "val_type": "array", + "inner_val_type": "string", + "enum": null, + "properties": null, + "inner_properties": null, + "description": "An array of strings to use as tags on this issue." + }, + "team_id": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "TeamID that the issue should be assigned to." + }, + "title": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The title of the issue." + }, + "updated_at": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "UpdatedAt is the time the issue was last updated (RFC3339)." + } + }, + "inner_properties": null, + "description": "" + }, + "description": "", + "required": false, + "deprecated": false, + "default": null, + "location": "body", + "content_type": "application/json", + "json_schema": { + "type": "object", + "properties": { + "account_id": { + "type": "string", + "description": "AccountID that the issue should belong to." + }, + "assignee_id": { + "type": "string", + "description": "UserID that the issue should be assigned to." + }, + "attachment_urls": { + "type": "array", + "description": "An array of attachment URLs to attach to this issue.", + "items": { + "type": "string" + } + }, + "created_at": { + "type": "string", + "description": "CreatedAt is the time the issue was created (RFC3339)." + }, + "custom_fields": { + "type": "array", + "description": "An array of custom fields to be used on this issue.", + "items": { + "type": "object", + "properties": { + "slug": { + "type": "string", + "description": "The slug of the custom field." + }, + "value": { + "type": "string", + "description": "The value of the custom field. Only to be used for single-valued custom fields. If unset, the custom field will be unset. If the custom field is a select field, the value must be the select option slug, which you can find from the GET /custom-fields endpoint." + }, + "values": { + "type": "array", + "description": "The values of the custom field. Only to be used for multi-valued custom fields (ex. multiselect). If unset, the custom field will be unset. If the custom field is a multiselect field, the values must be the select option slugs which you can find from the GET /custom-fields endpoint.", + "items": { + "type": "string" + } + } + } + } + }, + "external_issues": { + "type": "array", + "description": "External issues to link to this issue.", + "items": { + "type": "object", + "properties": { + "external_issue_id": { + "type": "string", + "description": "The ID of the external issue in the source system." + }, + "source": { + "type": "string", + "description": "The source system of the external issue (e.g., \"linear\", \"asana\", \"jira\", \"github\")." + } + }, + "required": [ + "external_issue_id", + "source" + ] + } + }, + "external_refs": { + "type": "object", + "properties": { + "intercom_conversation_id": { + "type": "string", + "description": "The Intercom conversation ID associated with this issue, if any." + }, + "zendesk_ticket_id": { + "type": "string", + "description": "The Zendesk ticket ID associated with this issue, if any." + } + } + }, + "first_response_time": { + "type": "string", + "description": "FirstResponseTime is the time the issue was first responded to (RFC3339)." + }, + "messages": { + "type": "array", + "description": "Messages to be imported for this issue. At least one message is required.", + "items": { + "type": "object", + "properties": { + "attachment_urls": { + "type": "array", + "description": "An array of attachment URLs to attach to this message.", + "items": { + "type": "string" + } + }, + "body_html": { + "type": "string", + "description": "The HTML content of the message." + }, + "contact_id": { + "type": "string", + "description": "The contact that sent the message. Only one of user_id or contact_id can be specified." + }, + "created_at": { + "type": "string", + "description": "CreatedAt is the time the message was created (RFC3339)." + }, + "is_private": { + "type": "boolean", + "description": "Whether the message is private." + }, + "user_id": { + "type": "string", + "description": "The user that sent the message. Only one of user_id or contact_id can be specified." + } + }, + "required": [ + "body_html", + "is_private" + ] + } + }, + "requester_id": { + "type": "string", + "description": "ContactID that the issue should be on behalf of." + }, + "resolution_time": { + "type": "string", + "description": "ResolutionTime is the time the issue was resolved (RFC3339)." + }, + "state": { + "type": "string", + "description": "The state of the issue. Can be one of new, waiting_on_you, waiting_on_customer, on_hold, closed, or a custom status." + }, + "tags": { + "type": "array", + "description": "An array of strings to use as tags on this issue.", + "items": { + "type": "string" + } + }, + "team_id": { + "type": "string", + "description": "TeamID that the issue should be assigned to." + }, + "title": { + "type": "string", + "description": "The title of the issue." + }, + "updated_at": { + "type": "string", + "description": "UpdatedAt is the time the issue was last updated (RFC3339)." + } + }, + "required": [ + "messages", + "state", + "title" + ] + }, + "schema_required": false + } + ] + }, + "request_body_spec": "{\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"properties\": {\n \"account_id\": {\n \"description\": \"AccountID that the issue should belong to.\",\n \"type\": \"string\",\n \"x-go-name\": \"AccountID\"\n },\n \"assignee_id\": {\n \"description\": \"UserID that the issue should be assigned to.\",\n \"type\": \"string\",\n \"x-go-name\": \"AssigneeID\"\n },\n \"attachment_urls\": {\n \"description\": \"An array of attachment URLs to attach to this issue.\",\n \"items\": {\n \"type\": \"string\"\n },\n \"type\": \"array\",\n \"x-go-name\": \"AttachmentURLs\"\n },\n \"created_at\": {\n \"description\": \"CreatedAt is the time the issue was created (RFC3339).\",\n \"type\": \"string\",\n \"x-go-name\": \"CreatedAt\"\n },\n \"custom_fields\": {\n \"description\": \"An array of custom fields to be used on this issue.\",\n \"items\": {\n \"properties\": {\n \"slug\": {\n \"description\": \"The slug of the custom field.\",\n \"type\": \"string\",\n \"x-go-name\": \"Slug\"\n },\n \"value\": {\n \"description\": \"The value of the custom field. Only to be used for single-valued custom fields. If unset, the custom field will be unset. If the custom field is a select field, the value must be the select option slug, which you can find from the GET /custom-fields endpoint.\",\n \"type\": \"string\",\n \"x-go-name\": \"Value\"\n },\n \"values\": {\n \"description\": \"The values of the custom field. Only to be used for multi-valued custom fields (ex. multiselect). If unset, the custom field will be unset. If the custom field is a multiselect field, the values must be the select option slugs which you can find from the GET /custom-fields endpoint.\",\n \"items\": {\n \"type\": \"string\"\n },\n \"type\": \"array\",\n \"x-go-name\": \"Values\"\n }\n },\n \"type\": \"object\",\n \"x-go-package\": \"pylon/api/apiserver/apitypes\"\n },\n \"type\": \"array\",\n \"x-go-name\": \"CustomFields\"\n },\n \"external_issues\": {\n \"description\": \"External issues to link to this issue.\",\n \"items\": {\n \"properties\": {\n \"external_issue_id\": {\n \"description\": \"The ID of the external issue in the source system.\",\n \"type\": \"string\",\n \"x-go-name\": \"ExternalIssueID\"\n },\n \"source\": {\n \"description\": \"The source system of the external issue (e.g., \\\"linear\\\", \\\"asana\\\", \\\"jira\\\", \\\"github\\\").\",\n \"type\": \"string\",\n \"x-go-name\": \"Source\"\n }\n },\n \"required\": [\n \"external_issue_id\",\n \"source\"\n ],\n \"type\": \"object\",\n \"x-go-package\": \"pylon/api/apiserver/endpoints\"\n },\n \"type\": \"array\",\n \"x-go-name\": \"ExternalIssues\"\n },\n \"external_refs\": {\n \"properties\": {\n \"intercom_conversation_id\": {\n \"description\": \"The Intercom conversation ID associated with this issue, if any.\",\n \"type\": \"string\",\n \"x-go-name\": \"IntercomConversationID\"\n },\n \"zendesk_ticket_id\": {\n \"description\": \"The Zendesk ticket ID associated with this issue, if any.\",\n \"type\": \"string\",\n \"x-go-name\": \"ZendeskTicketID\"\n }\n },\n \"type\": \"object\",\n \"x-go-package\": \"pylon/api/apiserver/endpoints\"\n },\n \"first_response_time\": {\n \"description\": \"FirstResponseTime is the time the issue was first responded to (RFC3339).\",\n \"type\": \"string\",\n \"x-go-name\": \"FirstResponseTime\"\n },\n \"messages\": {\n \"description\": \"Messages to be imported for this issue. At least one message is required.\",\n \"items\": {\n \"properties\": {\n \"attachment_urls\": {\n \"description\": \"An array of attachment URLs to attach to this message.\",\n \"items\": {\n \"type\": \"string\"\n },\n \"type\": \"array\",\n \"x-go-name\": \"AttachmentURLs\"\n },\n \"body_html\": {\n \"description\": \"The HTML content of the message.\",\n \"type\": \"string\",\n \"x-go-name\": \"BodyHTML\"\n },\n \"contact_id\": {\n \"description\": \"The contact that sent the message. Only one of user_id or contact_id can be specified.\",\n \"type\": \"string\",\n \"x-go-name\": \"ContactID\"\n },\n \"created_at\": {\n \"description\": \"CreatedAt is the time the message was created (RFC3339).\",\n \"type\": \"string\",\n \"x-go-name\": \"CreatedAt\"\n },\n \"is_private\": {\n \"description\": \"Whether the message is private.\",\n \"type\": \"boolean\",\n \"x-go-name\": \"IsPrivate\"\n },\n \"user_id\": {\n \"description\": \"The user that sent the message. Only one of user_id or contact_id can be specified.\",\n \"type\": \"string\",\n \"x-go-name\": \"UserID\"\n }\n },\n \"required\": [\n \"body_html\",\n \"is_private\"\n ],\n \"type\": \"object\",\n \"x-go-package\": \"pylon/api/apiserver/endpoints\"\n },\n \"type\": \"array\",\n \"x-go-name\": \"Messages\"\n },\n \"requester_id\": {\n \"description\": \"ContactID that the issue should be on behalf of.\",\n \"type\": \"string\",\n \"x-go-name\": \"RequesterID\"\n },\n \"resolution_time\": {\n \"description\": \"ResolutionTime is the time the issue was resolved (RFC3339).\",\n \"type\": \"string\",\n \"x-go-name\": \"ResolutionTime\"\n },\n \"state\": {\n \"description\": \"The state of the issue. Can be one of new, waiting_on_you, waiting_on_customer, on_hold, closed, or a custom status.\",\n \"type\": \"string\",\n \"x-go-name\": \"State\"\n },\n \"tags\": {\n \"description\": \"An array of strings to use as tags on this issue.\",\n \"items\": {\n \"type\": \"string\"\n },\n \"type\": \"array\",\n \"x-go-name\": \"Tags\"\n },\n \"team_id\": {\n \"description\": \"TeamID that the issue should be assigned to.\",\n \"type\": \"string\",\n \"x-go-name\": \"TeamID\"\n },\n \"title\": {\n \"description\": \"The title of the issue.\",\n \"type\": \"string\",\n \"x-go-name\": \"Title\"\n },\n \"updated_at\": {\n \"description\": \"UpdatedAt is the time the issue was last updated (RFC3339).\",\n \"type\": \"string\",\n \"x-go-name\": \"UpdatedAt\"\n }\n },\n \"required\": [\n \"messages\",\n \"state\",\n \"title\"\n ],\n \"type\": \"object\",\n \"x-go-package\": \"pylon/api/apiserver/endpoints\"\n }\n }\n },\n \"required\": false\n}", + "use_request_body_schema_mode": true, + "validate_request_body_schema": true, + "use_flatten_mode": false + }, + { + "name": "ImportMessages", + "selected_for_wrapping": false, + "spec_built": true, + "wrap_finished": true, + "should_skip": false, + "skip_reason": null, + "wrapper_tool": { + "name": "import_messages_to_issue", + "description": { + "tagline": "Import messages into an existing issue.", + "detailed": "Use this tool to import new messages onto an existing issue, facilitating better organization and tracking within issue management systems." + }, + "return_annotation": "Confirmation of messages imported to the issue.", + "arguments": [ + { + "name": "issue_id", + "alternative_names": [ + "issue_identifier", + "issue_key" + ], + "description": "The unique ID of the existing issue to which messages will be imported.", + "endpoint_argument_name": "id" + }, + { + "name": "imported_messages", + "alternative_names": [ + "messages_to_import", + "issue_messages" + ], + "description": "A JSON array of messages to import, each containing fields like body_html, contact_id or user_id (one is required), created_at, is_private, and optional attachment_urls.", + "endpoint_argument_name": "requestBody" + } + ] + }, + "method": "POST", + "path": "/import/issues/{id}/messages", + "tags": [ + "import" + ], + "summary": "", + "description": "Import messages onto an existing issue", + "requires_security": true, + "oauth_scopes": [], + "security_schemes": [ + "bearerAuth" + ], + "parameters": { + "query": [], + "path": [ + { + "name": "id", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The ID of the issue." + }, + "description": "The ID of the issue.", + "required": true, + "deprecated": false, + "default": null, + "location": "path", + "content_type": null, + "json_schema": { + "type": "string" + }, + "schema_required": false + } + ], + "header": [], + "cookie": [], + "body": [ + { + "name": "requestBody", + "value_schema": { + "val_type": "json", + "inner_val_type": null, + "enum": null, + "properties": { + "messages": { + "val_type": "array", + "inner_val_type": "json", + "enum": null, + "properties": null, + "inner_properties": { + "attachment_urls": { + "val_type": "array", + "inner_val_type": "string", + "enum": null, + "properties": null, + "inner_properties": null, + "description": "An array of attachment URLs to attach to this message." + }, + "body_html": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The HTML content of the message." + }, + "contact_id": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The contact that sent the message. Only one of user_id or contact_id can be specified." + }, + "created_at": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "CreatedAt is the time the message was created (RFC3339)." + }, + "is_private": { + "val_type": "boolean", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "Whether the message is private." + }, + "user_id": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The user that sent the message. Only one of user_id or contact_id can be specified." + } + }, + "description": "Messages to be imported for this issue. At least one message is required." + } + }, + "inner_properties": null, + "description": "" + }, + "description": "", + "required": false, + "deprecated": false, + "default": null, + "location": "body", + "content_type": "application/json", + "json_schema": { + "type": "object", + "properties": { + "messages": { + "type": "array", + "description": "Messages to be imported for this issue. At least one message is required.", + "items": { + "type": "object", + "properties": { + "attachment_urls": { + "type": "array", + "description": "An array of attachment URLs to attach to this message.", + "items": { + "type": "string" + } + }, + "body_html": { + "type": "string", + "description": "The HTML content of the message." + }, + "contact_id": { + "type": "string", + "description": "The contact that sent the message. Only one of user_id or contact_id can be specified." + }, + "created_at": { + "type": "string", + "description": "CreatedAt is the time the message was created (RFC3339)." + }, + "is_private": { + "type": "boolean", + "description": "Whether the message is private." + }, + "user_id": { + "type": "string", + "description": "The user that sent the message. Only one of user_id or contact_id can be specified." + } + }, + "required": [ + "body_html", + "is_private" + ] + } + } + }, + "required": [ + "messages" + ] + }, + "schema_required": false + } + ] + }, + "request_body_spec": "{\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"properties\": {\n \"messages\": {\n \"description\": \"Messages to be imported for this issue. At least one message is required.\",\n \"items\": {\n \"properties\": {\n \"attachment_urls\": {\n \"description\": \"An array of attachment URLs to attach to this message.\",\n \"items\": {\n \"type\": \"string\"\n },\n \"type\": \"array\",\n \"x-go-name\": \"AttachmentURLs\"\n },\n \"body_html\": {\n \"description\": \"The HTML content of the message.\",\n \"type\": \"string\",\n \"x-go-name\": \"BodyHTML\"\n },\n \"contact_id\": {\n \"description\": \"The contact that sent the message. Only one of user_id or contact_id can be specified.\",\n \"type\": \"string\",\n \"x-go-name\": \"ContactID\"\n },\n \"created_at\": {\n \"description\": \"CreatedAt is the time the message was created (RFC3339).\",\n \"type\": \"string\",\n \"x-go-name\": \"CreatedAt\"\n },\n \"is_private\": {\n \"description\": \"Whether the message is private.\",\n \"type\": \"boolean\",\n \"x-go-name\": \"IsPrivate\"\n },\n \"user_id\": {\n \"description\": \"The user that sent the message. Only one of user_id or contact_id can be specified.\",\n \"type\": \"string\",\n \"x-go-name\": \"UserID\"\n }\n },\n \"required\": [\n \"body_html\",\n \"is_private\"\n ],\n \"type\": \"object\",\n \"x-go-package\": \"pylon/api/apiserver/endpoints\"\n },\n \"type\": \"array\",\n \"x-go-name\": \"Messages\"\n }\n },\n \"required\": [\n \"messages\"\n ],\n \"type\": \"object\",\n \"x-go-package\": \"pylon/api/apiserver/endpoints\"\n }\n }\n },\n \"required\": false\n}", + "use_request_body_schema_mode": true, + "validate_request_body_schema": true, + "use_flatten_mode": false + }, + { + "name": "GetIssueStatuses", + "selected_for_wrapping": false, + "spec_built": true, + "wrap_finished": true, + "should_skip": false, + "skip_reason": null, + "wrapper_tool": { + "name": "get_issue_statuses", + "description": { + "tagline": "Retrieve all issue statuses from the system.", + "detailed": "Use this tool to get a complete list of issue statuses available in the project management system. This can help with tracking and managing project workflows efficiently." + }, + "return_annotation": "List of all issue statuses.", + "arguments": [] + }, + "method": "GET", + "path": "/issue-statuses", + "tags": [ + "issue-statuses" + ], + "summary": "", + "description": "Get all issue statuses", + "requires_security": true, + "oauth_scopes": [], + "security_schemes": [ + "bearerAuth" + ], + "parameters": { + "query": [], + "path": [], + "header": [], + "cookie": [], + "body": [] + }, + "request_body_spec": null, + "use_request_body_schema_mode": false, + "validate_request_body_schema": false, + "use_flatten_mode": false + }, + { + "name": "GetIssues", + "selected_for_wrapping": false, + "spec_built": true, + "wrap_finished": true, + "should_skip": false, + "skip_reason": null, + "wrapper_tool": { + "name": "get_issues_list", + "description": { + "tagline": "Retrieve a list of issues.", + "detailed": "Call this tool to get a list of issues from the Pylon service, useful for tracking or managing tasks and bugs." + }, + "return_annotation": "A list of issues.", + "arguments": [ + { + "name": "start_time_for_issue_range", + "alternative_names": [ + "issue_range_start_time", + "issue_start_time" + ], + "description": "The start time in RFC3339 format to query issues. Duration with end_time must be <= 30 days.", + "endpoint_argument_name": "start_time" + }, + { + "name": "end_time_rfc3339", + "alternative_names": [ + "end_time_str", + "end_time_parameter" + ], + "description": "The end time in RFC3339 format for the issue retrieval range, must be within 30 days of the start time.", + "endpoint_argument_name": "end_time" + } + ] + }, + "method": "GET", + "path": "/issues", + "tags": [ + "issues" + ], + "summary": "", + "description": "Get a list of issues", + "requires_security": true, + "oauth_scopes": [], + "security_schemes": [ + "bearerAuth" + ], + "parameters": { + "query": [ + { + "name": "start_time", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The start time (RFC3339) of the time range to get issues for. The duration between start_time and end_time must be less than or equal to 30 days." + }, + "description": "The start time (RFC3339) of the time range to get issues for. The duration between start_time and end_time must be less than or equal to 30 days.", + "required": true, + "deprecated": false, + "default": null, + "location": "query", + "content_type": null, + "json_schema": { + "type": "string" + }, + "schema_required": false + }, + { + "name": "end_time", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The end time (RFC3339) of the time range to get issues for. The duration between start_time and end_time must be less than or equal to 30 days." + }, + "description": "The end time (RFC3339) of the time range to get issues for. The duration between start_time and end_time must be less than or equal to 30 days.", + "required": true, + "deprecated": false, + "default": null, + "location": "query", + "content_type": null, + "json_schema": { + "type": "string" + }, + "schema_required": false + } + ], + "path": [], + "header": [], + "cookie": [], + "body": [] + }, + "request_body_spec": null, + "use_request_body_schema_mode": false, + "validate_request_body_schema": false, + "use_flatten_mode": false + }, + { + "name": "CreateIssue", + "selected_for_wrapping": false, + "spec_built": true, + "wrap_finished": true, + "should_skip": false, + "skip_reason": null, + "wrapper_tool": { + "name": "create_new_issue", + "description": { + "tagline": "Create a new issue in the system.", + "detailed": "This tool is used to create a new issue in the system. It should be called whenever there's a need to log or track a new issue or task." + }, + "return_annotation": "Details of the newly created issue.", + "arguments": [ + { + "name": "issue_details", + "alternative_names": [ + "issue_information", + "issue_data" + ], + "description": "A JSON object containing issue details including account_id, assignee_id, attachment_urls, body_html, contact_id, and other optional fields. This data structures the issue to be created, indicating ownership, assignment, and any additional contextual information like attachments or destination preferences.", + "endpoint_argument_name": "requestBody" + } + ] + }, + "method": "POST", + "path": "/issues", + "tags": [ + "issues" + ], + "summary": "", + "description": "Create a new issue", + "requires_security": true, + "oauth_scopes": [], + "security_schemes": [ + "bearerAuth" + ], + "parameters": { + "query": [], + "path": [], + "header": [], + "cookie": [], + "body": [ + { + "name": "requestBody", + "value_schema": { + "val_type": "json", + "inner_val_type": null, + "enum": null, + "properties": { + "account_id": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The account that this issue belongs to." + }, + "assignee_id": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The user the issue should be assigned to." + }, + "attachment_urls": { + "val_type": "array", + "inner_val_type": "string", + "enum": null, + "properties": null, + "inner_properties": null, + "description": "An array of attachment URLs to attach to this issue." + }, + "body_html": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The HTML content of the body of the issue." + }, + "contact_id": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "Optional contact ID to post the message as. Only one of user_id or contact_id can be provided." + }, + "created_at": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "Timestamp of when the issue was created. If not specified, the current time will be used. (RFC3339)" + }, + "custom_fields": { + "val_type": "array", + "inner_val_type": "json", + "enum": null, + "properties": null, + "inner_properties": { + "slug": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The slug of the custom field." + }, + "value": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The value of the custom field. Only to be used for single-valued custom fields. If unset, the custom field will be unset. If the custom field is a select field, the value must be the select option slug, which you can find from the GET /custom-fields endpoint." + }, + "values": { + "val_type": "array", + "inner_val_type": "string", + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The values of the custom field. Only to be used for multi-valued custom fields (ex. multiselect). If unset, the custom field will be unset. If the custom field is a multiselect field, the values must be the select option slugs which you can find from the GET /custom-fields endpoint." + } + }, + "description": "An array of custom fields to be used on this issue." + }, + "destination_metadata": { + "val_type": "json", + "inner_val_type": null, + "enum": null, + "properties": { + "chat_widget_app_id": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The ID of the chat widget app to use for in-app chat." + }, + "destination": { + "val_type": "string", + "inner_val_type": null, + "enum": [ + "slack", + "email", + "in_app_chat", + "internal" + ], + "properties": null, + "inner_properties": null, + "description": "The destination type of the issue. Can be \"email\", \"slack\", \"in_app_chat\", or \"internal\". Defaults to \"internal\".\n\n* slack APIIssueDestinationSlack Deliver to the issue's account's Slack channel.\n\n* email APIIssueDestinationEmail Deliver messages to the issue requester via email.\n\n* in_app_chat APIIssueDestinationChatWidget Deliver messages to the issue requester via in-app chat.\n\n* internal APIIssueDestinationInternal Keep the issue internal and don't contact the requester at all." + }, + "email": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The email that emails to the requester will be sent from. You must configure an email app in Pylon with this address." + }, + "email_bccs": { + "val_type": "array", + "inner_val_type": "string", + "enum": null, + "properties": null, + "inner_properties": null, + "description": "Emails that will be BCCed on emails to the requester." + }, + "email_ccs": { + "val_type": "array", + "inner_val_type": "string", + "enum": null, + "properties": null, + "inner_properties": null, + "description": "Emails that will be CCed on emails to the requester." + } + }, + "inner_properties": null, + "description": "You can configure the issue to contact the requester via email, Slack, in-app chat, or not at all.\n\nIf a destination other than `internal` is specified, a message with the issue's BodyHTML will be delivered to the requester. If you don't wish to immediately contact the requester, you can specify the `internal` destination." + }, + "priority": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The priority of the issue. Can be one of: urgent, high, medium, or low." + }, + "requester_avatar_url": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The URL of an avatar of the requester." + }, + "requester_email": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The email of the user that this issue is on behalf of. Include one of requester_id or requester_email to create an issue with a requester." + }, + "requester_id": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The requester that this issue is on behalf of. Include one of requester_id or requester_email to create an issue with a requester." + }, + "requester_name": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The full name of the user that this issue is on behalf of." + }, + "tags": { + "val_type": "array", + "inner_val_type": "string", + "enum": null, + "properties": null, + "inner_properties": null, + "description": "An array of strings to use as tags on this issue. If provided, the issue tags will be updated to the given tags." + }, + "team_id": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The ID of the team this issue should be assigned to." + }, + "title": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The title of the issue." + }, + "user_id": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "Optional user ID to post the message as. Only one of user_id or contact_id can be provided." + } + }, + "inner_properties": null, + "description": "" + }, + "description": "", + "required": false, + "deprecated": false, + "default": null, + "location": "body", + "content_type": "application/json", + "json_schema": { + "type": "object", + "properties": { + "account_id": { + "type": "string", + "description": "The account that this issue belongs to." + }, + "assignee_id": { + "type": "string", + "description": "The user the issue should be assigned to." + }, + "attachment_urls": { + "type": "array", + "description": "An array of attachment URLs to attach to this issue.", + "items": { + "type": "string" + } + }, + "body_html": { + "type": "string", + "description": "The HTML content of the body of the issue." + }, + "contact_id": { + "type": "string", + "description": "Optional contact ID to post the message as. Only one of user_id or contact_id can be provided." + }, + "created_at": { + "type": "string", + "description": "Timestamp of when the issue was created. If not specified, the current time will be used. (RFC3339)" + }, + "custom_fields": { + "type": "array", + "description": "An array of custom fields to be used on this issue.", + "items": { + "type": "object", + "properties": { + "slug": { + "type": "string", + "description": "The slug of the custom field." + }, + "value": { + "type": "string", + "description": "The value of the custom field. Only to be used for single-valued custom fields. If unset, the custom field will be unset. If the custom field is a select field, the value must be the select option slug, which you can find from the GET /custom-fields endpoint." + }, + "values": { + "type": "array", + "description": "The values of the custom field. Only to be used for multi-valued custom fields (ex. multiselect). If unset, the custom field will be unset. If the custom field is a multiselect field, the values must be the select option slugs which you can find from the GET /custom-fields endpoint.", + "items": { + "type": "string" + } + } + } + } + }, + "destination_metadata": { + "type": "object", + "title": "DestinationMetadata specifies if/how communication will be delivered to the customer.", + "description": "You can configure the issue to contact the requester via email, Slack, in-app chat, or not at all.\n\nIf a destination other than `internal` is specified, a message with the issue's BodyHTML will be delivered to the requester. If you don't wish to immediately contact the requester, you can specify the `internal` destination.", + "properties": { + "chat_widget_app_id": { + "type": "string", + "description": "The ID of the chat widget app to use for in-app chat." + }, + "destination": { + "type": "string", + "description": "The destination type of the issue. Can be \"email\", \"slack\", \"in_app_chat\", or \"internal\". Defaults to \"internal\".\n\n* slack APIIssueDestinationSlack Deliver to the issue's account's Slack channel.\n\n* email APIIssueDestinationEmail Deliver messages to the issue requester via email.\n\n* in_app_chat APIIssueDestinationChatWidget Deliver messages to the issue requester via in-app chat.\n\n* internal APIIssueDestinationInternal Keep the issue internal and don't contact the requester at all.", + "enum": [ + "slack", + "email", + "in_app_chat", + "internal" + ] + }, + "email": { + "type": "string", + "description": "The email that emails to the requester will be sent from. You must configure an email app in Pylon with this address." + }, + "email_bccs": { + "type": "array", + "description": "Emails that will be BCCed on emails to the requester.", + "items": { + "type": "string" + } + }, + "email_ccs": { + "type": "array", + "description": "Emails that will be CCed on emails to the requester.", + "items": { + "type": "string" + } + } + } + }, + "priority": { + "type": "string", + "description": "The priority of the issue. Can be one of: urgent, high, medium, or low." + }, + "requester_avatar_url": { + "type": "string", + "description": "The URL of an avatar of the requester." + }, + "requester_email": { + "type": "string", + "description": "The email of the user that this issue is on behalf of. Include one of requester_id or requester_email to create an issue with a requester." + }, + "requester_id": { + "type": "string", + "description": "The requester that this issue is on behalf of. Include one of requester_id or requester_email to create an issue with a requester." + }, + "requester_name": { + "type": "string", + "description": "The full name of the user that this issue is on behalf of." + }, + "tags": { + "type": "array", + "description": "An array of strings to use as tags on this issue. If provided, the issue tags will be updated to the given tags.", + "items": { + "type": "string" + } + }, + "team_id": { + "type": "string", + "description": "The ID of the team this issue should be assigned to." + }, + "title": { + "type": "string", + "description": "The title of the issue." + }, + "user_id": { + "type": "string", + "description": "Optional user ID to post the message as. Only one of user_id or contact_id can be provided." + } + }, + "required": [ + "body_html", + "title" + ] + }, + "schema_required": false + } + ] + }, + "request_body_spec": "{\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"properties\": {\n \"account_id\": {\n \"description\": \"The account that this issue belongs to.\",\n \"type\": \"string\",\n \"x-go-name\": \"AccountID\"\n },\n \"assignee_id\": {\n \"description\": \"The user the issue should be assigned to.\",\n \"type\": \"string\",\n \"x-go-name\": \"AssigneeID\"\n },\n \"attachment_urls\": {\n \"description\": \"An array of attachment URLs to attach to this issue.\",\n \"items\": {\n \"type\": \"string\"\n },\n \"type\": \"array\",\n \"x-go-name\": \"AttachmentURLs\"\n },\n \"body_html\": {\n \"description\": \"The HTML content of the body of the issue.\",\n \"type\": \"string\",\n \"x-go-name\": \"BodyHTML\"\n },\n \"contact_id\": {\n \"description\": \"Optional contact ID to post the message as. Only one of user_id or contact_id can be provided.\",\n \"type\": \"string\",\n \"x-go-name\": \"ContactID\"\n },\n \"created_at\": {\n \"description\": \"Timestamp of when the issue was created. If not specified, the current time will be used. (RFC3339)\",\n \"type\": \"string\",\n \"x-go-name\": \"CreatedAt\"\n },\n \"custom_fields\": {\n \"description\": \"An array of custom fields to be used on this issue.\",\n \"items\": {\n \"properties\": {\n \"slug\": {\n \"description\": \"The slug of the custom field.\",\n \"type\": \"string\",\n \"x-go-name\": \"Slug\"\n },\n \"value\": {\n \"description\": \"The value of the custom field. Only to be used for single-valued custom fields. If unset, the custom field will be unset. If the custom field is a select field, the value must be the select option slug, which you can find from the GET /custom-fields endpoint.\",\n \"type\": \"string\",\n \"x-go-name\": \"Value\"\n },\n \"values\": {\n \"description\": \"The values of the custom field. Only to be used for multi-valued custom fields (ex. multiselect). If unset, the custom field will be unset. If the custom field is a multiselect field, the values must be the select option slugs which you can find from the GET /custom-fields endpoint.\",\n \"items\": {\n \"type\": \"string\"\n },\n \"type\": \"array\",\n \"x-go-name\": \"Values\"\n }\n },\n \"type\": \"object\",\n \"x-go-package\": \"pylon/api/apiserver/apitypes\"\n },\n \"type\": \"array\",\n \"x-go-name\": \"CustomFields\"\n },\n \"destination_metadata\": {\n \"description\": \"You can configure the issue to contact the requester via email, Slack, in-app chat, or not at all.\\n\\nIf a destination other than `internal` is specified, a message with the issue's BodyHTML will be delivered to the requester. If you don't wish to immediately contact the requester, you can specify the `internal` destination.\",\n \"properties\": {\n \"chat_widget_app_id\": {\n \"description\": \"The ID of the chat widget app to use for in-app chat.\",\n \"type\": \"string\",\n \"x-go-name\": \"ChatWidgetAppID\"\n },\n \"destination\": {\n \"description\": \"The destination type of the issue. Can be \\\"email\\\", \\\"slack\\\", \\\"in_app_chat\\\", or \\\"internal\\\". Defaults to \\\"internal\\\".\\n\\n* slack APIIssueDestinationSlack Deliver to the issue's account's Slack channel.\\n\\n* email APIIssueDestinationEmail Deliver messages to the issue requester via email.\\n\\n* in_app_chat APIIssueDestinationChatWidget Deliver messages to the issue requester via in-app chat.\\n\\n* internal APIIssueDestinationInternal Keep the issue internal and don't contact the requester at all.\",\n \"enum\": [\n \"slack\",\n \"email\",\n \"in_app_chat\",\n \"internal\"\n ],\n \"type\": \"string\",\n \"x-go-enum-desc\": \"slack APIIssueDestinationSlack Deliver to the issue's account's Slack channel.\\nemail APIIssueDestinationEmail Deliver messages to the issue requester via email.\\nin_app_chat APIIssueDestinationChatWidget Deliver messages to the issue requester via in-app chat.\\ninternal APIIssueDestinationInternal Keep the issue internal and don't contact the requester at all.\",\n \"x-go-name\": \"Destination\"\n },\n \"email\": {\n \"description\": \"The email that emails to the requester will be sent from. You must configure an email app in Pylon with this address.\",\n \"type\": \"string\",\n \"x-go-name\": \"Email\"\n },\n \"email_bccs\": {\n \"description\": \"Emails that will be BCCed on emails to the requester.\",\n \"items\": {\n \"type\": \"string\"\n },\n \"type\": \"array\",\n \"x-go-name\": \"EmailBCCs\"\n },\n \"email_ccs\": {\n \"description\": \"Emails that will be CCed on emails to the requester.\",\n \"items\": {\n \"type\": \"string\"\n },\n \"type\": \"array\",\n \"x-go-name\": \"EmailCCs\"\n }\n },\n \"title\": \"DestinationMetadata specifies if/how communication will be delivered to the customer.\",\n \"type\": \"object\",\n \"x-go-package\": \"pylon/api/apiserver/apitypes\"\n },\n \"priority\": {\n \"description\": \"The priority of the issue. Can be one of: urgent, high, medium, or low.\",\n \"type\": \"string\",\n \"x-go-name\": \"Priority\"\n },\n \"requester_avatar_url\": {\n \"description\": \"The URL of an avatar of the requester.\",\n \"type\": \"string\",\n \"x-go-name\": \"RequesterAvatarUrl\"\n },\n \"requester_email\": {\n \"description\": \"The email of the user that this issue is on behalf of. Include one of requester_id or requester_email to create an issue with a requester.\",\n \"type\": \"string\",\n \"x-go-name\": \"RequesterEmail\"\n },\n \"requester_id\": {\n \"description\": \"The requester that this issue is on behalf of. Include one of requester_id or requester_email to create an issue with a requester.\",\n \"type\": \"string\",\n \"x-go-name\": \"RequesterID\"\n },\n \"requester_name\": {\n \"description\": \"The full name of the user that this issue is on behalf of.\",\n \"type\": \"string\",\n \"x-go-name\": \"RequesterName\"\n },\n \"tags\": {\n \"description\": \"An array of strings to use as tags on this issue. If provided, the issue tags will be updated to the given tags.\",\n \"items\": {\n \"type\": \"string\"\n },\n \"type\": \"array\",\n \"x-go-name\": \"Tags\"\n },\n \"team_id\": {\n \"description\": \"The ID of the team this issue should be assigned to.\",\n \"type\": \"string\",\n \"x-go-name\": \"TeamID\"\n },\n \"title\": {\n \"description\": \"The title of the issue.\",\n \"type\": \"string\",\n \"x-go-name\": \"Title\"\n },\n \"user_id\": {\n \"description\": \"Optional user ID to post the message as. Only one of user_id or contact_id can be provided.\",\n \"type\": \"string\",\n \"x-go-name\": \"UserID\"\n }\n },\n \"required\": [\n \"body_html\",\n \"title\"\n ],\n \"type\": \"object\",\n \"x-go-package\": \"pylon/api/apiserver/endpoints\"\n }\n }\n },\n \"required\": false\n}", + "use_request_body_schema_mode": true, + "validate_request_body_schema": true, + "use_flatten_mode": false + }, + { + "name": "SearchIssues", + "selected_for_wrapping": false, + "spec_built": true, + "wrap_finished": true, + "should_skip": false, + "skip_reason": null, + "wrapper_tool": { + "name": "search_issues_by_filters", + "description": { + "tagline": "Search for issues using various filters and criteria.", + "detailed": "Use this tool to search for issues by applying filters such as creation date, account ID, requester ID, status, tags, title, and more. Suitable for retrieving specific issues according to predefined criteria and operators." + }, + "return_annotation": "Returns filtered issues based on given criteria.", + "arguments": [ + { + "name": "filter_parameters", + "alternative_names": [ + "search_criteria", + "issue_filters" + ], + "description": "JSON object containing filter criteria such as field, operator, and value to search issues. Includes pagination cursor and limit.", + "endpoint_argument_name": "requestBody" + } + ] + }, + "method": "POST", + "path": "/issues/search", + "tags": [ + "issues" + ], + "summary": "Search for issues by a given filter", + "description": "Currently, the following fields are filterable for issues:\n\n* created_at (in RFC3339 format). Allowed operators: `time_is_after`, `time_is_before`, `time_range`\n\n* account_id. Allowed operators: `equals`, `in`, `not_in`, `is_set`, `is_unset`\n\n* ticket_form_id. Allowed operators: `equals`, `in`, `not_in`, `is_set`, `is_unset`\n\n* requester_id. Allowed operators: `equals`, `in`, `not_in`, `is_set`, `is_unset`\n\n* follower_user_id. Allowed operators: `equals`, `in`, `not_in`\n\n* follower_contact_id. Allowed operators: `equals`, `in`, `not_in`\n\n* state. Valid values are `[\"new\", \"waiting_on_you\", \"waiting_on_customer\", \"on_hold\", \"closed\"]` or a custom status slug. Allowed operators: `equals`, `in`, `not_in`\n\n* custom fields (pass in the slug of the custom field)\n\n* tags (pass in the tag name). Allowed operators: `contains`, `does_not_contain`, `in`, `not_in`\n\n* title. Allowed operators: `string_contains`, `string_does_not_contain`\n\n* body_html. Allowed operators: `string_contains`, `string_does_not_contain`\n\n* assignee_id. Allowed operators: `equals`, `in`, `not_in`, `is_set`, `is_unset`\n\n* team_id. Allowed operators: `equals`, `in`, `not_in`", + "requires_security": true, + "oauth_scopes": [], + "security_schemes": [ + "bearerAuth" + ], + "parameters": { + "query": [], + "path": [], + "header": [], + "cookie": [], + "body": [ + { + "name": "requestBody", + "value_schema": { + "val_type": "json", + "inner_val_type": null, + "enum": null, + "properties": { + "cursor": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The cursor to use for pagination." + }, + "filter": { + "val_type": "json", + "inner_val_type": null, + "enum": null, + "properties": { + "field": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The field for this filter. For allowed fields, see the documentation for\n\nthe specific endpoint you are using.\n\nFor non-compound filters (any operators other than \"and\" or \"or\"),\n\nField must be set, along with either Value or Values, depending on the operator." + }, + "operator": { + "val_type": "string", + "inner_val_type": null, + "enum": [ + "equals", + "not_equals", + "contains", + "does_not_contain", + "in", + "not_in", + "and", + "or", + "time_is_after", + "time_is_before", + "time_range", + "string_contains", + "string_does_not_contain", + "is_set", + "is_unset" + ], + "properties": null, + "inner_properties": null, + "description": "The operator for this filter.\n\n* equals FilterOperatorEquals Matches objects that are exactly equal to the value in the field.\n\n* not_equals FilterOperatorNotEquals Matches objects that are not exactly equal to the value in the field.\n\n* contains FilterOperatorContains For a multi-valued field, such as tags, this operator will match objects that contain any of the values in the field.\n\n* does_not_contain FilterOperatorDoesNotContain For a multi-valued field, such as tags, this operator will match objects that do not contain any of the values in the field.\n\n* in FilterOperatorIn Matches objects if the field is one of several possible values, as specified in the values array.\n\n* not_in FilterOperatorNotIn Matches objects if the field is none of several possible values, as specified in the values array.\n\n* and FilterOperatorAnd Matches objects only if all subfilters match.\n\n* or FilterOperatorOr Matches objects if any subfilter matches.\n\n* time_is_after FilterOperatorTimeIsAfter Matches objects if the field is after the given time.\n\n* time_is_before FilterOperatorTimeIsBefore Matches objects if the field is before the given time.\n\n* time_range FilterOperatorTimeRange Matches objects if the field is between the given times.\n\n* string_contains FilterOperatorStringContains Matches objects if the field contains the given string.\n\n* string_does_not_contain FilterOperatorStringDoesNotContain Matches objects if the field does not contain the given string.\n\n* is_set FilterOperatorIsSet FilterOperatorIsSet matches objects if the field is set.\n\n* is_unset FilterOperatorIsUnset FilterOperatorIsUnset matches objects if the field is unset." + }, + "subfilters": { + "val_type": "array", + "inner_val_type": "json", + "enum": null, + "properties": null, + "inner_properties": {}, + "description": "Sub-filters for this filter. Valid only when operator is \"and\" or \"or\".\n\nThe maximum allowed depth for a tree of filters is 3." + }, + "value": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The value for this filter. Only used for single-valued operators\n\n(\"equals\", \"not_equals\", \"contains\", \"does_not_contain\")" + }, + "values": { + "val_type": "array", + "inner_val_type": "string", + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The values for this filter. Only used for multi-valued operators (\"in\", \"not_in\")." + } + }, + "inner_properties": null, + "description": null + }, + "limit": { + "val_type": "integer", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The number of issues to fetch. Defaults to 100. Must be greater than 0 and less than 1000." + } + }, + "inner_properties": null, + "description": "" + }, + "description": "", + "required": false, + "deprecated": false, + "default": null, + "location": "body", + "content_type": "application/json", + "json_schema": { + "type": "object", + "properties": { + "cursor": { + "type": "string", + "description": "The cursor to use for pagination." + }, + "filter": { + "type": "object", + "properties": { + "field": { + "type": "string", + "description": "The field for this filter. For allowed fields, see the documentation for\n\nthe specific endpoint you are using.\n\nFor non-compound filters (any operators other than \"and\" or \"or\"),\n\nField must be set, along with either Value or Values, depending on the operator." + }, + "operator": { + "type": "string", + "description": "The operator for this filter.\n\n* equals FilterOperatorEquals Matches objects that are exactly equal to the value in the field.\n\n* not_equals FilterOperatorNotEquals Matches objects that are not exactly equal to the value in the field.\n\n* contains FilterOperatorContains For a multi-valued field, such as tags, this operator will match objects that contain any of the values in the field.\n\n* does_not_contain FilterOperatorDoesNotContain For a multi-valued field, such as tags, this operator will match objects that do not contain any of the values in the field.\n\n* in FilterOperatorIn Matches objects if the field is one of several possible values, as specified in the values array.\n\n* not_in FilterOperatorNotIn Matches objects if the field is none of several possible values, as specified in the values array.\n\n* and FilterOperatorAnd Matches objects only if all subfilters match.\n\n* or FilterOperatorOr Matches objects if any subfilter matches.\n\n* time_is_after FilterOperatorTimeIsAfter Matches objects if the field is after the given time.\n\n* time_is_before FilterOperatorTimeIsBefore Matches objects if the field is before the given time.\n\n* time_range FilterOperatorTimeRange Matches objects if the field is between the given times.\n\n* string_contains FilterOperatorStringContains Matches objects if the field contains the given string.\n\n* string_does_not_contain FilterOperatorStringDoesNotContain Matches objects if the field does not contain the given string.\n\n* is_set FilterOperatorIsSet FilterOperatorIsSet matches objects if the field is set.\n\n* is_unset FilterOperatorIsUnset FilterOperatorIsUnset matches objects if the field is unset.", + "enum": [ + "equals", + "not_equals", + "contains", + "does_not_contain", + "in", + "not_in", + "and", + "or", + "time_is_after", + "time_is_before", + "time_range", + "string_contains", + "string_does_not_contain", + "is_set", + "is_unset" + ] + }, + "subfilters": { + "type": "array", + "description": "Sub-filters for this filter. Valid only when operator is \"and\" or \"or\".\n\nThe maximum allowed depth for a tree of filters is 3.", + "items": { + "type": "object", + "properties": {} + } + }, + "value": { + "type": "string", + "description": "The value for this filter. Only used for single-valued operators\n\n(\"equals\", \"not_equals\", \"contains\", \"does_not_contain\")" + }, + "values": { + "type": "array", + "description": "The values for this filter. Only used for multi-valued operators (\"in\", \"not_in\").", + "items": { + "type": "string" + } + } + }, + "required": [ + "field", + "operator" + ] + }, + "limit": { + "type": "integer", + "description": "The number of issues to fetch. Defaults to 100. Must be greater than 0 and less than 1000.", + "format": "int64" + } + }, + "required": [ + "filter" + ] + }, + "schema_required": false + } + ] + }, + "request_body_spec": "{\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"properties\": {\n \"cursor\": {\n \"description\": \"The cursor to use for pagination.\",\n \"type\": \"string\",\n \"x-go-name\": \"Cursor\"\n },\n \"filter\": {\n \"properties\": {\n \"field\": {\n \"description\": \"The field for this filter. For allowed fields, see the documentation for\\n\\nthe specific endpoint you are using.\\n\\nFor non-compound filters (any operators other than \\\"and\\\" or \\\"or\\\"),\\n\\nField must be set, along with either Value or Values, depending on the operator.\",\n \"type\": \"string\",\n \"x-go-name\": \"Field\"\n },\n \"operator\": {\n \"description\": \"The operator for this filter.\\n\\n* equals FilterOperatorEquals Matches objects that are exactly equal to the value in the field.\\n\\n* not_equals FilterOperatorNotEquals Matches objects that are not exactly equal to the value in the field.\\n\\n* contains FilterOperatorContains For a multi-valued field, such as tags, this operator will match objects that contain any of the values in the field.\\n\\n* does_not_contain FilterOperatorDoesNotContain For a multi-valued field, such as tags, this operator will match objects that do not contain any of the values in the field.\\n\\n* in FilterOperatorIn Matches objects if the field is one of several possible values, as specified in the values array.\\n\\n* not_in FilterOperatorNotIn Matches objects if the field is none of several possible values, as specified in the values array.\\n\\n* and FilterOperatorAnd Matches objects only if all subfilters match.\\n\\n* or FilterOperatorOr Matches objects if any subfilter matches.\\n\\n* time_is_after FilterOperatorTimeIsAfter Matches objects if the field is after the given time.\\n\\n* time_is_before FilterOperatorTimeIsBefore Matches objects if the field is before the given time.\\n\\n* time_range FilterOperatorTimeRange Matches objects if the field is between the given times.\\n\\n* string_contains FilterOperatorStringContains Matches objects if the field contains the given string.\\n\\n* string_does_not_contain FilterOperatorStringDoesNotContain Matches objects if the field does not contain the given string.\\n\\n* is_set FilterOperatorIsSet FilterOperatorIsSet matches objects if the field is set.\\n\\n* is_unset FilterOperatorIsUnset FilterOperatorIsUnset matches objects if the field is unset.\",\n \"enum\": [\n \"equals\",\n \"not_equals\",\n \"contains\",\n \"does_not_contain\",\n \"in\",\n \"not_in\",\n \"and\",\n \"or\",\n \"time_is_after\",\n \"time_is_before\",\n \"time_range\",\n \"string_contains\",\n \"string_does_not_contain\",\n \"is_set\",\n \"is_unset\"\n ],\n \"type\": \"string\",\n \"x-go-enum-desc\": \"equals FilterOperatorEquals Matches objects that are exactly equal to the value in the field.\\nnot_equals FilterOperatorNotEquals Matches objects that are not exactly equal to the value in the field.\\ncontains FilterOperatorContains For a multi-valued field, such as tags, this operator will match objects that contain any of the values in the field.\\ndoes_not_contain FilterOperatorDoesNotContain For a multi-valued field, such as tags, this operator will match objects that do not contain any of the values in the field.\\nin FilterOperatorIn Matches objects if the field is one of several possible values, as specified in the values array.\\nnot_in FilterOperatorNotIn Matches objects if the field is none of several possible values, as specified in the values array.\\nand FilterOperatorAnd Matches objects only if all subfilters match.\\nor FilterOperatorOr Matches objects if any subfilter matches.\\ntime_is_after FilterOperatorTimeIsAfter Matches objects if the field is after the given time.\\ntime_is_before FilterOperatorTimeIsBefore Matches objects if the field is before the given time.\\ntime_range FilterOperatorTimeRange Matches objects if the field is between the given times.\\nstring_contains FilterOperatorStringContains Matches objects if the field contains the given string.\\nstring_does_not_contain FilterOperatorStringDoesNotContain Matches objects if the field does not contain the given string.\\nis_set FilterOperatorIsSet FilterOperatorIsSet matches objects if the field is set.\\nis_unset FilterOperatorIsUnset FilterOperatorIsUnset matches objects if the field is unset.\",\n \"x-go-name\": \"Operator\"\n },\n \"subfilters\": {\n \"description\": \"Sub-filters for this filter. Valid only when operator is \\\"and\\\" or \\\"or\\\".\\n\\nThe maximum allowed depth for a tree of filters is 3.\",\n \"items\": {\n \"$ref\": \"#/components/schemas/Filter\",\n \"has_circular_reference\": true\n },\n \"type\": \"array\",\n \"x-go-name\": \"Subfilters\"\n },\n \"value\": {\n \"description\": \"The value for this filter. Only used for single-valued operators\\n\\n(\\\"equals\\\", \\\"not_equals\\\", \\\"contains\\\", \\\"does_not_contain\\\")\",\n \"type\": \"string\",\n \"x-go-name\": \"Value\"\n },\n \"values\": {\n \"description\": \"The values for this filter. Only used for multi-valued operators (\\\"in\\\", \\\"not_in\\\").\",\n \"items\": {\n \"type\": \"string\"\n },\n \"type\": \"array\",\n \"x-go-name\": \"Values\"\n }\n },\n \"required\": [\n \"field\",\n \"operator\"\n ],\n \"type\": \"object\",\n \"x-go-package\": \"pylon/api/apiserver/apitypes\"\n },\n \"limit\": {\n \"description\": \"The number of issues to fetch. Defaults to 100. Must be greater than 0 and less than 1000.\",\n \"format\": \"int64\",\n \"type\": \"integer\",\n \"x-go-name\": \"Limit\"\n }\n },\n \"required\": [\n \"filter\"\n ],\n \"type\": \"object\",\n \"x-go-package\": \"pylon/api/apiserver/endpoints\"\n }\n }\n },\n \"required\": false\n}", + "use_request_body_schema_mode": true, + "validate_request_body_schema": false, + "use_flatten_mode": false + }, + { + "name": "DeleteIssue", + "selected_for_wrapping": false, + "spec_built": true, + "wrap_finished": true, + "should_skip": false, + "skip_reason": null, + "wrapper_tool": { + "name": "delete_issue", + "description": { + "tagline": "Delete an existing issue by ID.", + "detailed": "Use this tool to delete an issue from the system by providing its ID. It is ideal for scenarios where issues need to be managed or cleaned up." + }, + "return_annotation": "Confirmation of issue deletion.", + "arguments": [ + { + "name": "issue_id", + "alternative_names": [ + "issue_identifier", + "issue_key" + ], + "description": "The unique identifier of the issue to delete.", + "endpoint_argument_name": "id" + } + ] + }, + "method": "DELETE", + "path": "/issues/{id}", + "tags": [ + "issues" + ], + "summary": "", + "description": "Delete an existing issue", + "requires_security": true, + "oauth_scopes": [], + "security_schemes": [ + "bearerAuth" + ], + "parameters": { + "query": [], + "path": [ + { + "name": "id", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The ID of the issue to delete." + }, + "description": "The ID of the issue to delete.", + "required": true, + "deprecated": false, + "default": null, + "location": "path", + "content_type": null, + "json_schema": { + "type": "string" + }, + "schema_required": false + } + ], + "header": [], + "cookie": [], + "body": [] + }, + "request_body_spec": null, + "use_request_body_schema_mode": false, + "validate_request_body_schema": false, + "use_flatten_mode": false + }, + { + "name": "GetIssue", + "selected_for_wrapping": false, + "spec_built": true, + "wrap_finished": true, + "should_skip": false, + "skip_reason": null, + "wrapper_tool": { + "name": "get_issue_by_id", + "description": { + "tagline": "Retrieve issue details using its ID or number.", + "detailed": "Use this tool to access details of an issue by providing its specific ID or number. Ideal for tasks requiring detailed issue information retrieval in issue tracking systems." + }, + "return_annotation": "Information about the specific issue requested.", + "arguments": [ + { + "name": "issue_id", + "alternative_names": [ + "issue_number", + "issue_identifier" + ], + "description": "The unique ID or number of the issue you want to retrieve.", + "endpoint_argument_name": "id" + } + ] + }, + "method": "GET", + "path": "/issues/{id}", + "tags": [ + "issues" + ], + "summary": "", + "description": "Get an issue by its ID/number", + "requires_security": true, + "oauth_scopes": [], + "security_schemes": [ + "bearerAuth" + ], + "parameters": { + "query": [], + "path": [ + { + "name": "id", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The ID or number of the issue to fetch." + }, + "description": "The ID or number of the issue to fetch.", + "required": true, + "deprecated": false, + "default": null, + "location": "path", + "content_type": null, + "json_schema": { + "type": "string" + }, + "schema_required": false + } + ], + "header": [], + "cookie": [], + "body": [] + }, + "request_body_spec": null, + "use_request_body_schema_mode": false, + "validate_request_body_schema": false, + "use_flatten_mode": false + }, + { + "name": "UpdateIssue", + "selected_for_wrapping": false, + "spec_built": true, + "wrap_finished": true, + "should_skip": false, + "skip_reason": null, + "wrapper_tool": { + "name": "update_issue", + "description": { + "tagline": "Update details of an existing issue.", + "detailed": "Use this tool to modify information for an already existing issue when changes or corrections are needed." + }, + "return_annotation": "Confirmation of the issue update.", + "arguments": [ + { + "name": "issue_id", + "alternative_names": [ + "issue_identifier", + "ticket_id" + ], + "description": "The ID of the issue to update. This should be a string representing the unique identifier for the issue.", + "endpoint_argument_name": "id" + }, + { + "name": "issue_update_details", + "alternative_names": [ + "update_issue_data", + "alter_issue_content" + ], + "description": "JSON object containing details to update an issue such as account_id, assignee_id, custom_fields, customer_portal_visible, requester_id, state, tags, and team_id.", + "endpoint_argument_name": "requestBody" + } + ] + }, + "method": "PATCH", + "path": "/issues/{id}", + "tags": [ + "issues" + ], + "summary": "", + "description": "Update an existing issue", + "requires_security": true, + "oauth_scopes": [], + "security_schemes": [ + "bearerAuth" + ], + "parameters": { + "query": [], + "path": [ + { + "name": "id", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The ID of the issue to update." + }, + "description": "The ID of the issue to update.", + "required": true, + "deprecated": false, + "default": null, + "location": "path", + "content_type": null, + "json_schema": { + "type": "string" + }, + "schema_required": false + } + ], + "header": [], + "cookie": [], + "body": [ + { + "name": "requestBody", + "value_schema": { + "val_type": "json", + "inner_val_type": null, + "enum": null, + "properties": { + "account_id": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The ID of the account that this issue belongs to. Only supported on issues with source: [\"manual\", \"form\", \"email\"]." + }, + "assignee_id": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The ID of the user who should be assigned to this issue. If empty string is passed in, the issue assignee will be removed." + }, + "custom_fields": { + "val_type": "array", + "inner_val_type": "json", + "enum": null, + "properties": null, + "inner_properties": { + "slug": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The slug of the custom field." + }, + "value": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The value of the custom field. Only to be used for single-valued custom fields. If unset, the custom field will be unset. If the custom field is a select field, the value must be the select option slug, which you can find from the GET /custom-fields endpoint." + }, + "values": { + "val_type": "array", + "inner_val_type": "string", + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The values of the custom field. Only to be used for multi-valued custom fields (ex. multiselect). If unset, the custom field will be unset. If the custom field is a multiselect field, the values must be the select option slugs which you can find from the GET /custom-fields endpoint." + } + }, + "description": "An array of custom fields to be used on this issue. Only passed in fields will be modified." + }, + "customer_portal_visible": { + "val_type": "boolean", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "Whether the issue should be visible in the customer portal." + }, + "requester_id": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The ID of the requester that this issue is on behalf of." + }, + "requestor_id": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "Deprecated: Use requester_id instead." + }, + "state": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The state this issue should be moved to. Can be one of new, waiting_on_you, waiting_on_customer, on_hold, closed, or a custom status." + }, + "tags": { + "val_type": "array", + "inner_val_type": "string", + "enum": null, + "properties": null, + "inner_properties": null, + "description": "An array of strings to use as tags on this issue. If provided, the issue tags will be updated to be exactly the given tags." + }, + "team_id": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The ID of the team this issue should be assigned to. If empty string is passed in, any assigned team will be removed." + } + }, + "inner_properties": null, + "description": "" + }, + "description": "", + "required": false, + "deprecated": false, + "default": null, + "location": "body", + "content_type": "application/json", + "json_schema": { + "type": "object", + "properties": { + "account_id": { + "type": "string", + "description": "The ID of the account that this issue belongs to. Only supported on issues with source: [\"manual\", \"form\", \"email\"]." + }, + "assignee_id": { + "type": "string", + "description": "The ID of the user who should be assigned to this issue. If empty string is passed in, the issue assignee will be removed." + }, + "custom_fields": { + "type": "array", + "description": "An array of custom fields to be used on this issue. Only passed in fields will be modified.", + "items": { + "type": "object", + "properties": { + "slug": { + "type": "string", + "description": "The slug of the custom field." + }, + "value": { + "type": "string", + "description": "The value of the custom field. Only to be used for single-valued custom fields. If unset, the custom field will be unset. If the custom field is a select field, the value must be the select option slug, which you can find from the GET /custom-fields endpoint." + }, + "values": { + "type": "array", + "description": "The values of the custom field. Only to be used for multi-valued custom fields (ex. multiselect). If unset, the custom field will be unset. If the custom field is a multiselect field, the values must be the select option slugs which you can find from the GET /custom-fields endpoint.", + "items": { + "type": "string" + } + } + } + } + }, + "customer_portal_visible": { + "type": "boolean", + "description": "Whether the issue should be visible in the customer portal." + }, + "requester_id": { + "type": "string", + "description": "The ID of the requester that this issue is on behalf of." + }, + "requestor_id": { + "type": "string", + "description": "Deprecated: Use requester_id instead." + }, + "state": { + "type": "string", + "description": "The state this issue should be moved to. Can be one of new, waiting_on_you, waiting_on_customer, on_hold, closed, or a custom status." + }, + "tags": { + "type": "array", + "description": "An array of strings to use as tags on this issue. If provided, the issue tags will be updated to be exactly the given tags.", + "items": { + "type": "string" + } + }, + "team_id": { + "type": "string", + "description": "The ID of the team this issue should be assigned to. If empty string is passed in, any assigned team will be removed." + } + } + }, + "schema_required": false + } + ] + }, + "request_body_spec": "{\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"properties\": {\n \"account_id\": {\n \"description\": \"The ID of the account that this issue belongs to. Only supported on issues with source: [\\\"manual\\\", \\\"form\\\", \\\"email\\\"].\",\n \"type\": \"string\",\n \"x-go-name\": \"AccountID\"\n },\n \"assignee_id\": {\n \"description\": \"The ID of the user who should be assigned to this issue. If empty string is passed in, the issue assignee will be removed.\",\n \"type\": \"string\",\n \"x-go-name\": \"AssigneeID\"\n },\n \"custom_fields\": {\n \"description\": \"An array of custom fields to be used on this issue. Only passed in fields will be modified.\",\n \"items\": {\n \"properties\": {\n \"slug\": {\n \"description\": \"The slug of the custom field.\",\n \"type\": \"string\",\n \"x-go-name\": \"Slug\"\n },\n \"value\": {\n \"description\": \"The value of the custom field. Only to be used for single-valued custom fields. If unset, the custom field will be unset. If the custom field is a select field, the value must be the select option slug, which you can find from the GET /custom-fields endpoint.\",\n \"type\": \"string\",\n \"x-go-name\": \"Value\"\n },\n \"values\": {\n \"description\": \"The values of the custom field. Only to be used for multi-valued custom fields (ex. multiselect). If unset, the custom field will be unset. If the custom field is a multiselect field, the values must be the select option slugs which you can find from the GET /custom-fields endpoint.\",\n \"items\": {\n \"type\": \"string\"\n },\n \"type\": \"array\",\n \"x-go-name\": \"Values\"\n }\n },\n \"type\": \"object\",\n \"x-go-package\": \"pylon/api/apiserver/apitypes\"\n },\n \"type\": \"array\",\n \"x-go-name\": \"CustomFields\"\n },\n \"customer_portal_visible\": {\n \"description\": \"Whether the issue should be visible in the customer portal.\",\n \"type\": \"boolean\",\n \"x-go-name\": \"CustomerPortalVisible\"\n },\n \"requester_id\": {\n \"description\": \"The ID of the requester that this issue is on behalf of.\",\n \"type\": \"string\",\n \"x-go-name\": \"RequesterID\"\n },\n \"requestor_id\": {\n \"description\": \"Deprecated: Use requester_id instead.\",\n \"type\": \"string\",\n \"x-go-name\": \"RequestorID\"\n },\n \"state\": {\n \"description\": \"The state this issue should be moved to. Can be one of new, waiting_on_you, waiting_on_customer, on_hold, closed, or a custom status.\",\n \"type\": \"string\",\n \"x-go-name\": \"State\"\n },\n \"tags\": {\n \"description\": \"An array of strings to use as tags on this issue. If provided, the issue tags will be updated to be exactly the given tags.\",\n \"items\": {\n \"type\": \"string\"\n },\n \"type\": \"array\",\n \"x-go-name\": \"Tags\"\n },\n \"team_id\": {\n \"description\": \"The ID of the team this issue should be assigned to. If empty string is passed in, any assigned team will be removed.\",\n \"type\": \"string\",\n \"x-go-name\": \"TeamID\"\n }\n },\n \"type\": \"object\",\n \"x-go-package\": \"pylon/api/apiserver/endpoints\"\n }\n }\n },\n \"required\": false\n}", + "use_request_body_schema_mode": true, + "validate_request_body_schema": true, + "use_flatten_mode": false + }, + { + "name": "CreateIssueAIResponse", + "selected_for_wrapping": false, + "spec_built": true, + "wrap_finished": true, + "should_skip": false, + "skip_reason": null, + "wrapper_tool": { + "name": "create_ai_response_for_issue", + "description": { + "tagline": "Generate an AI response for a specific issue.", + "detailed": "This tool creates an AI-generated response for a given issue by specifying the issue ID. It should be called when an automated response is required for issue resolution or documentation." + }, + "return_annotation": "AI-generated response for a specified issue.", + "arguments": [ + { + "name": "issue_id", + "alternative_names": [ + "issue_number", + "ticket_id" + ], + "description": "The unique ID or number of the issue for which an AI response is required.", + "endpoint_argument_name": "id" + }, + { + "name": "ai_response_request_body", + "alternative_names": [ + "response_creation_payload", + "issue_response_details" + ], + "description": "JSON object containing the AI agent ID and a flag to post the response as an internal note. Includes `ai_agent_id` (string) and `post_as_internal_note` (boolean).", + "endpoint_argument_name": "requestBody" + } + ] + }, + "method": "POST", + "path": "/issues/{id}/ai-response", + "tags": [ + "issues" + ], + "summary": "", + "description": "Create an AI response for an issue", + "requires_security": true, + "oauth_scopes": [], + "security_schemes": [ + "bearerAuth" + ], + "parameters": { + "query": [], + "path": [ + { + "name": "id", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The ID or number of the issue to create an AI response for." + }, + "description": "The ID or number of the issue to create an AI response for.", + "required": true, + "deprecated": false, + "default": null, + "location": "path", + "content_type": null, + "json_schema": { + "type": "string" + }, + "schema_required": false + } + ], + "header": [], + "cookie": [], + "body": [ + { + "name": "requestBody", + "value_schema": { + "val_type": "json", + "inner_val_type": null, + "enum": null, + "properties": { + "ai_agent_id": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The ID of the AI agent to use to create the AI response." + }, + "post_as_internal_note": { + "val_type": "boolean", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "Whether to post the AI response as an internal note on the issue." + } + }, + "inner_properties": null, + "description": "" + }, + "description": "", + "required": false, + "deprecated": false, + "default": null, + "location": "body", + "content_type": "application/json", + "json_schema": { + "type": "object", + "properties": { + "ai_agent_id": { + "type": "string", + "description": "The ID of the AI agent to use to create the AI response." + }, + "post_as_internal_note": { + "type": "boolean", + "description": "Whether to post the AI response as an internal note on the issue." + } + }, + "required": [ + "ai_agent_id" + ] + }, + "schema_required": false + } + ] + }, + "request_body_spec": "{\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"properties\": {\n \"ai_agent_id\": {\n \"description\": \"The ID of the AI agent to use to create the AI response.\",\n \"type\": \"string\",\n \"x-go-name\": \"AIAgentID\"\n },\n \"post_as_internal_note\": {\n \"description\": \"Whether to post the AI response as an internal note on the issue.\",\n \"type\": \"boolean\",\n \"x-go-name\": \"PostAsInternalNote\"\n }\n },\n \"required\": [\n \"ai_agent_id\"\n ],\n \"type\": \"object\",\n \"x-go-package\": \"pylon/api/apiserver/endpoints\"\n }\n }\n },\n \"required\": false\n}", + "use_request_body_schema_mode": true, + "validate_request_body_schema": true, + "use_flatten_mode": false + }, + { + "name": "LinkExternalIssue", + "selected_for_wrapping": false, + "spec_built": true, + "wrap_finished": true, + "should_skip": false, + "skip_reason": null, + "wrapper_tool": { + "name": "link_external_issue", + "description": { + "tagline": "Link or unlink external issues to an internal issue.", + "detailed": "Use this tool to link external issues to an internal issue or unlink them by specifying the operation type. Ideal for managing issue relationships between different systems." + }, + "return_annotation": "Status of linking or unlinking external issues.", + "arguments": [ + { + "name": "issue_identifier", + "alternative_names": [ + "issue_id", + "issue_number" + ], + "description": "The unique ID or number of the internal issue to which external issues should be linked or unlinked.", + "endpoint_argument_name": "id" + }, + { + "name": "external_issue_details", + "alternative_names": [ + "issue_link_data", + "external_issue_info" + ], + "description": "JSON object containing details of the external issue, including `external_issue_id`, `operation` (link/unlink), and `source` system.", + "endpoint_argument_name": "requestBody" + } + ] + }, + "method": "POST", + "path": "/issues/{id}/external-issues", + "tags": [ + "issues" + ], + "summary": "Link or unlink external issues to/from an issue.", + "description": "By default, links external issues. To unlink issues, set the operation field to \"unlink\".", + "requires_security": true, + "oauth_scopes": [], + "security_schemes": [ + "bearerAuth" + ], + "parameters": { + "query": [], + "path": [ + { + "name": "id", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The ID or number of the issue to link external issues to." + }, + "description": "The ID or number of the issue to link external issues to.", + "required": true, + "deprecated": false, + "default": null, + "location": "path", + "content_type": null, + "json_schema": { + "type": "string" + }, + "schema_required": false + } + ], + "header": [], + "cookie": [], + "body": [ + { + "name": "requestBody", + "value_schema": { + "val_type": "json", + "inner_val_type": null, + "enum": null, + "properties": { + "external_issue_id": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The ID of the external issue in the source system." + }, + "operation": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "Operation to perform. Use \"link\" to link issues (default) or \"unlink\" to unlink issues." + }, + "source": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The source system of the external issue (e.g., \"linear\", \"asana\", \"jira\", \"github\")." + } + }, + "inner_properties": null, + "description": "" + }, + "description": "", + "required": false, + "deprecated": false, + "default": null, + "location": "body", + "content_type": "application/json", + "json_schema": { + "type": "object", + "properties": { + "external_issue_id": { + "type": "string", + "description": "The ID of the external issue in the source system." + }, + "operation": { + "type": "string", + "description": "Operation to perform. Use \"link\" to link issues (default) or \"unlink\" to unlink issues." + }, + "source": { + "type": "string", + "description": "The source system of the external issue (e.g., \"linear\", \"asana\", \"jira\", \"github\")." + } + }, + "required": [ + "external_issue_id", + "source" + ] + }, + "schema_required": false + } + ] + }, + "request_body_spec": "{\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"properties\": {\n \"external_issue_id\": {\n \"description\": \"The ID of the external issue in the source system.\",\n \"type\": \"string\",\n \"x-go-name\": \"ExternalIssueID\"\n },\n \"operation\": {\n \"description\": \"Operation to perform. Use \\\"link\\\" to link issues (default) or \\\"unlink\\\" to unlink issues.\",\n \"type\": \"string\",\n \"x-go-name\": \"Operation\"\n },\n \"source\": {\n \"description\": \"The source system of the external issue (e.g., \\\"linear\\\", \\\"asana\\\", \\\"jira\\\", \\\"github\\\").\",\n \"type\": \"string\",\n \"x-go-name\": \"Source\"\n }\n },\n \"required\": [\n \"external_issue_id\",\n \"source\"\n ],\n \"type\": \"object\",\n \"x-go-package\": \"pylon/api/apiserver/endpoints\"\n }\n }\n },\n \"required\": false\n}", + "use_request_body_schema_mode": true, + "validate_request_body_schema": true, + "use_flatten_mode": false + }, + { + "name": "GetIssueFollowers", + "selected_for_wrapping": false, + "spec_built": true, + "wrap_finished": true, + "should_skip": false, + "skip_reason": null, + "wrapper_tool": { + "name": "get_issue_followers", + "description": { + "tagline": "Get followers of a specific issue to manage participation.", + "detailed": "This tool retrieves the list of users who are following a specified issue. Use this tool when you need to know who is engaging with or interested in updates about an issue." + }, + "return_annotation": "List of followers for the specified issue.", + "arguments": [ + { + "name": "issue_id", + "alternative_names": [ + "issue_number", + "issue_identifier" + ], + "description": "The unique ID or number of the issue to retrieve followers for.", + "endpoint_argument_name": "id" + } + ] + }, + "method": "GET", + "path": "/issues/{id}/followers", + "tags": [ + "issues" + ], + "summary": "", + "description": "Get followers of an issue", + "requires_security": true, + "oauth_scopes": [], + "security_schemes": [ + "bearerAuth" + ], + "parameters": { + "query": [], + "path": [ + { + "name": "id", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The ID or number of the issue to get followers for." + }, + "description": "The ID or number of the issue to get followers for.", + "required": true, + "deprecated": false, + "default": null, + "location": "path", + "content_type": null, + "json_schema": { + "type": "string" + }, + "schema_required": false + } + ], + "header": [], + "cookie": [], + "body": [] + }, + "request_body_spec": null, + "use_request_body_schema_mode": false, + "validate_request_body_schema": false, + "use_flatten_mode": false + }, + { + "name": "AddIssueFollowers", + "selected_for_wrapping": false, + "spec_built": true, + "wrap_finished": true, + "should_skip": false, + "skip_reason": null, + "wrapper_tool": { + "name": "update_issue_followers", + "description": { + "tagline": "Add or remove followers for an issue.", + "detailed": "This tool allows you to add or remove followers to a specific issue. Use it when managing the users who should receive notifications about updates on an issue. Set the operation field to \"remove\" to remove followers." + }, + "return_annotation": "Confirmation of follower update status.", + "arguments": [ + { + "name": "issue_id", + "alternative_names": [ + "issue_number", + "ticket_id" + ], + "description": "The ID or number of the issue to add or remove followers from.", + "endpoint_argument_name": "id" + }, + { + "name": "contact_ids_to_add", + "alternative_names": [ + "contact_followers_ids", + "add_contact_follower_ids" + ], + "description": "An array of contact IDs to add as followers to the issue. Each ID should be a string.", + "endpoint_argument_name": "contact_ids" + }, + { + "name": "update_operation", + "alternative_names": [ + "operation_type", + "follower_action" + ], + "description": "Specify 'add' to add followers or 'remove' to remove them.", + "endpoint_argument_name": "operation" + }, + { + "name": "user_ids_to_add_as_followers", + "alternative_names": [ + "user_ids_for_followers", + "add_user_followers" + ], + "description": "List of user IDs to add as followers to a specific issue.", + "endpoint_argument_name": "user_ids" + } + ] + }, + "method": "POST", + "path": "/issues/{id}/followers", + "tags": [ + "issues" + ], + "summary": "Add or remove followers to/from an issue.", + "description": "By default, adds followers. To remove followers, set the operation field to \"remove\".", + "requires_security": true, + "oauth_scopes": [], + "security_schemes": [ + "bearerAuth" + ], + "parameters": { + "query": [], + "path": [ + { + "name": "id", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The ID or number of the issue to add followers to." + }, + "description": "The ID or number of the issue to add followers to.", + "required": true, + "deprecated": false, + "default": null, + "location": "path", + "content_type": null, + "json_schema": { + "type": "string" + }, + "schema_required": false + } + ], + "header": [], + "cookie": [], + "body": [ + { + "name": "contact_ids", + "value_schema": { + "val_type": "array", + "inner_val_type": "string", + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The IDs of contacts to add as followers." + }, + "description": "The IDs of contacts to add as followers.", + "required": false, + "deprecated": false, + "default": null, + "location": "body", + "content_type": "application/json", + "json_schema": { + "type": "array", + "description": "The IDs of contacts to add as followers.", + "items": { + "type": "string" + } + }, + "schema_required": false + }, + { + "name": "operation", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "Operation to perform. Use \"add\" to add followers (default) or \"remove\" to remove followers." + }, + "description": "Operation to perform. Use \"add\" to add followers (default) or \"remove\" to remove followers.", + "required": false, + "deprecated": false, + "default": null, + "location": "body", + "content_type": "application/json", + "json_schema": { + "type": "string", + "description": "Operation to perform. Use \"add\" to add followers (default) or \"remove\" to remove followers." + }, + "schema_required": false + }, + { + "name": "user_ids", + "value_schema": { + "val_type": "array", + "inner_val_type": "string", + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The IDs of users to add as followers." + }, + "description": "The IDs of users to add as followers.", + "required": false, + "deprecated": false, + "default": null, + "location": "body", + "content_type": "application/json", + "json_schema": { + "type": "array", + "description": "The IDs of users to add as followers.", + "items": { + "type": "string" + } + }, + "schema_required": false + } + ] + }, + "request_body_spec": "{\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"properties\": {\n \"contact_ids\": {\n \"description\": \"The IDs of contacts to add as followers.\",\n \"items\": {\n \"type\": \"string\"\n },\n \"type\": \"array\",\n \"x-go-name\": \"ContactIDs\"\n },\n \"operation\": {\n \"description\": \"Operation to perform. Use \\\"add\\\" to add followers (default) or \\\"remove\\\" to remove followers.\",\n \"type\": \"string\",\n \"x-go-name\": \"Operation\"\n },\n \"user_ids\": {\n \"description\": \"The IDs of users to add as followers.\",\n \"items\": {\n \"type\": \"string\"\n },\n \"type\": \"array\",\n \"x-go-name\": \"UserIDs\"\n }\n },\n \"type\": \"object\",\n \"x-go-package\": \"pylon/api/apiserver/endpoints\"\n }\n }\n },\n \"required\": false\n}", + "use_request_body_schema_mode": false, + "validate_request_body_schema": false, + "use_flatten_mode": true + }, + { + "name": "GetIssueMessages", + "selected_for_wrapping": false, + "spec_built": true, + "wrap_finished": true, + "should_skip": false, + "skip_reason": null, + "wrapper_tool": { + "name": "get_issue_messages", + "description": { + "tagline": "Retrieve messages for a specific issue.", + "detailed": "This tool is used to obtain all messages associated with a particular issue, identified by its ID." + }, + "return_annotation": "Messages related to a specific issue.", + "arguments": [ + { + "name": "issue_id", + "alternative_names": [ + "issue_identifier", + "ticket_id" + ], + "description": "The unique ID of the issue for which to retrieve messages.", + "endpoint_argument_name": "id" + } + ] + }, + "method": "GET", + "path": "/issues/{id}/messages", + "tags": [ + "messages" + ], + "summary": "", + "description": "Get messages for an issue", + "requires_security": true, + "oauth_scopes": [], + "security_schemes": [ + "bearerAuth" + ], + "parameters": { + "query": [], + "path": [ + { + "name": "id", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The ID of the issue to fetch messages for." + }, + "description": "The ID of the issue to fetch messages for.", + "required": true, + "deprecated": false, + "default": null, + "location": "path", + "content_type": null, + "json_schema": { + "type": "string" + }, + "schema_required": false + } + ], + "header": [], + "cookie": [], + "body": [] + }, + "request_body_spec": null, + "use_request_body_schema_mode": false, + "validate_request_body_schema": false, + "use_flatten_mode": false + }, + { + "name": "RedactMessage", + "selected_for_wrapping": false, + "spec_built": true, + "wrap_finished": true, + "should_skip": false, + "skip_reason": null, + "wrapper_tool": { + "name": "redact_message", + "description": { + "tagline": "Removes or hides the content of a specified message.", + "detailed": "Use this tool to redact (remove or hide) the content of a message identified by a specific message ID within an issue. This is useful for maintaining privacy or correcting errors." + }, + "return_annotation": "Confirmation that the message has been redacted.", + "arguments": [ + { + "name": "issue_id", + "alternative_names": [ + "issue_identifier", + "ticket_id" + ], + "description": "The ID of the issue associated with the message to be redacted.", + "endpoint_argument_name": "id" + }, + { + "name": "message_id", + "alternative_names": [ + "message_identifier", + "msg_id" + ], + "description": "The unique identifier of the message to be redacted.", + "endpoint_argument_name": "message_id" + } + ] + }, + "method": "POST", + "path": "/issues/{id}/messages/{message_id}/redact", + "tags": [ + "messages" + ], + "summary": "", + "description": "Redact a message", + "requires_security": true, + "oauth_scopes": [], + "security_schemes": [ + "bearerAuth" + ], + "parameters": { + "query": [], + "path": [ + { + "name": "id", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The ID of the issue that the message belongs to." + }, + "description": "The ID of the issue that the message belongs to.", + "required": true, + "deprecated": false, + "default": null, + "location": "path", + "content_type": null, + "json_schema": { + "type": "string" + }, + "schema_required": false + }, + { + "name": "message_id", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The ID of the message to redact." + }, + "description": "The ID of the message to redact.", + "required": true, + "deprecated": false, + "default": null, + "location": "path", + "content_type": null, + "json_schema": { + "type": "string" + }, + "schema_required": false + } + ], + "header": [], + "cookie": [], + "body": [] + }, + "request_body_spec": null, + "use_request_body_schema_mode": false, + "validate_request_body_schema": false, + "use_flatten_mode": false + }, + { + "name": "CreateIssueNote", + "selected_for_wrapping": false, + "spec_built": true, + "wrap_finished": true, + "should_skip": false, + "skip_reason": null, + "wrapper_tool": { + "name": "create_issue_note", + "description": { + "tagline": "Creates a note on an issue to track additional details.", + "detailed": "This tool should be called when there's a need to add a note or comment to an existing issue to provide further information or updates." + }, + "return_annotation": "Confirmation of note creation on the issue.", + "arguments": [ + { + "name": "issue_id", + "alternative_names": [ + "issue_identifier", + "ticket_id" + ], + "description": "The unique identifier of the issue to which the note will be added.", + "endpoint_argument_name": "id" + }, + { + "name": "note_details_json", + "alternative_names": [ + "note_content_json", + "issue_note_payload" + ], + "description": "The JSON object containing note details like body_html, attachment_urls, message_id, thread_id, and user_id.", + "endpoint_argument_name": "requestBody" + } + ] + }, + "method": "POST", + "path": "/issues/{id}/note", + "tags": [ + "messages" + ], + "summary": "", + "description": "Creates a note on an issue", + "requires_security": true, + "oauth_scopes": [], + "security_schemes": [ + "bearerAuth" + ], + "parameters": { + "query": [], + "path": [ + { + "name": "id", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The ID of the issue." + }, + "description": "The ID of the issue.", + "required": true, + "deprecated": false, + "default": null, + "location": "path", + "content_type": null, + "json_schema": { + "type": "string" + }, + "schema_required": false + } + ], + "header": [], + "cookie": [], + "body": [ + { + "name": "requestBody", + "value_schema": { + "val_type": "json", + "inner_val_type": null, + "enum": null, + "properties": { + "attachment_urls": { + "val_type": "array", + "inner_val_type": "string", + "enum": null, + "properties": null, + "inner_properties": null, + "description": "An array of attachment URLs to attach to this issue." + }, + "body_html": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The body of the message in HTML." + }, + "message_id": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The ID of the message to reply to. This message must be an internal note. You can find this from the GET /issues/{id}/messages endpoint. Either this or thread_id must be provided." + }, + "thread_id": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The ID of the thread to post the note to. You can find this from the GET /issues/{id}/threads endpoint. Either this or message_id must be provided." + }, + "user_id": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "Optional user ID to post the message as. If not provided, the API token user will be used." + } + }, + "inner_properties": null, + "description": "" + }, + "description": "", + "required": false, + "deprecated": false, + "default": null, + "location": "body", + "content_type": "application/json", + "json_schema": { + "type": "object", + "properties": { + "attachment_urls": { + "type": "array", + "description": "An array of attachment URLs to attach to this issue.", + "items": { + "type": "string" + } + }, + "body_html": { + "type": "string", + "description": "The body of the message in HTML." + }, + "message_id": { + "type": "string", + "description": "The ID of the message to reply to. This message must be an internal note. You can find this from the GET /issues/{id}/messages endpoint. Either this or thread_id must be provided." + }, + "thread_id": { + "type": "string", + "description": "The ID of the thread to post the note to. You can find this from the GET /issues/{id}/threads endpoint. Either this or message_id must be provided." + }, + "user_id": { + "type": "string", + "description": "Optional user ID to post the message as. If not provided, the API token user will be used." + } + }, + "required": [ + "body_html" + ] + }, + "schema_required": false + } + ] + }, + "request_body_spec": "{\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"properties\": {\n \"attachment_urls\": {\n \"description\": \"An array of attachment URLs to attach to this issue.\",\n \"items\": {\n \"type\": \"string\"\n },\n \"type\": \"array\",\n \"x-go-name\": \"AttachmentURLs\"\n },\n \"body_html\": {\n \"description\": \"The body of the message in HTML.\",\n \"type\": \"string\",\n \"x-go-name\": \"BodyHTML\"\n },\n \"message_id\": {\n \"description\": \"The ID of the message to reply to. This message must be an internal note. You can find this from the GET /issues/{id}/messages endpoint. Either this or thread_id must be provided.\",\n \"type\": \"string\",\n \"x-go-name\": \"MessageID\"\n },\n \"thread_id\": {\n \"description\": \"The ID of the thread to post the note to. You can find this from the GET /issues/{id}/threads endpoint. Either this or message_id must be provided.\",\n \"type\": \"string\",\n \"x-go-name\": \"ThreadID\"\n },\n \"user_id\": {\n \"description\": \"Optional user ID to post the message as. If not provided, the API token user will be used.\",\n \"type\": \"string\",\n \"x-go-name\": \"UserID\"\n }\n },\n \"required\": [\n \"body_html\"\n ],\n \"type\": \"object\",\n \"x-go-package\": \"pylon/api/apiserver/endpoints\"\n }\n }\n },\n \"required\": false\n}", + "use_request_body_schema_mode": true, + "validate_request_body_schema": true, + "use_flatten_mode": false + }, + { + "name": "CreateIssueReply", + "selected_for_wrapping": false, + "spec_built": true, + "wrap_finished": true, + "should_skip": false, + "skip_reason": null, + "wrapper_tool": { + "name": "create_issue_reply", + "description": { + "tagline": "Create a reply to an existing issue.", + "detailed": "Use this tool to add a comment or response to an existing issue when interaction or follow-up is required." + }, + "return_annotation": "Confirmation of issue reply creation.", + "arguments": [ + { + "name": "issue_id", + "alternative_names": [ + "problem_id", + "ticket_id" + ], + "description": "The unique identifier of the issue to which you want to reply.", + "endpoint_argument_name": "id" + }, + { + "name": "issue_reply_details", + "alternative_names": [ + "issue_reply_content", + "issue_comment_data" + ], + "description": "JSON object containing details like body_html, attachment URLs, and optional user or contact IDs for posting the reply. Also includes email information for cc, bcc, and to fields.", + "endpoint_argument_name": "requestBody" + } + ] + }, + "method": "POST", + "path": "/issues/{id}/reply", + "tags": [ + "messages" + ], + "summary": "", + "description": "Creates a reply to an existing issue", + "requires_security": true, + "oauth_scopes": [], + "security_schemes": [ + "bearerAuth" + ], + "parameters": { + "query": [], + "path": [ + { + "name": "id", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The ID of the issue." + }, + "description": "The ID of the issue.", + "required": true, + "deprecated": false, + "default": null, + "location": "path", + "content_type": null, + "json_schema": { + "type": "string" + }, + "schema_required": false + } + ], + "header": [], + "cookie": [], + "body": [ + { + "name": "requestBody", + "value_schema": { + "val_type": "json", + "inner_val_type": null, + "enum": null, + "properties": { + "attachment_urls": { + "val_type": "array", + "inner_val_type": "string", + "enum": null, + "properties": null, + "inner_properties": null, + "description": "An array of attachment URLs to attach to this issue." + }, + "body_html": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The body of the message in HTML." + }, + "contact_id": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "Optional contact ID to post the message as. Only one of user_id or contact_id can be provided." + }, + "email_info": { + "val_type": "json", + "inner_val_type": null, + "enum": null, + "properties": { + "bcc_emails": { + "val_type": "array", + "inner_val_type": "string", + "enum": null, + "properties": null, + "inner_properties": null, + "description": null + }, + "cc_emails": { + "val_type": "array", + "inner_val_type": "string", + "enum": null, + "properties": null, + "inner_properties": null, + "description": null + }, + "to_emails": { + "val_type": "array", + "inner_val_type": "string", + "enum": null, + "properties": null, + "inner_properties": null, + "description": null + } + }, + "inner_properties": null, + "description": null + }, + "message_id": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The ID of the message to reply to." + }, + "user_id": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "Optional user ID to post the message as. Only one of user_id or contact_id can be provided." + } + }, + "inner_properties": null, + "description": "" + }, + "description": "", + "required": false, + "deprecated": false, + "default": null, + "location": "body", + "content_type": "application/json", + "json_schema": { + "type": "object", + "properties": { + "attachment_urls": { + "type": "array", + "description": "An array of attachment URLs to attach to this issue.", + "items": { + "type": "string" + } + }, + "body_html": { + "type": "string", + "description": "The body of the message in HTML." + }, + "contact_id": { + "type": "string", + "description": "Optional contact ID to post the message as. Only one of user_id or contact_id can be provided." + }, + "email_info": { + "type": "object", + "properties": { + "bcc_emails": { + "type": "array", + "items": { + "type": "string" + } + }, + "cc_emails": { + "type": "array", + "items": { + "type": "string" + } + }, + "to_emails": { + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "message_id": { + "type": "string", + "description": "The ID of the message to reply to." + }, + "user_id": { + "type": "string", + "description": "Optional user ID to post the message as. Only one of user_id or contact_id can be provided." + } + }, + "required": [ + "body_html", + "message_id" + ] + }, + "schema_required": false + } + ] + }, + "request_body_spec": "{\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"properties\": {\n \"attachment_urls\": {\n \"description\": \"An array of attachment URLs to attach to this issue.\",\n \"items\": {\n \"type\": \"string\"\n },\n \"type\": \"array\",\n \"x-go-name\": \"AttachmentURLs\"\n },\n \"body_html\": {\n \"description\": \"The body of the message in HTML.\",\n \"type\": \"string\",\n \"x-go-name\": \"BodyHTML\"\n },\n \"contact_id\": {\n \"description\": \"Optional contact ID to post the message as. Only one of user_id or contact_id can be provided.\",\n \"type\": \"string\",\n \"x-go-name\": \"ContactID\"\n },\n \"email_info\": {\n \"properties\": {\n \"bcc_emails\": {\n \"items\": {\n \"type\": \"string\"\n },\n \"type\": \"array\",\n \"x-go-name\": \"BccEmails\"\n },\n \"cc_emails\": {\n \"items\": {\n \"type\": \"string\"\n },\n \"type\": \"array\",\n \"x-go-name\": \"CcEmails\"\n },\n \"to_emails\": {\n \"items\": {\n \"type\": \"string\"\n },\n \"type\": \"array\",\n \"x-go-name\": \"ToEmails\"\n }\n },\n \"type\": \"object\",\n \"x-go-package\": \"pylon/api/apiserver/endpoints\"\n },\n \"message_id\": {\n \"description\": \"The ID of the message to reply to.\",\n \"type\": \"string\",\n \"x-go-name\": \"MessageID\"\n },\n \"user_id\": {\n \"description\": \"Optional user ID to post the message as. Only one of user_id or contact_id can be provided.\",\n \"type\": \"string\",\n \"x-go-name\": \"UserID\"\n }\n },\n \"required\": [\n \"body_html\",\n \"message_id\"\n ],\n \"type\": \"object\",\n \"x-go-package\": \"pylon/api/apiserver/endpoints\"\n }\n }\n },\n \"required\": false\n}", + "use_request_body_schema_mode": true, + "validate_request_body_schema": true, + "use_flatten_mode": false + }, + { + "name": "SnoozeIssue", + "selected_for_wrapping": false, + "spec_built": true, + "wrap_finished": true, + "should_skip": false, + "skip_reason": null, + "wrapper_tool": { + "name": "snooze_issue", + "description": { + "tagline": "Temporarily pause notifications for an issue.", + "detailed": "Use this tool to snooze notifications for a specific issue temporarily. It is helpful when you want to focus elsewhere without getting alerts for the issue." + }, + "return_annotation": "Confirmation of issue snooze action.", + "arguments": [ + { + "name": "issue_id", + "alternative_names": [ + "issue_number", + "issue_identifier" + ], + "description": "The ID or number of the issue to snooze.", + "endpoint_argument_name": "id" + }, + { + "name": "snooze_until_datetime", + "alternative_names": [ + "pause_until", + "disable_notifications_until" + ], + "description": "The date and time to snooze the issue until, using the RFC3339 format.", + "endpoint_argument_name": "requestBody" + } + ] + }, + "method": "POST", + "path": "/issues/{id}/snooze", + "tags": [ + "issues" + ], + "summary": "", + "description": "Snooze an issue", + "requires_security": true, + "oauth_scopes": [], + "security_schemes": [ + "bearerAuth" + ], + "parameters": { + "query": [], + "path": [ + { + "name": "id", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The ID or number of the issue to snooze." + }, + "description": "The ID or number of the issue to snooze.", + "required": true, + "deprecated": false, + "default": null, + "location": "path", + "content_type": null, + "json_schema": { + "type": "string" + }, + "schema_required": false + } + ], + "header": [], + "cookie": [], + "body": [ + { + "name": "requestBody", + "value_schema": { + "val_type": "json", + "inner_val_type": null, + "enum": null, + "properties": { + "snooze_until": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The date and time to snooze the issue until. (RFC3339)" + } + }, + "inner_properties": null, + "description": "" + }, + "description": "", + "required": false, + "deprecated": false, + "default": null, + "location": "body", + "content_type": "application/json", + "json_schema": { + "type": "object", + "properties": { + "snooze_until": { + "type": "string", + "description": "The date and time to snooze the issue until. (RFC3339)" + } + }, + "required": [ + "snooze_until" + ] + }, + "schema_required": false + } + ] + }, + "request_body_spec": "{\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"properties\": {\n \"snooze_until\": {\n \"description\": \"The date and time to snooze the issue until. (RFC3339)\",\n \"type\": \"string\",\n \"x-go-name\": \"SnoozeUntil\"\n }\n },\n \"required\": [\n \"snooze_until\"\n ],\n \"type\": \"object\",\n \"x-go-package\": \"pylon/api/apiserver/endpoints\"\n }\n }\n },\n \"required\": false\n}", + "use_request_body_schema_mode": true, + "validate_request_body_schema": true, + "use_flatten_mode": false + }, + { + "name": "GetIssueThreads", + "selected_for_wrapping": false, + "spec_built": true, + "wrap_finished": true, + "should_skip": false, + "skip_reason": null, + "wrapper_tool": { + "name": "get_issue_threads", + "description": { + "tagline": "Retrieve threads for a specific issue.", + "detailed": "Call this tool to get all threads associated with a particular issue using its ID. Useful for tracking conversations or discussions related to an issue." + }, + "return_annotation": "Threads related to the specified issue.", + "arguments": [ + { + "name": "issue_id", + "alternative_names": [ + "issue_identifier", + "issue_reference_id" + ], + "description": "The unique ID of the issue for which threads need to be retrieved.", + "endpoint_argument_name": "id" + } + ] + }, + "method": "GET", + "path": "/issues/{id}/threads", + "tags": [ + "messages" + ], + "summary": "", + "description": "Get threads for an issue", + "requires_security": true, + "oauth_scopes": [], + "security_schemes": [ + "bearerAuth" + ], + "parameters": { + "query": [], + "path": [ + { + "name": "id", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The ID of the issue to fetch threads for." + }, + "description": "The ID of the issue to fetch threads for.", + "required": true, + "deprecated": false, + "default": null, + "location": "path", + "content_type": null, + "json_schema": { + "type": "string" + }, + "schema_required": false + } + ], + "header": [], + "cookie": [], + "body": [] + }, + "request_body_spec": null, + "use_request_body_schema_mode": false, + "validate_request_body_schema": false, + "use_flatten_mode": false + }, + { + "name": "CreateIssueThread", + "selected_for_wrapping": false, + "spec_built": true, + "wrap_finished": true, + "should_skip": false, + "skip_reason": null, + "wrapper_tool": { + "name": "create_issue_thread", + "description": { + "tagline": "Create an issue thread for an existing issue.", + "detailed": "Use this tool to initiate a discussion thread related to a specific issue by providing the issue ID. This helps in organizing conversations around particular issues efficiently." + }, + "return_annotation": "Details of the created issue thread.", + "arguments": [ + { + "name": "issue_id", + "alternative_names": [ + "issue_identifier", + "issue_reference" + ], + "description": "The ID for the issue you want to create a thread for. Required to link the thread to the correct issue.", + "endpoint_argument_name": "id" + }, + { + "name": "thread_name", + "alternative_names": [ + "discussion_title", + "conversation_title" + ], + "description": "The title or name of the thread to be created. This should be descriptive of the discussion purpose.", + "endpoint_argument_name": "name" + } + ] + }, + "method": "POST", + "path": "/issues/{id}/threads", + "tags": [ + "messages" + ], + "summary": "", + "description": "Create an issue thread for an issue", + "requires_security": true, + "oauth_scopes": [], + "security_schemes": [ + "bearerAuth" + ], + "parameters": { + "query": [], + "path": [ + { + "name": "id", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The ID of the issue to create a thread for." + }, + "description": "The ID of the issue to create a thread for.", + "required": true, + "deprecated": false, + "default": null, + "location": "path", + "content_type": null, + "json_schema": { + "type": "string" + }, + "schema_required": false + } + ], + "header": [], + "cookie": [], + "body": [ + { + "name": "name", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The name of the thread." + }, + "description": "The name of the thread.", + "required": false, + "deprecated": false, + "default": null, + "location": "body", + "content_type": "application/json", + "json_schema": { + "type": "string", + "description": "The name of the thread." + }, + "schema_required": false + } + ] + }, + "request_body_spec": "{\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"properties\": {\n \"name\": {\n \"description\": \"The name of the thread.\",\n \"type\": \"string\",\n \"x-go-name\": \"Name\"\n }\n },\n \"type\": \"object\",\n \"x-go-package\": \"pylon/api/apiserver/endpoints\"\n }\n }\n },\n \"required\": false\n}", + "use_request_body_schema_mode": false, + "validate_request_body_schema": false, + "use_flatten_mode": true + }, + { + "name": "GetKnowledgeBases", + "selected_for_wrapping": false, + "spec_built": true, + "wrap_finished": true, + "should_skip": false, + "skip_reason": null, + "wrapper_tool": { + "name": "get_knowledge_bases", + "description": { + "tagline": "Retrieve all available knowledge bases.", + "detailed": "This tool is called to get a list of all knowledge bases from the Pylon service." + }, + "return_annotation": "List of all available knowledge bases.", + "arguments": [] + }, + "method": "GET", + "path": "/knowledge-bases", + "tags": [ + "knowledge-bases" + ], + "summary": "", + "description": "Get all knowledge bases", + "requires_security": true, + "oauth_scopes": [], + "security_schemes": [ + "bearerAuth" + ], + "parameters": { + "query": [], + "path": [], + "header": [], + "cookie": [], + "body": [] + }, + "request_body_spec": null, + "use_request_body_schema_mode": false, + "validate_request_body_schema": false, + "use_flatten_mode": false + }, + { + "name": "GetKnowledgeBase", + "selected_for_wrapping": false, + "spec_built": true, + "wrap_finished": true, + "should_skip": false, + "skip_reason": null, + "wrapper_tool": { + "name": "get_knowledge_base_by_id", + "description": { + "tagline": "Retrieve a knowledge base using its ID.", + "detailed": "Use this tool to fetch information about a specific knowledge base by providing its ID." + }, + "return_annotation": "Details of the specified knowledge base.", + "arguments": [ + { + "name": "knowledge_base_id", + "alternative_names": [ + "knowledge_base_identifier", + "id_of_knowledge_base" + ], + "description": "The unique identifier for the knowledge base to be retrieved.", + "endpoint_argument_name": "id" + } + ] + }, + "method": "GET", + "path": "/knowledge-bases/{id}", + "tags": [ + "knowledge-bases" + ], + "summary": "", + "description": "Get a knowledge base by its ID", + "requires_security": true, + "oauth_scopes": [], + "security_schemes": [ + "bearerAuth" + ], + "parameters": { + "query": [], + "path": [ + { + "name": "id", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The ID of the knowledge base." + }, + "description": "The ID of the knowledge base.", + "required": true, + "deprecated": false, + "default": null, + "location": "path", + "content_type": null, + "json_schema": { + "type": "string" + }, + "schema_required": false + } + ], + "header": [], + "cookie": [], + "body": [] + }, + "request_body_spec": null, + "use_request_body_schema_mode": false, + "validate_request_body_schema": false, + "use_flatten_mode": false + }, + { + "name": "CreateArticle", + "selected_for_wrapping": false, + "spec_built": true, + "wrap_finished": true, + "should_skip": false, + "skip_reason": null, + "wrapper_tool": { + "name": "create_knowledge_base_article", + "description": { + "tagline": "Create and publish an article in a knowledge base.", + "detailed": "This tool allows the creation of a new article in a specified knowledge base, including optional translations. If the article is set to publish, translations will also be published." + }, + "return_annotation": "Details about the created article and its translations.", + "arguments": [ + { + "name": "knowledge_base_id", + "alternative_names": [ + "kb_identifier", + "knowledge_base_identifier" + ], + "description": "The unique identifier for the knowledge base where the article will be added.", + "endpoint_argument_name": "id" + }, + { + "name": "article_details", + "alternative_names": [ + "article_content", + "article_information" + ], + "description": "JSON object containing details of the article such as author ID, HTML body, title, and any translations. Includes configuration for publication, visibility, and access.", + "endpoint_argument_name": "requestBody" + } + ] + }, + "method": "POST", + "path": "/knowledge-bases/{id}/articles", + "tags": [ + "articles" + ], + "summary": "Create a new article", + "description": "This endpoint creates a new article in the specified knowledge base. If translations are provided, they will also be created and associated with the article. If the article is published, the translations will also be published.", + "requires_security": true, + "oauth_scopes": [], + "security_schemes": [ + "bearerAuth" + ], + "parameters": { + "query": [], + "path": [ + { + "name": "id", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The ID of the knowledge base the article is being added to." + }, + "description": "The ID of the knowledge base the article is being added to.", + "required": true, + "deprecated": false, + "default": null, + "location": "path", + "content_type": null, + "json_schema": { + "type": "string" + }, + "schema_required": false + } + ], + "header": [], + "cookie": [], + "body": [ + { + "name": "requestBody", + "value_schema": { + "val_type": "json", + "inner_val_type": null, + "enum": null, + "properties": { + "author_user_id": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The ID of the user attributed as the author of the article." + }, + "body_html": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The HTML body of the article." + }, + "collection_id": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The id of the collection associated to the article" + }, + "is_published": { + "val_type": "boolean", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "Whether the article should be published. Defaults to false." + }, + "is_unlisted": { + "val_type": "boolean", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "Whether the article can only be accessible only via direct link. Defaults to false." + }, + "slug": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The slug of the article. Defaults to a slug based on the title." + }, + "title": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The title of the article." + }, + "translations": { + "val_type": "array", + "inner_val_type": "json", + "enum": null, + "properties": null, + "inner_properties": { + "body_html": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The translated HTML body of the article." + }, + "language": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The language code of the translation. Supported language codes can be found in https://docs.usepylon.com/pylon-docs/knowledge-base/translation#supported-language-codes." + }, + "title": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The translated title of the article." + } + }, + "description": "Translations of the article content in different languages" + }, + "visibility_config": { + "val_type": "json", + "inner_val_type": null, + "enum": null, + "properties": { + "ai_agent_access": { + "val_type": "string", + "inner_val_type": null, + "enum": [ + "inherit", + "none", + "specific_agents" + ], + "properties": null, + "inner_properties": null, + "description": "AI agent access control for the article. Defaults to inherit from the parent scope when omitted.\n\n* inherit KnowledgeBaseArticleAIAgentAccessInherit Defers the access check to the parent object (Collection or KnowledgeBase).\n\n* none KnowledgeBaseArticleAIAgentAccessNone No AI agents have access to this article.\n\n* specific_agents KnowledgeBaseArticleAIAgentAccessSpecificAgents Only specific AI agents enumerated in the allowlist have access." + }, + "allowed_agent_ids": { + "val_type": "array", + "inner_val_type": "string", + "enum": null, + "properties": null, + "inner_properties": null, + "description": "List of AI agent IDs that may access this article when ai_agent_access is set to \"specific_agents\"." + }, + "customer_visibility_condition": { + "val_type": "json", + "inner_val_type": null, + "enum": null, + "properties": { + "field": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The field for this filter. For allowed fields, see the documentation for\n\nthe specific endpoint you are using.\n\nFor non-compound filters (any operators other than \"and\" or \"or\"),\n\nField must be set, along with either Value or Values, depending on the operator." + }, + "operator": { + "val_type": "string", + "inner_val_type": null, + "enum": [ + "equals", + "not_equals", + "contains", + "does_not_contain", + "in", + "not_in", + "and", + "or", + "time_is_after", + "time_is_before", + "time_range", + "string_contains", + "string_does_not_contain", + "is_set", + "is_unset" + ], + "properties": null, + "inner_properties": null, + "description": "The operator for this filter.\n\n* equals FilterOperatorEquals Matches objects that are exactly equal to the value in the field.\n\n* not_equals FilterOperatorNotEquals Matches objects that are not exactly equal to the value in the field.\n\n* contains FilterOperatorContains For a multi-valued field, such as tags, this operator will match objects that contain any of the values in the field.\n\n* does_not_contain FilterOperatorDoesNotContain For a multi-valued field, such as tags, this operator will match objects that do not contain any of the values in the field.\n\n* in FilterOperatorIn Matches objects if the field is one of several possible values, as specified in the values array.\n\n* not_in FilterOperatorNotIn Matches objects if the field is none of several possible values, as specified in the values array.\n\n* and FilterOperatorAnd Matches objects only if all subfilters match.\n\n* or FilterOperatorOr Matches objects if any subfilter matches.\n\n* time_is_after FilterOperatorTimeIsAfter Matches objects if the field is after the given time.\n\n* time_is_before FilterOperatorTimeIsBefore Matches objects if the field is before the given time.\n\n* time_range FilterOperatorTimeRange Matches objects if the field is between the given times.\n\n* string_contains FilterOperatorStringContains Matches objects if the field contains the given string.\n\n* string_does_not_contain FilterOperatorStringDoesNotContain Matches objects if the field does not contain the given string.\n\n* is_set FilterOperatorIsSet FilterOperatorIsSet matches objects if the field is set.\n\n* is_unset FilterOperatorIsUnset FilterOperatorIsUnset matches objects if the field is unset." + }, + "subfilters": { + "val_type": "array", + "inner_val_type": "json", + "enum": null, + "properties": null, + "inner_properties": {}, + "description": "Sub-filters for this filter. Valid only when operator is \"and\" or \"or\".\n\nThe maximum allowed depth for a tree of filters is 3." + }, + "value": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The value for this filter. Only used for single-valued operators\n\n(\"equals\", \"not_equals\", \"contains\", \"does_not_contain\")" + }, + "values": { + "val_type": "array", + "inner_val_type": "string", + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The values for this filter. Only used for multi-valued operators (\"in\", \"not_in\")." + } + }, + "inner_properties": null, + "description": null + }, + "visibility": { + "val_type": "string", + "inner_val_type": null, + "enum": [ + "public", + "customer", + "internal_only" + ], + "properties": null, + "inner_properties": null, + "description": "The visibility setting of the article.\n\n* public KnowledgeBaseArticleVisibilityPublic\n\n* customer KnowledgeBaseArticleVisibilityCustomer\n\n* internal_only KnowledgeBaseArticleVisibilityInternalOnly" + } + }, + "inner_properties": null, + "description": null + } + }, + "inner_properties": null, + "description": "" + }, + "description": "", + "required": false, + "deprecated": false, + "default": null, + "location": "body", + "content_type": "application/json", + "json_schema": { + "type": "object", + "properties": { + "author_user_id": { + "type": "string", + "description": "The ID of the user attributed as the author of the article." + }, + "body_html": { + "type": "string", + "description": "The HTML body of the article." + }, + "collection_id": { + "type": "string", + "description": "The id of the collection associated to the article" + }, + "is_published": { + "type": "boolean", + "description": "Whether the article should be published. Defaults to false." + }, + "is_unlisted": { + "type": "boolean", + "description": "Whether the article can only be accessible only via direct link. Defaults to false." + }, + "slug": { + "type": "string", + "description": "The slug of the article. Defaults to a slug based on the title." + }, + "title": { + "type": "string", + "description": "The title of the article." + }, + "translations": { + "type": "array", + "description": "Translations of the article content in different languages", + "items": { + "type": "object", + "properties": { + "body_html": { + "type": "string", + "description": "The translated HTML body of the article." + }, + "language": { + "type": "string", + "description": "The language code of the translation. Supported language codes can be found in https://docs.usepylon.com/pylon-docs/knowledge-base/translation#supported-language-codes." + }, + "title": { + "type": "string", + "description": "The translated title of the article." + } + }, + "required": [ + "body_html", + "language", + "title" + ] + } + }, + "visibility_config": { + "type": "object", + "properties": { + "ai_agent_access": { + "type": "string", + "description": "AI agent access control for the article. Defaults to inherit from the parent scope when omitted.\n\n* inherit KnowledgeBaseArticleAIAgentAccessInherit Defers the access check to the parent object (Collection or KnowledgeBase).\n\n* none KnowledgeBaseArticleAIAgentAccessNone No AI agents have access to this article.\n\n* specific_agents KnowledgeBaseArticleAIAgentAccessSpecificAgents Only specific AI agents enumerated in the allowlist have access.", + "enum": [ + "inherit", + "none", + "specific_agents" + ] + }, + "allowed_agent_ids": { + "type": "array", + "description": "List of AI agent IDs that may access this article when ai_agent_access is set to \"specific_agents\".", + "items": { + "type": "string" + } + }, + "customer_visibility_condition": { + "type": "object", + "properties": { + "field": { + "type": "string", + "description": "The field for this filter. For allowed fields, see the documentation for\n\nthe specific endpoint you are using.\n\nFor non-compound filters (any operators other than \"and\" or \"or\"),\n\nField must be set, along with either Value or Values, depending on the operator." + }, + "operator": { + "type": "string", + "description": "The operator for this filter.\n\n* equals FilterOperatorEquals Matches objects that are exactly equal to the value in the field.\n\n* not_equals FilterOperatorNotEquals Matches objects that are not exactly equal to the value in the field.\n\n* contains FilterOperatorContains For a multi-valued field, such as tags, this operator will match objects that contain any of the values in the field.\n\n* does_not_contain FilterOperatorDoesNotContain For a multi-valued field, such as tags, this operator will match objects that do not contain any of the values in the field.\n\n* in FilterOperatorIn Matches objects if the field is one of several possible values, as specified in the values array.\n\n* not_in FilterOperatorNotIn Matches objects if the field is none of several possible values, as specified in the values array.\n\n* and FilterOperatorAnd Matches objects only if all subfilters match.\n\n* or FilterOperatorOr Matches objects if any subfilter matches.\n\n* time_is_after FilterOperatorTimeIsAfter Matches objects if the field is after the given time.\n\n* time_is_before FilterOperatorTimeIsBefore Matches objects if the field is before the given time.\n\n* time_range FilterOperatorTimeRange Matches objects if the field is between the given times.\n\n* string_contains FilterOperatorStringContains Matches objects if the field contains the given string.\n\n* string_does_not_contain FilterOperatorStringDoesNotContain Matches objects if the field does not contain the given string.\n\n* is_set FilterOperatorIsSet FilterOperatorIsSet matches objects if the field is set.\n\n* is_unset FilterOperatorIsUnset FilterOperatorIsUnset matches objects if the field is unset.", + "enum": [ + "equals", + "not_equals", + "contains", + "does_not_contain", + "in", + "not_in", + "and", + "or", + "time_is_after", + "time_is_before", + "time_range", + "string_contains", + "string_does_not_contain", + "is_set", + "is_unset" + ] + }, + "subfilters": { + "type": "array", + "description": "Sub-filters for this filter. Valid only when operator is \"and\" or \"or\".\n\nThe maximum allowed depth for a tree of filters is 3.", + "items": { + "type": "object", + "properties": {} + } + }, + "value": { + "type": "string", + "description": "The value for this filter. Only used for single-valued operators\n\n(\"equals\", \"not_equals\", \"contains\", \"does_not_contain\")" + }, + "values": { + "type": "array", + "description": "The values for this filter. Only used for multi-valued operators (\"in\", \"not_in\").", + "items": { + "type": "string" + } + } + }, + "required": [ + "field", + "operator" + ] + }, + "visibility": { + "type": "string", + "description": "The visibility setting of the article.\n\n* public KnowledgeBaseArticleVisibilityPublic\n\n* customer KnowledgeBaseArticleVisibilityCustomer\n\n* internal_only KnowledgeBaseArticleVisibilityInternalOnly", + "enum": [ + "public", + "customer", + "internal_only" + ] + } + } + } + }, + "required": [ + "author_user_id", + "body_html", + "title" + ] + }, + "schema_required": false + } + ] + }, + "request_body_spec": "{\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"properties\": {\n \"author_user_id\": {\n \"description\": \"The ID of the user attributed as the author of the article.\",\n \"type\": \"string\",\n \"x-go-name\": \"AuthorUserId\"\n },\n \"body_html\": {\n \"description\": \"The HTML body of the article.\",\n \"type\": \"string\",\n \"x-go-name\": \"BodyHTML\"\n },\n \"collection_id\": {\n \"description\": \"The id of the collection associated to the article\",\n \"type\": \"string\",\n \"x-go-name\": \"CollectionID\"\n },\n \"is_published\": {\n \"description\": \"Whether the article should be published. Defaults to false.\",\n \"type\": \"boolean\",\n \"x-go-name\": \"IsPublished\"\n },\n \"is_unlisted\": {\n \"description\": \"Whether the article can only be accessible only via direct link. Defaults to false.\",\n \"type\": \"boolean\",\n \"x-go-name\": \"IsUnlisted\"\n },\n \"slug\": {\n \"description\": \"The slug of the article. Defaults to a slug based on the title.\",\n \"type\": \"string\",\n \"x-go-name\": \"Slug\"\n },\n \"title\": {\n \"description\": \"The title of the article.\",\n \"type\": \"string\",\n \"x-go-name\": \"Title\"\n },\n \"translations\": {\n \"description\": \"Translations of the article content in different languages\",\n \"items\": {\n \"properties\": {\n \"body_html\": {\n \"description\": \"The translated HTML body of the article.\",\n \"type\": \"string\",\n \"x-go-name\": \"BodyHTML\"\n },\n \"language\": {\n \"description\": \"The language code of the translation. Supported language codes can be found in https://docs.usepylon.com/pylon-docs/knowledge-base/translation#supported-language-codes.\",\n \"type\": \"string\",\n \"x-go-name\": \"Language\"\n },\n \"title\": {\n \"description\": \"The translated title of the article.\",\n \"type\": \"string\",\n \"x-go-name\": \"Title\"\n }\n },\n \"required\": [\n \"body_html\",\n \"language\",\n \"title\"\n ],\n \"type\": \"object\",\n \"x-go-package\": \"pylon/api/apiserver/endpoints\"\n },\n \"type\": \"array\",\n \"x-go-name\": \"Translations\"\n },\n \"visibility_config\": {\n \"properties\": {\n \"ai_agent_access\": {\n \"description\": \"AI agent access control for the article. Defaults to inherit from the parent scope when omitted.\\n\\n* inherit KnowledgeBaseArticleAIAgentAccessInherit Defers the access check to the parent object (Collection or KnowledgeBase).\\n\\n* none KnowledgeBaseArticleAIAgentAccessNone No AI agents have access to this article.\\n\\n* specific_agents KnowledgeBaseArticleAIAgentAccessSpecificAgents Only specific AI agents enumerated in the allowlist have access.\",\n \"enum\": [\n \"inherit\",\n \"none\",\n \"specific_agents\"\n ],\n \"type\": \"string\",\n \"x-go-enum-desc\": \"inherit KnowledgeBaseArticleAIAgentAccessInherit Defers the access check to the parent object (Collection or KnowledgeBase).\\nnone KnowledgeBaseArticleAIAgentAccessNone No AI agents have access to this article.\\nspecific_agents KnowledgeBaseArticleAIAgentAccessSpecificAgents Only specific AI agents enumerated in the allowlist have access.\",\n \"x-go-name\": \"AiAgentAccess\"\n },\n \"allowed_agent_ids\": {\n \"description\": \"List of AI agent IDs that may access this article when ai_agent_access is set to \\\"specific_agents\\\".\",\n \"items\": {\n \"type\": \"string\"\n },\n \"type\": \"array\",\n \"x-go-name\": \"AllowedAgentIDs\"\n },\n \"customer_visibility_condition\": {\n \"properties\": {\n \"field\": {\n \"description\": \"The field for this filter. For allowed fields, see the documentation for\\n\\nthe specific endpoint you are using.\\n\\nFor non-compound filters (any operators other than \\\"and\\\" or \\\"or\\\"),\\n\\nField must be set, along with either Value or Values, depending on the operator.\",\n \"type\": \"string\",\n \"x-go-name\": \"Field\"\n },\n \"operator\": {\n \"description\": \"The operator for this filter.\\n\\n* equals FilterOperatorEquals Matches objects that are exactly equal to the value in the field.\\n\\n* not_equals FilterOperatorNotEquals Matches objects that are not exactly equal to the value in the field.\\n\\n* contains FilterOperatorContains For a multi-valued field, such as tags, this operator will match objects that contain any of the values in the field.\\n\\n* does_not_contain FilterOperatorDoesNotContain For a multi-valued field, such as tags, this operator will match objects that do not contain any of the values in the field.\\n\\n* in FilterOperatorIn Matches objects if the field is one of several possible values, as specified in the values array.\\n\\n* not_in FilterOperatorNotIn Matches objects if the field is none of several possible values, as specified in the values array.\\n\\n* and FilterOperatorAnd Matches objects only if all subfilters match.\\n\\n* or FilterOperatorOr Matches objects if any subfilter matches.\\n\\n* time_is_after FilterOperatorTimeIsAfter Matches objects if the field is after the given time.\\n\\n* time_is_before FilterOperatorTimeIsBefore Matches objects if the field is before the given time.\\n\\n* time_range FilterOperatorTimeRange Matches objects if the field is between the given times.\\n\\n* string_contains FilterOperatorStringContains Matches objects if the field contains the given string.\\n\\n* string_does_not_contain FilterOperatorStringDoesNotContain Matches objects if the field does not contain the given string.\\n\\n* is_set FilterOperatorIsSet FilterOperatorIsSet matches objects if the field is set.\\n\\n* is_unset FilterOperatorIsUnset FilterOperatorIsUnset matches objects if the field is unset.\",\n \"enum\": [\n \"equals\",\n \"not_equals\",\n \"contains\",\n \"does_not_contain\",\n \"in\",\n \"not_in\",\n \"and\",\n \"or\",\n \"time_is_after\",\n \"time_is_before\",\n \"time_range\",\n \"string_contains\",\n \"string_does_not_contain\",\n \"is_set\",\n \"is_unset\"\n ],\n \"type\": \"string\",\n \"x-go-enum-desc\": \"equals FilterOperatorEquals Matches objects that are exactly equal to the value in the field.\\nnot_equals FilterOperatorNotEquals Matches objects that are not exactly equal to the value in the field.\\ncontains FilterOperatorContains For a multi-valued field, such as tags, this operator will match objects that contain any of the values in the field.\\ndoes_not_contain FilterOperatorDoesNotContain For a multi-valued field, such as tags, this operator will match objects that do not contain any of the values in the field.\\nin FilterOperatorIn Matches objects if the field is one of several possible values, as specified in the values array.\\nnot_in FilterOperatorNotIn Matches objects if the field is none of several possible values, as specified in the values array.\\nand FilterOperatorAnd Matches objects only if all subfilters match.\\nor FilterOperatorOr Matches objects if any subfilter matches.\\ntime_is_after FilterOperatorTimeIsAfter Matches objects if the field is after the given time.\\ntime_is_before FilterOperatorTimeIsBefore Matches objects if the field is before the given time.\\ntime_range FilterOperatorTimeRange Matches objects if the field is between the given times.\\nstring_contains FilterOperatorStringContains Matches objects if the field contains the given string.\\nstring_does_not_contain FilterOperatorStringDoesNotContain Matches objects if the field does not contain the given string.\\nis_set FilterOperatorIsSet FilterOperatorIsSet matches objects if the field is set.\\nis_unset FilterOperatorIsUnset FilterOperatorIsUnset matches objects if the field is unset.\",\n \"x-go-name\": \"Operator\"\n },\n \"subfilters\": {\n \"description\": \"Sub-filters for this filter. Valid only when operator is \\\"and\\\" or \\\"or\\\".\\n\\nThe maximum allowed depth for a tree of filters is 3.\",\n \"items\": {\n \"$ref\": \"#/components/schemas/Filter\",\n \"has_circular_reference\": true\n },\n \"type\": \"array\",\n \"x-go-name\": \"Subfilters\"\n },\n \"value\": {\n \"description\": \"The value for this filter. Only used for single-valued operators\\n\\n(\\\"equals\\\", \\\"not_equals\\\", \\\"contains\\\", \\\"does_not_contain\\\")\",\n \"type\": \"string\",\n \"x-go-name\": \"Value\"\n },\n \"values\": {\n \"description\": \"The values for this filter. Only used for multi-valued operators (\\\"in\\\", \\\"not_in\\\").\",\n \"items\": {\n \"type\": \"string\"\n },\n \"type\": \"array\",\n \"x-go-name\": \"Values\"\n }\n },\n \"required\": [\n \"field\",\n \"operator\"\n ],\n \"type\": \"object\",\n \"x-go-package\": \"pylon/api/apiserver/apitypes\"\n },\n \"visibility\": {\n \"description\": \"The visibility setting of the article.\\n\\n* public KnowledgeBaseArticleVisibilityPublic\\n\\n* customer KnowledgeBaseArticleVisibilityCustomer\\n\\n* internal_only KnowledgeBaseArticleVisibilityInternalOnly\",\n \"enum\": [\n \"public\",\n \"customer\",\n \"internal_only\"\n ],\n \"type\": \"string\",\n \"x-go-enum-desc\": \"public KnowledgeBaseArticleVisibilityPublic\\ncustomer KnowledgeBaseArticleVisibilityCustomer\\ninternal_only KnowledgeBaseArticleVisibilityInternalOnly\",\n \"x-go-name\": \"Visibility\"\n }\n },\n \"type\": \"object\",\n \"x-go-package\": \"pylon/api/apiserver/apitypes\"\n }\n },\n \"required\": [\n \"author_user_id\",\n \"body_html\",\n \"title\"\n ],\n \"type\": \"object\",\n \"x-go-package\": \"pylon/api/apiserver/endpoints\"\n }\n }\n },\n \"required\": false\n}", + "use_request_body_schema_mode": true, + "validate_request_body_schema": false, + "use_flatten_mode": false + }, + { + "name": "DeleteArticle", + "selected_for_wrapping": false, + "spec_built": true, + "wrap_finished": true, + "should_skip": false, + "skip_reason": null, + "wrapper_tool": { + "name": "delete_article", + "description": { + "tagline": "Delete an existing article from a knowledge base.", + "detailed": "Call this tool to remove an article from a knowledge base by specifying the knowledge base and article IDs." + }, + "return_annotation": "Confirmation of the article deletion", + "arguments": [ + { + "name": "knowledge_base_id", + "alternative_names": [ + "kb_id", + "base_id" + ], + "description": "The KnowledgeBaseID of the article to delete.", + "endpoint_argument_name": "id" + }, + { + "name": "article_id", + "alternative_names": [ + "article_identifier", + "article_key" + ], + "description": "The ID of the article that needs to be deleted from the knowledge base.", + "endpoint_argument_name": "article_id" + } + ] + }, + "method": "DELETE", + "path": "/knowledge-bases/{id}/articles/{article_id}", + "tags": [ + "articles" + ], + "summary": "", + "description": "Delete an existing article", + "requires_security": true, + "oauth_scopes": [], + "security_schemes": [ + "bearerAuth" + ], + "parameters": { + "query": [], + "path": [ + { + "name": "id", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The KnowledgeBaseID of the article to delete." + }, + "description": "The KnowledgeBaseID of the article to delete.", + "required": true, + "deprecated": false, + "default": null, + "location": "path", + "content_type": null, + "json_schema": { + "type": "string" + }, + "schema_required": false + }, + { + "name": "article_id", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The ID of the article to delete." + }, + "description": "The ID of the article to delete.", + "required": true, + "deprecated": false, + "default": null, + "location": "path", + "content_type": null, + "json_schema": { + "type": "string" + }, + "schema_required": false + } + ], + "header": [], + "cookie": [], + "body": [] + }, + "request_body_spec": null, + "use_request_body_schema_mode": false, + "validate_request_body_schema": false, + "use_flatten_mode": false + }, + { + "name": "UpdateArticle", + "selected_for_wrapping": false, + "spec_built": true, + "wrap_finished": true, + "should_skip": false, + "skip_reason": null, + "wrapper_tool": { + "name": "update_article", + "description": { + "tagline": "Update the content of an existing article.", + "detailed": "Use this tool to modify the content or details of an existing article in a knowledge base when updates are needed." + }, + "return_annotation": "Details of the updated article.", + "arguments": [ + { + "name": "knowledge_base_id", + "alternative_names": [ + "knowledgebase_id", + "kb_id" + ], + "description": "The identifier for the knowledge base where the article to be updated is located.", + "endpoint_argument_name": "id" + }, + { + "name": "article_id", + "alternative_names": [ + "article_identifier", + "article_key" + ], + "description": "Specify the unique identifier of the article you want to update in the knowledge base.", + "endpoint_argument_name": "article_id" + }, + { + "name": "article_update_details", + "alternative_names": [ + "update_content_details", + "content_update_request" + ], + "description": "A JSON object containing details such as body HTML, title, language, visibility settings, AI agent access, and publication status for updating the article.", + "endpoint_argument_name": "requestBody" + } + ] + }, + "method": "PATCH", + "path": "/knowledge-bases/{id}/articles/{article_id}", + "tags": [ + "articles" + ], + "summary": "", + "description": "Update an existing article", + "requires_security": true, + "oauth_scopes": [], + "security_schemes": [ + "bearerAuth" + ], + "parameters": { + "query": [], + "path": [ + { + "name": "id", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The KnowledgeBaseID of the article to update." + }, + "description": "The KnowledgeBaseID of the article to update.", + "required": true, + "deprecated": false, + "default": null, + "location": "path", + "content_type": null, + "json_schema": { + "type": "string" + }, + "schema_required": false + }, + { + "name": "article_id", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The ID of the article to update." + }, + "description": "The ID of the article to update.", + "required": true, + "deprecated": false, + "default": null, + "location": "path", + "content_type": null, + "json_schema": { + "type": "string" + }, + "schema_required": false + } + ], + "header": [], + "cookie": [], + "body": [ + { + "name": "requestBody", + "value_schema": { + "val_type": "json", + "inner_val_type": null, + "enum": null, + "properties": { + "body_html": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The HTML body of the article." + }, + "language": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The language code of the translation to update. If not provided, the default language (original article) will be updated." + }, + "publish_updated_body_html": { + "val_type": "boolean", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "Whether the changes to the article should be published. Defaults to false." + }, + "title": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The title of the article." + }, + "visibility_config": { + "val_type": "json", + "inner_val_type": null, + "enum": null, + "properties": { + "ai_agent_access": { + "val_type": "string", + "inner_val_type": null, + "enum": [ + "inherit", + "none", + "specific_agents" + ], + "properties": null, + "inner_properties": null, + "description": "AI agent access control for the article. Defaults to inherit from the parent scope when omitted.\n\n* inherit KnowledgeBaseArticleAIAgentAccessInherit Defers the access check to the parent object (Collection or KnowledgeBase).\n\n* none KnowledgeBaseArticleAIAgentAccessNone No AI agents have access to this article.\n\n* specific_agents KnowledgeBaseArticleAIAgentAccessSpecificAgents Only specific AI agents enumerated in the allowlist have access." + }, + "allowed_agent_ids": { + "val_type": "array", + "inner_val_type": "string", + "enum": null, + "properties": null, + "inner_properties": null, + "description": "List of AI agent IDs that may access this article when ai_agent_access is set to \"specific_agents\"." + }, + "customer_visibility_condition": { + "val_type": "json", + "inner_val_type": null, + "enum": null, + "properties": { + "field": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The field for this filter. For allowed fields, see the documentation for\n\nthe specific endpoint you are using.\n\nFor non-compound filters (any operators other than \"and\" or \"or\"),\n\nField must be set, along with either Value or Values, depending on the operator." + }, + "operator": { + "val_type": "string", + "inner_val_type": null, + "enum": [ + "equals", + "not_equals", + "contains", + "does_not_contain", + "in", + "not_in", + "and", + "or", + "time_is_after", + "time_is_before", + "time_range", + "string_contains", + "string_does_not_contain", + "is_set", + "is_unset" + ], + "properties": null, + "inner_properties": null, + "description": "The operator for this filter.\n\n* equals FilterOperatorEquals Matches objects that are exactly equal to the value in the field.\n\n* not_equals FilterOperatorNotEquals Matches objects that are not exactly equal to the value in the field.\n\n* contains FilterOperatorContains For a multi-valued field, such as tags, this operator will match objects that contain any of the values in the field.\n\n* does_not_contain FilterOperatorDoesNotContain For a multi-valued field, such as tags, this operator will match objects that do not contain any of the values in the field.\n\n* in FilterOperatorIn Matches objects if the field is one of several possible values, as specified in the values array.\n\n* not_in FilterOperatorNotIn Matches objects if the field is none of several possible values, as specified in the values array.\n\n* and FilterOperatorAnd Matches objects only if all subfilters match.\n\n* or FilterOperatorOr Matches objects if any subfilter matches.\n\n* time_is_after FilterOperatorTimeIsAfter Matches objects if the field is after the given time.\n\n* time_is_before FilterOperatorTimeIsBefore Matches objects if the field is before the given time.\n\n* time_range FilterOperatorTimeRange Matches objects if the field is between the given times.\n\n* string_contains FilterOperatorStringContains Matches objects if the field contains the given string.\n\n* string_does_not_contain FilterOperatorStringDoesNotContain Matches objects if the field does not contain the given string.\n\n* is_set FilterOperatorIsSet FilterOperatorIsSet matches objects if the field is set.\n\n* is_unset FilterOperatorIsUnset FilterOperatorIsUnset matches objects if the field is unset." + }, + "subfilters": { + "val_type": "array", + "inner_val_type": "json", + "enum": null, + "properties": null, + "inner_properties": {}, + "description": "Sub-filters for this filter. Valid only when operator is \"and\" or \"or\".\n\nThe maximum allowed depth for a tree of filters is 3." + }, + "value": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The value for this filter. Only used for single-valued operators\n\n(\"equals\", \"not_equals\", \"contains\", \"does_not_contain\")" + }, + "values": { + "val_type": "array", + "inner_val_type": "string", + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The values for this filter. Only used for multi-valued operators (\"in\", \"not_in\")." + } + }, + "inner_properties": null, + "description": null + }, + "visibility": { + "val_type": "string", + "inner_val_type": null, + "enum": [ + "public", + "customer", + "internal_only" + ], + "properties": null, + "inner_properties": null, + "description": "The visibility setting of the article.\n\n* public KnowledgeBaseArticleVisibilityPublic\n\n* customer KnowledgeBaseArticleVisibilityCustomer\n\n* internal_only KnowledgeBaseArticleVisibilityInternalOnly" + } + }, + "inner_properties": null, + "description": null + } + }, + "inner_properties": null, + "description": "" + }, + "description": "", + "required": false, + "deprecated": false, + "default": null, + "location": "body", + "content_type": "application/json", + "json_schema": { + "type": "object", + "properties": { + "body_html": { + "type": "string", + "description": "The HTML body of the article." + }, + "language": { + "type": "string", + "description": "The language code of the translation to update. If not provided, the default language (original article) will be updated." + }, + "publish_updated_body_html": { + "type": "boolean", + "description": "Whether the changes to the article should be published. Defaults to false." + }, + "title": { + "type": "string", + "description": "The title of the article." + }, + "visibility_config": { + "type": "object", + "properties": { + "ai_agent_access": { + "type": "string", + "description": "AI agent access control for the article. Defaults to inherit from the parent scope when omitted.\n\n* inherit KnowledgeBaseArticleAIAgentAccessInherit Defers the access check to the parent object (Collection or KnowledgeBase).\n\n* none KnowledgeBaseArticleAIAgentAccessNone No AI agents have access to this article.\n\n* specific_agents KnowledgeBaseArticleAIAgentAccessSpecificAgents Only specific AI agents enumerated in the allowlist have access.", + "enum": [ + "inherit", + "none", + "specific_agents" + ] + }, + "allowed_agent_ids": { + "type": "array", + "description": "List of AI agent IDs that may access this article when ai_agent_access is set to \"specific_agents\".", + "items": { + "type": "string" + } + }, + "customer_visibility_condition": { + "type": "object", + "properties": { + "field": { + "type": "string", + "description": "The field for this filter. For allowed fields, see the documentation for\n\nthe specific endpoint you are using.\n\nFor non-compound filters (any operators other than \"and\" or \"or\"),\n\nField must be set, along with either Value or Values, depending on the operator." + }, + "operator": { + "type": "string", + "description": "The operator for this filter.\n\n* equals FilterOperatorEquals Matches objects that are exactly equal to the value in the field.\n\n* not_equals FilterOperatorNotEquals Matches objects that are not exactly equal to the value in the field.\n\n* contains FilterOperatorContains For a multi-valued field, such as tags, this operator will match objects that contain any of the values in the field.\n\n* does_not_contain FilterOperatorDoesNotContain For a multi-valued field, such as tags, this operator will match objects that do not contain any of the values in the field.\n\n* in FilterOperatorIn Matches objects if the field is one of several possible values, as specified in the values array.\n\n* not_in FilterOperatorNotIn Matches objects if the field is none of several possible values, as specified in the values array.\n\n* and FilterOperatorAnd Matches objects only if all subfilters match.\n\n* or FilterOperatorOr Matches objects if any subfilter matches.\n\n* time_is_after FilterOperatorTimeIsAfter Matches objects if the field is after the given time.\n\n* time_is_before FilterOperatorTimeIsBefore Matches objects if the field is before the given time.\n\n* time_range FilterOperatorTimeRange Matches objects if the field is between the given times.\n\n* string_contains FilterOperatorStringContains Matches objects if the field contains the given string.\n\n* string_does_not_contain FilterOperatorStringDoesNotContain Matches objects if the field does not contain the given string.\n\n* is_set FilterOperatorIsSet FilterOperatorIsSet matches objects if the field is set.\n\n* is_unset FilterOperatorIsUnset FilterOperatorIsUnset matches objects if the field is unset.", + "enum": [ + "equals", + "not_equals", + "contains", + "does_not_contain", + "in", + "not_in", + "and", + "or", + "time_is_after", + "time_is_before", + "time_range", + "string_contains", + "string_does_not_contain", + "is_set", + "is_unset" + ] + }, + "subfilters": { + "type": "array", + "description": "Sub-filters for this filter. Valid only when operator is \"and\" or \"or\".\n\nThe maximum allowed depth for a tree of filters is 3.", + "items": { + "type": "object", + "properties": {} + } + }, + "value": { + "type": "string", + "description": "The value for this filter. Only used for single-valued operators\n\n(\"equals\", \"not_equals\", \"contains\", \"does_not_contain\")" + }, + "values": { + "type": "array", + "description": "The values for this filter. Only used for multi-valued operators (\"in\", \"not_in\").", + "items": { + "type": "string" + } + } + }, + "required": [ + "field", + "operator" + ] + }, + "visibility": { + "type": "string", + "description": "The visibility setting of the article.\n\n* public KnowledgeBaseArticleVisibilityPublic\n\n* customer KnowledgeBaseArticleVisibilityCustomer\n\n* internal_only KnowledgeBaseArticleVisibilityInternalOnly", + "enum": [ + "public", + "customer", + "internal_only" + ] + } + } + } + } + }, + "schema_required": false + } + ] + }, + "request_body_spec": "{\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"properties\": {\n \"body_html\": {\n \"description\": \"The HTML body of the article.\",\n \"type\": \"string\",\n \"x-go-name\": \"BodyHTML\"\n },\n \"language\": {\n \"description\": \"The language code of the translation to update. If not provided, the default language (original article) will be updated.\",\n \"type\": \"string\",\n \"x-go-name\": \"Language\"\n },\n \"publish_updated_body_html\": {\n \"description\": \"Whether the changes to the article should be published. Defaults to false.\",\n \"type\": \"boolean\",\n \"x-go-name\": \"PublishUpdatedBodyHTML\"\n },\n \"title\": {\n \"description\": \"The title of the article.\",\n \"type\": \"string\",\n \"x-go-name\": \"Title\"\n },\n \"visibility_config\": {\n \"properties\": {\n \"ai_agent_access\": {\n \"description\": \"AI agent access control for the article. Defaults to inherit from the parent scope when omitted.\\n\\n* inherit KnowledgeBaseArticleAIAgentAccessInherit Defers the access check to the parent object (Collection or KnowledgeBase).\\n\\n* none KnowledgeBaseArticleAIAgentAccessNone No AI agents have access to this article.\\n\\n* specific_agents KnowledgeBaseArticleAIAgentAccessSpecificAgents Only specific AI agents enumerated in the allowlist have access.\",\n \"enum\": [\n \"inherit\",\n \"none\",\n \"specific_agents\"\n ],\n \"type\": \"string\",\n \"x-go-enum-desc\": \"inherit KnowledgeBaseArticleAIAgentAccessInherit Defers the access check to the parent object (Collection or KnowledgeBase).\\nnone KnowledgeBaseArticleAIAgentAccessNone No AI agents have access to this article.\\nspecific_agents KnowledgeBaseArticleAIAgentAccessSpecificAgents Only specific AI agents enumerated in the allowlist have access.\",\n \"x-go-name\": \"AiAgentAccess\"\n },\n \"allowed_agent_ids\": {\n \"description\": \"List of AI agent IDs that may access this article when ai_agent_access is set to \\\"specific_agents\\\".\",\n \"items\": {\n \"type\": \"string\"\n },\n \"type\": \"array\",\n \"x-go-name\": \"AllowedAgentIDs\"\n },\n \"customer_visibility_condition\": {\n \"properties\": {\n \"field\": {\n \"description\": \"The field for this filter. For allowed fields, see the documentation for\\n\\nthe specific endpoint you are using.\\n\\nFor non-compound filters (any operators other than \\\"and\\\" or \\\"or\\\"),\\n\\nField must be set, along with either Value or Values, depending on the operator.\",\n \"type\": \"string\",\n \"x-go-name\": \"Field\"\n },\n \"operator\": {\n \"description\": \"The operator for this filter.\\n\\n* equals FilterOperatorEquals Matches objects that are exactly equal to the value in the field.\\n\\n* not_equals FilterOperatorNotEquals Matches objects that are not exactly equal to the value in the field.\\n\\n* contains FilterOperatorContains For a multi-valued field, such as tags, this operator will match objects that contain any of the values in the field.\\n\\n* does_not_contain FilterOperatorDoesNotContain For a multi-valued field, such as tags, this operator will match objects that do not contain any of the values in the field.\\n\\n* in FilterOperatorIn Matches objects if the field is one of several possible values, as specified in the values array.\\n\\n* not_in FilterOperatorNotIn Matches objects if the field is none of several possible values, as specified in the values array.\\n\\n* and FilterOperatorAnd Matches objects only if all subfilters match.\\n\\n* or FilterOperatorOr Matches objects if any subfilter matches.\\n\\n* time_is_after FilterOperatorTimeIsAfter Matches objects if the field is after the given time.\\n\\n* time_is_before FilterOperatorTimeIsBefore Matches objects if the field is before the given time.\\n\\n* time_range FilterOperatorTimeRange Matches objects if the field is between the given times.\\n\\n* string_contains FilterOperatorStringContains Matches objects if the field contains the given string.\\n\\n* string_does_not_contain FilterOperatorStringDoesNotContain Matches objects if the field does not contain the given string.\\n\\n* is_set FilterOperatorIsSet FilterOperatorIsSet matches objects if the field is set.\\n\\n* is_unset FilterOperatorIsUnset FilterOperatorIsUnset matches objects if the field is unset.\",\n \"enum\": [\n \"equals\",\n \"not_equals\",\n \"contains\",\n \"does_not_contain\",\n \"in\",\n \"not_in\",\n \"and\",\n \"or\",\n \"time_is_after\",\n \"time_is_before\",\n \"time_range\",\n \"string_contains\",\n \"string_does_not_contain\",\n \"is_set\",\n \"is_unset\"\n ],\n \"type\": \"string\",\n \"x-go-enum-desc\": \"equals FilterOperatorEquals Matches objects that are exactly equal to the value in the field.\\nnot_equals FilterOperatorNotEquals Matches objects that are not exactly equal to the value in the field.\\ncontains FilterOperatorContains For a multi-valued field, such as tags, this operator will match objects that contain any of the values in the field.\\ndoes_not_contain FilterOperatorDoesNotContain For a multi-valued field, such as tags, this operator will match objects that do not contain any of the values in the field.\\nin FilterOperatorIn Matches objects if the field is one of several possible values, as specified in the values array.\\nnot_in FilterOperatorNotIn Matches objects if the field is none of several possible values, as specified in the values array.\\nand FilterOperatorAnd Matches objects only if all subfilters match.\\nor FilterOperatorOr Matches objects if any subfilter matches.\\ntime_is_after FilterOperatorTimeIsAfter Matches objects if the field is after the given time.\\ntime_is_before FilterOperatorTimeIsBefore Matches objects if the field is before the given time.\\ntime_range FilterOperatorTimeRange Matches objects if the field is between the given times.\\nstring_contains FilterOperatorStringContains Matches objects if the field contains the given string.\\nstring_does_not_contain FilterOperatorStringDoesNotContain Matches objects if the field does not contain the given string.\\nis_set FilterOperatorIsSet FilterOperatorIsSet matches objects if the field is set.\\nis_unset FilterOperatorIsUnset FilterOperatorIsUnset matches objects if the field is unset.\",\n \"x-go-name\": \"Operator\"\n },\n \"subfilters\": {\n \"description\": \"Sub-filters for this filter. Valid only when operator is \\\"and\\\" or \\\"or\\\".\\n\\nThe maximum allowed depth for a tree of filters is 3.\",\n \"items\": {\n \"$ref\": \"#/components/schemas/Filter\",\n \"has_circular_reference\": true\n },\n \"type\": \"array\",\n \"x-go-name\": \"Subfilters\"\n },\n \"value\": {\n \"description\": \"The value for this filter. Only used for single-valued operators\\n\\n(\\\"equals\\\", \\\"not_equals\\\", \\\"contains\\\", \\\"does_not_contain\\\")\",\n \"type\": \"string\",\n \"x-go-name\": \"Value\"\n },\n \"values\": {\n \"description\": \"The values for this filter. Only used for multi-valued operators (\\\"in\\\", \\\"not_in\\\").\",\n \"items\": {\n \"type\": \"string\"\n },\n \"type\": \"array\",\n \"x-go-name\": \"Values\"\n }\n },\n \"required\": [\n \"field\",\n \"operator\"\n ],\n \"type\": \"object\",\n \"x-go-package\": \"pylon/api/apiserver/apitypes\"\n },\n \"visibility\": {\n \"description\": \"The visibility setting of the article.\\n\\n* public KnowledgeBaseArticleVisibilityPublic\\n\\n* customer KnowledgeBaseArticleVisibilityCustomer\\n\\n* internal_only KnowledgeBaseArticleVisibilityInternalOnly\",\n \"enum\": [\n \"public\",\n \"customer\",\n \"internal_only\"\n ],\n \"type\": \"string\",\n \"x-go-enum-desc\": \"public KnowledgeBaseArticleVisibilityPublic\\ncustomer KnowledgeBaseArticleVisibilityCustomer\\ninternal_only KnowledgeBaseArticleVisibilityInternalOnly\",\n \"x-go-name\": \"Visibility\"\n }\n },\n \"type\": \"object\",\n \"x-go-package\": \"pylon/api/apiserver/apitypes\"\n }\n },\n \"type\": \"object\",\n \"x-go-package\": \"pylon/api/apiserver/endpoints\"\n }\n }\n },\n \"required\": false\n}", + "use_request_body_schema_mode": true, + "validate_request_body_schema": false, + "use_flatten_mode": false + }, + { + "name": "GetCollections", + "selected_for_wrapping": false, + "spec_built": true, + "wrap_finished": true, + "should_skip": false, + "skip_reason": null, + "wrapper_tool": { + "name": "list_collections_in_knowledge_base", + "description": { + "tagline": "List all collections in a knowledge base.", + "detailed": "Use this tool to retrieve all collections within a specific knowledge base. Useful for accessing organized information in structured formats." + }, + "return_annotation": "A list of collections in the specified knowledge base.", + "arguments": [ + { + "name": "knowledge_base_id", + "alternative_names": [ + "base_id", + "kb_id" + ], + "description": "The ID of the knowledge base to list the collections from.", + "endpoint_argument_name": "id" + } + ] + }, + "method": "GET", + "path": "/knowledge-bases/{id}/collections", + "tags": [ + "collections" + ], + "summary": "", + "description": "List all collections in a knowledge base", + "requires_security": true, + "oauth_scopes": [], + "security_schemes": [ + "bearerAuth" + ], + "parameters": { + "query": [], + "path": [ + { + "name": "id", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The ID of the knowledge base" + }, + "description": "The ID of the knowledge base", + "required": true, + "deprecated": false, + "default": null, + "location": "path", + "content_type": null, + "json_schema": { + "type": "string" + }, + "schema_required": false + } + ], + "header": [], + "cookie": [], + "body": [] + }, + "request_body_spec": null, + "use_request_body_schema_mode": false, + "validate_request_body_schema": false, + "use_flatten_mode": false + }, + { + "name": "CreateCollection", + "selected_for_wrapping": false, + "spec_built": true, + "wrap_finished": true, + "should_skip": false, + "skip_reason": null, + "wrapper_tool": { + "name": "create_new_collection", + "description": { + "tagline": "Create a new collection in a knowledge base.", + "detailed": "This tool is used to create a new collection within a specified knowledge base by providing the knowledge base ID." + }, + "return_annotation": "Confirmation of new collection creation.", + "arguments": [ + { + "name": "knowledge_base_id", + "alternative_names": [ + "kb_id", + "knowledge_id" + ], + "description": "The unique identifier for the knowledge base where the new collection will be created.", + "endpoint_argument_name": "id" + }, + { + "name": "collection_details", + "alternative_names": [ + "new_collection_data", + "collection_creation_details" + ], + "description": "JSON object containing 'title', 'description', 'slug', and 'parent_collection_id' for the new collection.", + "endpoint_argument_name": "requestBody" + } + ] + }, + "method": "POST", + "path": "/knowledge-bases/{id}/collections", + "tags": [ + "collections" + ], + "summary": "", + "description": "Create a new collection", + "requires_security": true, + "oauth_scopes": [], + "security_schemes": [ + "bearerAuth" + ], + "parameters": { + "query": [], + "path": [ + { + "name": "id", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The ID of the knowledge base the article is being added to." + }, + "description": "The ID of the knowledge base the article is being added to.", + "required": true, + "deprecated": false, + "default": null, + "location": "path", + "content_type": null, + "json_schema": { + "type": "string" + }, + "schema_required": false + } + ], + "header": [], + "cookie": [], + "body": [ + { + "name": "requestBody", + "value_schema": { + "val_type": "json", + "inner_val_type": null, + "enum": null, + "properties": { + "description": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "Description of the collection." + }, + "parent_collection_id": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The id of the collection associated to the article" + }, + "slug": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The slug of the collection. Defaults to a slug based on the title." + }, + "title": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The title of the collection." + } + }, + "inner_properties": null, + "description": "" + }, + "description": "", + "required": false, + "deprecated": false, + "default": null, + "location": "body", + "content_type": "application/json", + "json_schema": { + "type": "object", + "properties": { + "description": { + "type": "string", + "description": "Description of the collection." + }, + "parent_collection_id": { + "type": "string", + "description": "The id of the collection associated to the article" + }, + "slug": { + "type": "string", + "description": "The slug of the collection. Defaults to a slug based on the title." + }, + "title": { + "type": "string", + "description": "The title of the collection." + } + }, + "required": [ + "title" + ] + }, + "schema_required": false + } + ] + }, + "request_body_spec": "{\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"properties\": {\n \"description\": {\n \"description\": \"Description of the collection.\",\n \"type\": \"string\",\n \"x-go-name\": \"Description\"\n },\n \"parent_collection_id\": {\n \"description\": \"The id of the collection associated to the article\",\n \"type\": \"string\",\n \"x-go-name\": \"ParentCollectionID\"\n },\n \"slug\": {\n \"description\": \"The slug of the collection. Defaults to a slug based on the title.\",\n \"type\": \"string\",\n \"x-go-name\": \"Slug\"\n },\n \"title\": {\n \"description\": \"The title of the collection.\",\n \"type\": \"string\",\n \"x-go-name\": \"Title\"\n }\n },\n \"required\": [\n \"title\"\n ],\n \"type\": \"object\",\n \"x-go-package\": \"pylon/api/apiserver/endpoints\"\n }\n }\n },\n \"required\": false\n}", + "use_request_body_schema_mode": true, + "validate_request_body_schema": true, + "use_flatten_mode": false + }, + { + "name": "GetCollection", + "selected_for_wrapping": false, + "spec_built": true, + "wrap_finished": true, + "should_skip": false, + "skip_reason": null, + "wrapper_tool": { + "name": "get_collection_by_id", + "description": { + "tagline": "Retrieve a specific collection using its ID.", + "detailed": "Use this tool to obtain detailed information about a particular collection by supplying the collection ID. The collection belongs to a specific knowledge base. Ideal for retrieving specific datasets or information collections within larger systems." + }, + "return_annotation": "Detailed information about a specific collection.", + "arguments": [ + { + "name": "knowledge_base_id", + "alternative_names": [ + "base_id", + "kb_id" + ], + "description": "The ID of the knowledge base to which the collection belongs.", + "endpoint_argument_name": "id" + }, + { + "name": "collection_id", + "alternative_names": [ + "collection_identifier", + "collection_key" + ], + "description": "The unique ID of the collection to be retrieved from the knowledge base.", + "endpoint_argument_name": "collection_id" + } + ] + }, + "method": "GET", + "path": "/knowledge-bases/{id}/collections/{collection_id}", + "tags": [ + "collections" + ], + "summary": "", + "description": "Get a specific collection by ID", + "requires_security": true, + "oauth_scopes": [], + "security_schemes": [ + "bearerAuth" + ], + "parameters": { + "query": [], + "path": [ + { + "name": "id", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The ID of the knowledge base" + }, + "description": "The ID of the knowledge base", + "required": true, + "deprecated": false, + "default": null, + "location": "path", + "content_type": null, + "json_schema": { + "type": "string" + }, + "schema_required": false + }, + { + "name": "collection_id", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The ID of the collection" + }, + "description": "The ID of the collection", + "required": true, + "deprecated": false, + "default": null, + "location": "path", + "content_type": null, + "json_schema": { + "type": "string" + }, + "schema_required": false + } + ], + "header": [], + "cookie": [], + "body": [] + }, + "request_body_spec": null, + "use_request_body_schema_mode": false, + "validate_request_body_schema": false, + "use_flatten_mode": false + }, + { + "name": "CreateRouteRedirect", + "selected_for_wrapping": false, + "spec_built": true, + "wrap_finished": true, + "should_skip": false, + "skip_reason": null, + "wrapper_tool": { + "name": "create_route_redirect", + "description": { + "tagline": "Create a new route redirect for a knowledge base.", + "detailed": "This tool is used to create a new route redirect within a specified knowledge base. It should be called when you need to add a redirect to manage or alter the routing within a knowledge base." + }, + "return_annotation": "Confirmation of route redirect creation.", + "arguments": [ + { + "name": "knowledge_base_id", + "alternative_names": [ + "kb_id", + "knowledge_base_identifier" + ], + "description": "The unique identifier for the knowledge base where the route redirect will be added.", + "endpoint_argument_name": "id" + }, + { + "name": "route_redirect_details", + "alternative_names": [ + "redirect_details", + "redirection_payload" + ], + "description": "JSON object with details for creating the route redirect, including 'from_path', 'language', 'object_id', and 'object_type'.", + "endpoint_argument_name": "requestBody" + } + ] + }, + "method": "POST", + "path": "/knowledge-bases/{id}/route-redirects", + "tags": [ + "route-redirects" + ], + "summary": "", + "description": "Create a new route redirect", + "requires_security": true, + "oauth_scopes": [], + "security_schemes": [ + "bearerAuth" + ], + "parameters": { + "query": [], + "path": [ + { + "name": "id", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The ID of the knowledge base the route redirect is being added to." + }, + "description": "The ID of the knowledge base the route redirect is being added to.", + "required": true, + "deprecated": false, + "default": null, + "location": "path", + "content_type": null, + "json_schema": { + "type": "string" + }, + "schema_required": false + } + ], + "header": [], + "cookie": [], + "body": [ + { + "name": "requestBody", + "value_schema": { + "val_type": "json", + "inner_val_type": null, + "enum": null, + "properties": { + "from_path": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The path to redirect from." + }, + "language": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "Language of the object to redirect to. If not specified, the default language of the knowledge base will be used." + }, + "object_id": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The ID of the object to redirect to." + }, + "object_type": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The type of the object to redirect to. This must be \"article\"." + } + }, + "inner_properties": null, + "description": "" + }, + "description": "", + "required": false, + "deprecated": false, + "default": null, + "location": "body", + "content_type": "application/json", + "json_schema": { + "type": "object", + "properties": { + "from_path": { + "type": "string", + "description": "The path to redirect from." + }, + "language": { + "type": "string", + "description": "Language of the object to redirect to. If not specified, the default language of the knowledge base will be used." + }, + "object_id": { + "type": "string", + "description": "The ID of the object to redirect to." + }, + "object_type": { + "type": "string", + "description": "The type of the object to redirect to. This must be \"article\"." + } + }, + "required": [ + "from_path", + "object_id", + "object_type" + ] + }, + "schema_required": false + } + ] + }, + "request_body_spec": "{\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"properties\": {\n \"from_path\": {\n \"description\": \"The path to redirect from.\",\n \"type\": \"string\",\n \"x-go-name\": \"FromPath\"\n },\n \"language\": {\n \"description\": \"Language of the object to redirect to. If not specified, the default language of the knowledge base will be used.\",\n \"type\": \"string\",\n \"x-go-name\": \"Language\"\n },\n \"object_id\": {\n \"description\": \"The ID of the object to redirect to.\",\n \"type\": \"string\",\n \"x-go-name\": \"ObjectID\"\n },\n \"object_type\": {\n \"description\": \"The type of the object to redirect to. This must be \\\"article\\\".\",\n \"type\": \"string\",\n \"x-go-name\": \"ObjectType\"\n }\n },\n \"required\": [\n \"from_path\",\n \"object_id\",\n \"object_type\"\n ],\n \"type\": \"object\",\n \"x-go-package\": \"pylon/api/apiserver/endpoints\"\n }\n }\n },\n \"required\": false\n}", + "use_request_body_schema_mode": true, + "validate_request_body_schema": true, + "use_flatten_mode": false + }, + { + "name": "GetMe", + "selected_for_wrapping": false, + "spec_built": true, + "wrap_finished": true, + "should_skip": false, + "skip_reason": null, + "wrapper_tool": { + "name": "get_organization_details", + "description": { + "tagline": "Retrieve details of the current organization.", + "detailed": "Use this tool to get information about the organization linked to the given API token, like name, address, and other relevant details." + }, + "return_annotation": "Organization details associated with the API token.", + "arguments": [] + }, + "method": "GET", + "path": "/me", + "tags": [ + "me" + ], + "summary": "", + "description": "Get details of the organization associated with the API token", + "requires_security": true, + "oauth_scopes": [], + "security_schemes": [ + "bearerAuth" + ], + "parameters": { + "query": [], + "path": [], + "header": [], + "cookie": [], + "body": [] + }, + "request_body_spec": null, + "use_request_body_schema_mode": false, + "validate_request_body_schema": false, + "use_flatten_mode": false + }, + { + "name": "CreateMilestone", + "selected_for_wrapping": false, + "spec_built": true, + "wrap_finished": true, + "should_skip": false, + "skip_reason": null, + "wrapper_tool": { + "name": "create_milestone", + "description": { + "tagline": "Create a new milestone in a project management system.", + "detailed": "This tool is used to create a milestone within a project management application. It should be called when there's a need to add a new milestone to track progress or set goals in a project. The tool confirms the creation of the milestone." + }, + "return_annotation": "Confirmation of the milestone creation.", + "arguments": [ + { + "name": "milestone_name", + "alternative_names": [ + "milestone_title", + "milestone_label" + ], + "description": "The name of the milestone to be created. This is the title that will be displayed for the milestone.", + "endpoint_argument_name": "name" + }, + { + "name": "project_id_for_milestone", + "alternative_names": [ + "milestone_project_id", + "project_reference_id" + ], + "description": "The unique identifier for the project to which this milestone belongs. Required for associating the milestone with the correct project.", + "endpoint_argument_name": "project_id" + }, + { + "name": "milestone_due_date", + "alternative_names": [ + "deadline", + "completion_date" + ], + "description": "Due date for this milestone in RFC 3339 format (e.g., 2023-12-31T23:59:59Z).", + "endpoint_argument_name": "due_date" + }, + { + "name": "account_id_for_project", + "alternative_names": [ + "project_account_id", + "account_identifier" + ], + "description": "Account ID for the project. This is needed to associate the milestone with the correct account.", + "endpoint_argument_name": "account_id" + } + ] + }, + "method": "POST", + "path": "/milestones", + "tags": [ + "milestones" + ], + "summary": "", + "description": "Create a milestone", + "requires_security": true, + "oauth_scopes": [], + "security_schemes": [ + "bearerAuth" + ], + "parameters": { + "query": [ + { + "name": "name", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "Name for this milestone" + }, + "description": "Name for this milestone", + "required": true, + "deprecated": false, + "default": null, + "location": "query", + "content_type": null, + "json_schema": { + "type": "string" + }, + "schema_required": false + }, + { + "name": "due_date", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "Due date for this milestone, in RFC 3339 format" + }, + "description": "Due date for this milestone, in RFC 3339 format", + "required": false, + "deprecated": false, + "default": null, + "location": "query", + "content_type": null, + "json_schema": { + "type": "string" + }, + "schema_required": false + }, + { + "name": "project_id", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "Project ID for this milestone" + }, + "description": "Project ID for this milestone", + "required": true, + "deprecated": false, + "default": null, + "location": "query", + "content_type": null, + "json_schema": { + "type": "string" + }, + "schema_required": false + }, + { + "name": "account_id", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "Account ID for this project" + }, + "description": "Account ID for this project", + "required": false, + "deprecated": false, + "default": null, + "location": "query", + "content_type": null, + "json_schema": { + "type": "string" + }, + "schema_required": false + } + ], + "path": [], + "header": [], + "cookie": [], + "body": [] + }, + "request_body_spec": null, + "use_request_body_schema_mode": false, + "validate_request_body_schema": false, + "use_flatten_mode": false + }, + { + "name": "DeleteMilestone", + "selected_for_wrapping": false, + "spec_built": true, + "wrap_finished": true, + "should_skip": false, + "skip_reason": null, + "wrapper_tool": { + "name": "delete_milestone", + "description": { + "tagline": "Delete a specific milestone using its ID.", + "detailed": "Use this tool to remove a milestone by providing its unique ID. This operation is irreversible and should be used when a milestone is no longer needed." + }, + "return_annotation": "Confirmation of milestone deletion.", + "arguments": [ + { + "name": "milestone_id", + "alternative_names": [ + "milestone_identifier", + "milestone_key" + ], + "description": "The unique ID of the milestone to be deleted. Ensure it is correct as this action is irreversible.", + "endpoint_argument_name": "id" + } + ] + }, + "method": "DELETE", + "path": "/milestones/{id}", + "tags": [ + "milestones" + ], + "summary": "", + "description": "Delete a milestone", + "requires_security": true, + "oauth_scopes": [], + "security_schemes": [ + "bearerAuth" + ], + "parameters": { + "query": [], + "path": [ + { + "name": "id", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The ID of the milestone to delete." + }, + "description": "The ID of the milestone to delete.", + "required": true, + "deprecated": false, + "default": null, + "location": "path", + "content_type": null, + "json_schema": { + "type": "string" + }, + "schema_required": false + } + ], + "header": [], + "cookie": [], + "body": [] + }, + "request_body_spec": null, + "use_request_body_schema_mode": false, + "validate_request_body_schema": false, + "use_flatten_mode": false + }, + { + "name": "UpdateMilestone", + "selected_for_wrapping": false, + "spec_built": true, + "wrap_finished": true, + "should_skip": false, + "skip_reason": null, + "wrapper_tool": { + "name": "update_milestone", + "description": { + "tagline": "Updates the details of a specific milestone.", + "detailed": "This tool is used to update information for a specific milestone in a project, identified by its ID." + }, + "return_annotation": "Confirmation of milestone update.", + "arguments": [ + { + "name": "milestone_id", + "alternative_names": [ + "milestone_identifier", + "id_of_milestone" + ], + "description": "The unique ID of the milestone to update.", + "endpoint_argument_name": "id" + }, + { + "name": "milestone_due_date", + "alternative_names": [ + "deadline_for_milestone", + "milestone_end_date" + ], + "description": "The due date for the milestone in RFC 3339 format (e.g., 2023-10-21T00:00:00Z).", + "endpoint_argument_name": "due_date" + }, + { + "name": "milestone_name", + "alternative_names": [ + "milestone_title", + "milestone_label" + ], + "description": "The new name for the milestone you want to update.", + "endpoint_argument_name": "name" + } + ] + }, + "method": "PATCH", + "path": "/milestones/{id}", + "tags": [ + "milestones" + ], + "summary": "", + "description": "Update a milestone", + "requires_security": true, + "oauth_scopes": [], + "security_schemes": [ + "bearerAuth" + ], + "parameters": { + "query": [], + "path": [ + { + "name": "id", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The ID of the milestone to update." + }, + "description": "The ID of the milestone to update.", + "required": true, + "deprecated": false, + "default": null, + "location": "path", + "content_type": null, + "json_schema": { + "type": "string" + }, + "schema_required": false + } + ], + "header": [], + "cookie": [], + "body": [ + { + "name": "due_date", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "Due date for this milestone, in RFC 3339 format" + }, + "description": "Due date for this milestone, in RFC 3339 format", + "required": false, + "deprecated": false, + "default": null, + "location": "body", + "content_type": "application/json", + "json_schema": { + "type": "string", + "description": "Due date for this milestone, in RFC 3339 format" + }, + "schema_required": false + }, + { + "name": "name", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "Name for this milestone" + }, + "description": "Name for this milestone", + "required": false, + "deprecated": false, + "default": null, + "location": "body", + "content_type": "application/json", + "json_schema": { + "type": "string", + "description": "Name for this milestone" + }, + "schema_required": false + } + ] + }, + "request_body_spec": "{\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"properties\": {\n \"due_date\": {\n \"description\": \"Due date for this milestone, in RFC 3339 format\",\n \"type\": \"string\",\n \"x-go-name\": \"DueDate\"\n },\n \"name\": {\n \"description\": \"Name for this milestone\",\n \"type\": \"string\",\n \"x-go-name\": \"Name\"\n }\n },\n \"type\": \"object\",\n \"x-go-package\": \"pylon/api/apiserver/endpoints\"\n }\n }\n },\n \"required\": false\n}", + "use_request_body_schema_mode": false, + "validate_request_body_schema": false, + "use_flatten_mode": true + }, + { + "name": "CreateProject", + "selected_for_wrapping": false, + "spec_built": true, + "wrap_finished": true, + "should_skip": false, + "skip_reason": null, + "wrapper_tool": { + "name": "create_new_project", + "description": { + "tagline": "Create a new project seamlessly.", + "detailed": "This tool is used to create a new project. It should be called when a user wants to initialize or start a new project within a system." + }, + "return_annotation": "Details about the newly created project.", + "arguments": [ + { + "name": "project_name", + "alternative_names": [ + "project_title", + "project_identifier" + ], + "description": "The name for the new project. This should be a descriptive and unique name to easily identify the project.", + "endpoint_argument_name": "name" + }, + { + "name": "account_id_for_project", + "alternative_names": [ + "project_account_id", + "associated_account_id" + ], + "description": "Account ID associated with the project. This identifies the account under which the project will be created.", + "endpoint_argument_name": "account_id" + }, + { + "name": "project_description_html", + "alternative_names": [ + "html_description_for_project", + "project_html_details" + ], + "description": "HTML formatted description for the project, including any necessary tags and formatting.", + "endpoint_argument_name": "description_html" + }, + { + "name": "start_date", + "alternative_names": [ + "project_start_date", + "initiation_date" + ], + "description": "Start date for the project in RFC 3339 format (e.g., 2023-03-10T14:00:00Z).", + "endpoint_argument_name": "start_date" + }, + { + "name": "project_end_date", + "alternative_names": [ + "end_project_date", + "completion_date" + ], + "description": "End date for the project in RFC 3339 format. Indicates when the project is expected to be finished.", + "endpoint_argument_name": "end_date" + }, + { + "name": "project_owner_id", + "alternative_names": [ + "owner_identifier", + "project_leader_id" + ], + "description": "The unique identifier for the owner of the project. This is a string that specifies who will be managing or leading the project.", + "endpoint_argument_name": "owner_id" + }, + { + "name": "project_template_id", + "alternative_names": [ + "template_identifier", + "project_template_identifier" + ], + "description": "The ID of the template to be used for creating this project. It should match an existing project template ID.", + "endpoint_argument_name": "project_template_id" + }, + { + "name": "customer_portal_visible", + "alternative_names": [ + "show_in_customer_portal", + "display_on_customer_portal" + ], + "description": "Boolean indicating if the project should be visible in the customer portal. True makes it visible.", + "endpoint_argument_name": "customer_portal_visible" + } + ] + }, + "method": "POST", + "path": "/projects", + "tags": [ + "projects" + ], + "summary": "", + "description": "Create a project", + "requires_security": true, + "oauth_scopes": [], + "security_schemes": [ + "bearerAuth" + ], + "parameters": { + "query": [ + { + "name": "name", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "Name for this project" + }, + "description": "Name for this project", + "required": true, + "deprecated": false, + "default": null, + "location": "query", + "content_type": null, + "json_schema": { + "type": "string" + }, + "schema_required": false + }, + { + "name": "description_html", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "Description HTML for this project" + }, + "description": "Description HTML for this project", + "required": false, + "deprecated": false, + "default": null, + "location": "query", + "content_type": null, + "json_schema": { + "type": "string" + }, + "schema_required": false + }, + { + "name": "customer_portal_visible", + "value_schema": { + "val_type": "boolean", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "Customer portal visible for this project" + }, + "description": "Customer portal visible for this project", + "required": false, + "deprecated": false, + "default": false, + "location": "query", + "content_type": null, + "json_schema": { + "type": "boolean" + }, + "schema_required": false + }, + { + "name": "start_date", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "Start date for this project, in RFC 3339 format" + }, + "description": "Start date for this project, in RFC 3339 format", + "required": false, + "deprecated": false, + "default": null, + "location": "query", + "content_type": null, + "json_schema": { + "type": "string" + }, + "schema_required": false + }, + { + "name": "end_date", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "End date for this project, in RFC 3339 format" + }, + "description": "End date for this project, in RFC 3339 format", + "required": false, + "deprecated": false, + "default": null, + "location": "query", + "content_type": null, + "json_schema": { + "type": "string" + }, + "schema_required": false + }, + { + "name": "account_id", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "Account ID for this project" + }, + "description": "Account ID for this project", + "required": true, + "deprecated": false, + "default": null, + "location": "query", + "content_type": null, + "json_schema": { + "type": "string" + }, + "schema_required": false + }, + { + "name": "owner_id", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "Owner ID for this project" + }, + "description": "Owner ID for this project", + "required": false, + "deprecated": false, + "default": null, + "location": "query", + "content_type": null, + "json_schema": { + "type": "string" + }, + "schema_required": false + }, + { + "name": "project_template_id", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "Project template ID for this project" + }, + "description": "Project template ID for this project", + "required": false, + "deprecated": false, + "default": null, + "location": "query", + "content_type": null, + "json_schema": { + "type": "string" + }, + "schema_required": false + } + ], + "path": [], + "header": [], + "cookie": [], + "body": [] + }, + "request_body_spec": null, + "use_request_body_schema_mode": false, + "validate_request_body_schema": false, + "use_flatten_mode": false + }, + { + "name": "DeleteProject", + "selected_for_wrapping": false, + "spec_built": true, + "wrap_finished": true, + "should_skip": false, + "skip_reason": null, + "wrapper_tool": { + "name": "delete_existing_project", + "description": { + "tagline": "Delete an existing project using its ID.", + "detailed": "Use this tool to delete an existing project by providing the project ID. It allows you to manage and remove projects that are no longer needed." + }, + "return_annotation": "Confirmation of project deletion.", + "arguments": [ + { + "name": "project_id", + "alternative_names": [ + "id_of_project", + "project_identifier" + ], + "description": "The unique identifier of the project to be deleted.", + "endpoint_argument_name": "id" + } + ] + }, + "method": "DELETE", + "path": "/projects/{id}", + "tags": [ + "projects" + ], + "summary": "", + "description": "Delete an existing project", + "requires_security": true, + "oauth_scopes": [], + "security_schemes": [ + "bearerAuth" + ], + "parameters": { + "query": [], + "path": [ + { + "name": "id", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The ID of the project to delete." + }, + "description": "The ID of the project to delete.", + "required": true, + "deprecated": false, + "default": null, + "location": "path", + "content_type": null, + "json_schema": { + "type": "string" + }, + "schema_required": false + } + ], + "header": [], + "cookie": [], + "body": [] + }, + "request_body_spec": null, + "use_request_body_schema_mode": false, + "validate_request_body_schema": false, + "use_flatten_mode": false + }, + { + "name": "UpdateProject", + "selected_for_wrapping": false, + "spec_built": true, + "wrap_finished": true, + "should_skip": false, + "skip_reason": null, + "wrapper_tool": { + "name": "update_project", + "description": { + "tagline": "Update the details of an existing project.", + "detailed": "Use this tool to modify the information of an existing project by providing the project ID and necessary updates." + }, + "return_annotation": "Confirmation that the project was updated.", + "arguments": [ + { + "name": "project_id", + "alternative_names": [ + "identifier", + "project_identifier" + ], + "description": "The unique identifier of the project to update.", + "endpoint_argument_name": "id" + }, + { + "name": "project_name", + "alternative_names": [ + "project_title", + "name_for_project" + ], + "description": "The new name for this project. Provide a descriptive title to identify the project.", + "endpoint_argument_name": "name" + }, + { + "name": "project_description_html", + "alternative_names": [ + "html_description", + "project_desc_html" + ], + "description": "HTML formatted description for the project.", + "endpoint_argument_name": "description_html" + }, + { + "name": "start_date_rfc3339", + "alternative_names": [ + "project_start_date", + "initiation_date" + ], + "description": "The start date for the project, formatted in RFC 3339. This specifies when the project begins.", + "endpoint_argument_name": "start_date" + }, + { + "name": "project_end_date", + "alternative_names": [ + "completion_date", + "finish_date" + ], + "description": "The end date for the project in RFC 3339 format.", + "endpoint_argument_name": "end_date" + }, + { + "name": "project_owner_id", + "alternative_names": [ + "project_lead_id", + "owner_identifier" + ], + "description": "The unique identifier of the owner of this project. Required to assign an owner when updating a project.", + "endpoint_argument_name": "owner_id" + }, + { + "name": "project_update_details", + "alternative_names": [ + "update_details", + "edit_details" + ], + "description": "A JSON object containing the project's update details such as name, description, visibility, dates, owner ID, and archive status.", + "endpoint_argument_name": "requestBody" + }, + { + "name": "is_customer_portal_visible", + "alternative_names": [ + "customer_portal_visible_status", + "visibility_for_customer_portal" + ], + "description": "Indicate if the project should be visible in the customer portal (true for visible, false for hidden).", + "endpoint_argument_name": "customer_portal_visible" + }, + { + "name": "is_project_archived", + "alternative_names": [ + "archive_project_status", + "set_archive_status" + ], + "description": "Set to True if the project is archived, False if it is active.", + "endpoint_argument_name": "is_archived" + } + ] + }, + "method": "PATCH", + "path": "/projects/{id}", + "tags": [ + "projects" + ], + "summary": "", + "description": "Update a project", + "requires_security": true, + "oauth_scopes": [], + "security_schemes": [ + "bearerAuth" + ], + "parameters": { + "query": [ + { + "name": "name", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "Name for this project" + }, + "description": "Name for this project", + "required": false, + "deprecated": false, + "default": null, + "location": "query", + "content_type": null, + "json_schema": { + "type": "string" + }, + "schema_required": false + }, + { + "name": "description_html", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "Description HTML for this project" + }, + "description": "Description HTML for this project", + "required": false, + "deprecated": false, + "default": null, + "location": "query", + "content_type": null, + "json_schema": { + "type": "string" + }, + "schema_required": false + }, + { + "name": "customer_portal_visible", + "value_schema": { + "val_type": "boolean", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "Customer portal visible for this project" + }, + "description": "Customer portal visible for this project", + "required": false, + "deprecated": false, + "default": null, + "location": "query", + "content_type": null, + "json_schema": { + "type": "boolean" + }, + "schema_required": false + }, + { + "name": "start_date", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "Start date for this project, in RFC 3339 format" + }, + "description": "Start date for this project, in RFC 3339 format", + "required": false, + "deprecated": false, + "default": null, + "location": "query", + "content_type": null, + "json_schema": { + "type": "string" + }, + "schema_required": false + }, + { + "name": "end_date", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "End date for this project, in RFC 3339 format" + }, + "description": "End date for this project, in RFC 3339 format", + "required": false, + "deprecated": false, + "default": null, + "location": "query", + "content_type": null, + "json_schema": { + "type": "string" + }, + "schema_required": false + }, + { + "name": "owner_id", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "Owner ID for this project" + }, + "description": "Owner ID for this project", + "required": false, + "deprecated": false, + "default": null, + "location": "query", + "content_type": null, + "json_schema": { + "type": "string" + }, + "schema_required": false + }, + { + "name": "is_archived", + "value_schema": { + "val_type": "boolean", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "Whether the project is archived" + }, + "description": "Whether the project is archived", + "required": false, + "deprecated": false, + "default": null, + "location": "query", + "content_type": null, + "json_schema": { + "type": "boolean" + }, + "schema_required": false + } + ], + "path": [ + { + "name": "id", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The ID of the project to update." + }, + "description": "The ID of the project to update.", + "required": true, + "deprecated": false, + "default": null, + "location": "path", + "content_type": null, + "json_schema": { + "type": "string" + }, + "schema_required": false + } + ], + "header": [], + "cookie": [], + "body": [ + { + "name": "requestBody", + "value_schema": { + "val_type": "json", + "inner_val_type": null, + "enum": null, + "properties": { + "customer_portal_visible": { + "val_type": "boolean", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "Customer portal visible for this project" + }, + "description_html": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "Description HTML for this project" + }, + "end_date": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "End date for this project, in RFC 3339 format" + }, + "is_archived": { + "val_type": "boolean", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "Whether the project is archived" + }, + "name": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "Name for this project" + }, + "owner_id": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "Owner ID for this project" + }, + "start_date": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "Start date for this project, in RFC 3339 format" + } + }, + "inner_properties": null, + "description": "" + }, + "description": "", + "required": false, + "deprecated": false, + "default": null, + "location": "body", + "content_type": "application/json", + "json_schema": { + "type": "object", + "properties": { + "customer_portal_visible": { + "type": "boolean", + "description": "Customer portal visible for this project" + }, + "description_html": { + "type": "string", + "description": "Description HTML for this project" + }, + "end_date": { + "type": "string", + "description": "End date for this project, in RFC 3339 format" + }, + "is_archived": { + "type": "boolean", + "description": "Whether the project is archived" + }, + "name": { + "type": "string", + "description": "Name for this project" + }, + "owner_id": { + "type": "string", + "description": "Owner ID for this project" + }, + "start_date": { + "type": "string", + "description": "Start date for this project, in RFC 3339 format" + } + } + }, + "schema_required": false + } + ] + }, + "request_body_spec": "{\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"properties\": {\n \"customer_portal_visible\": {\n \"description\": \"Customer portal visible for this project\",\n \"type\": \"boolean\",\n \"x-go-name\": \"CustomerPortalVisible\"\n },\n \"description_html\": {\n \"description\": \"Description HTML for this project\",\n \"type\": \"string\",\n \"x-go-name\": \"DescriptionHTML\"\n },\n \"end_date\": {\n \"description\": \"End date for this project, in RFC 3339 format\",\n \"type\": \"string\",\n \"x-go-name\": \"EndDate\"\n },\n \"is_archived\": {\n \"description\": \"Whether the project is archived\",\n \"type\": \"boolean\",\n \"x-go-name\": \"IsArchived\"\n },\n \"name\": {\n \"description\": \"Name for this project\",\n \"type\": \"string\",\n \"x-go-name\": \"Name\"\n },\n \"owner_id\": {\n \"description\": \"Owner ID for this project\",\n \"type\": \"string\",\n \"x-go-name\": \"OwnerID\"\n },\n \"start_date\": {\n \"description\": \"Start date for this project, in RFC 3339 format\",\n \"type\": \"string\",\n \"x-go-name\": \"StartDate\"\n }\n },\n \"type\": \"object\",\n \"x-go-package\": \"pylon/api/apiserver/endpoints\"\n }\n }\n },\n \"required\": false\n}", + "use_request_body_schema_mode": true, + "validate_request_body_schema": true, + "use_flatten_mode": false + }, + { + "name": "GetTags", + "selected_for_wrapping": false, + "spec_built": true, + "wrap_finished": true, + "should_skip": false, + "skip_reason": null, + "wrapper_tool": { + "name": "fetch_all_tags", + "description": { + "tagline": "Retrieve all available tags.", + "detailed": "Use this tool to obtain a comprehensive list of all tags. It is ideal for scenarios where you need to display or manage tags." + }, + "return_annotation": "A list of all available tags.", + "arguments": [] + }, + "method": "GET", + "path": "/tags", + "tags": [ + "tags" + ], + "summary": "", + "description": "Get all tags", + "requires_security": true, + "oauth_scopes": [], + "security_schemes": [ + "bearerAuth" + ], + "parameters": { + "query": [], + "path": [], + "header": [], + "cookie": [], + "body": [] + }, + "request_body_spec": null, + "use_request_body_schema_mode": false, + "validate_request_body_schema": false, + "use_flatten_mode": false + }, + { + "name": "CreateTag", + "selected_for_wrapping": false, + "spec_built": true, + "wrap_finished": true, + "should_skip": false, + "skip_reason": null, + "wrapper_tool": { + "name": "create_new_tag", + "description": { + "tagline": "Create a new tag within the system.", + "detailed": "This tool is used to create a new tag by sending a POST request to the /tags endpoint. It should be called when a user wants to add a new tag to the system for organizational or categorization purposes." + }, + "return_annotation": "Information about the newly created tag.", + "arguments": [ + { + "name": "tag_creation_details", + "alternative_names": [ + "new_tag_info", + "tag_data" + ], + "description": "A JSON object containing the details of the tag to be created: 'hex_color' for the color code, 'object_type' to specify the associated object ('account', 'issue', or 'contact'), and 'value' for the tag's name.", + "endpoint_argument_name": "requestBody" + } + ] + }, + "method": "POST", + "path": "/tags", + "tags": [ + "tags" + ], + "summary": "", + "description": "Create a new tag", + "requires_security": true, + "oauth_scopes": [], + "security_schemes": [ + "bearerAuth" + ], + "parameters": { + "query": [], + "path": [], + "header": [], + "cookie": [], + "body": [ + { + "name": "requestBody", + "value_schema": { + "val_type": "json", + "inner_val_type": null, + "enum": null, + "properties": { + "hex_color": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The hex code of the tag's color." + }, + "object_type": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The object type of the associated object. Can be \"account\", \"issue\", or \"contact\"." + }, + "value": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The tag value." + } + }, + "inner_properties": null, + "description": "" + }, + "description": "", + "required": false, + "deprecated": false, + "default": null, + "location": "body", + "content_type": "application/json", + "json_schema": { + "type": "object", + "properties": { + "hex_color": { + "type": "string", + "description": "The hex code of the tag's color." + }, + "object_type": { + "type": "string", + "description": "The object type of the associated object. Can be \"account\", \"issue\", or \"contact\"." + }, + "value": { + "type": "string", + "description": "The tag value." + } + }, + "required": [ + "object_type", + "value" + ] + }, + "schema_required": false + } + ] + }, + "request_body_spec": "{\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"properties\": {\n \"hex_color\": {\n \"description\": \"The hex code of the tag's color.\",\n \"type\": \"string\",\n \"x-go-name\": \"HexColor\"\n },\n \"object_type\": {\n \"description\": \"The object type of the associated object. Can be \\\"account\\\", \\\"issue\\\", or \\\"contact\\\".\",\n \"type\": \"string\",\n \"x-go-name\": \"ObjectType\"\n },\n \"value\": {\n \"description\": \"The tag value.\",\n \"type\": \"string\",\n \"x-go-name\": \"Value\"\n }\n },\n \"required\": [\n \"object_type\",\n \"value\"\n ],\n \"type\": \"object\",\n \"x-go-package\": \"pylon/api/apiserver/endpoints\"\n }\n }\n },\n \"required\": false\n}", + "use_request_body_schema_mode": true, + "validate_request_body_schema": true, + "use_flatten_mode": false + }, + { + "name": "DeleteTag", + "selected_for_wrapping": false, + "spec_built": true, + "wrap_finished": true, + "should_skip": false, + "skip_reason": null, + "wrapper_tool": { + "name": "delete_existing_tag", + "description": { + "tagline": "Delete an existing tag by ID.", + "detailed": "Use this tool to delete an existing tag by specifying its ID. It confirms whether the deletion was successful." + }, + "return_annotation": "Confirmation of tag deletion.", + "arguments": [ + { + "name": "tag_id", + "alternative_names": [ + "id_of_tag", + "tag_identifier" + ], + "description": "The unique identifier of the tag to delete. Provide this ID to specify which tag should be removed.", + "endpoint_argument_name": "id" + } + ] + }, + "method": "DELETE", + "path": "/tags/{id}", + "tags": [ + "tags" + ], + "summary": "", + "description": "Delete an existing tag", + "requires_security": true, + "oauth_scopes": [], + "security_schemes": [ + "bearerAuth" + ], + "parameters": { + "query": [], + "path": [ + { + "name": "id", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The ID of the tag to update." + }, + "description": "The ID of the tag to update.", + "required": true, + "deprecated": false, + "default": null, + "location": "path", + "content_type": null, + "json_schema": { + "type": "string" + }, + "schema_required": false + } + ], + "header": [], + "cookie": [], + "body": [] + }, + "request_body_spec": null, + "use_request_body_schema_mode": false, + "validate_request_body_schema": false, + "use_flatten_mode": false + }, + { + "name": "GetTag", + "selected_for_wrapping": false, + "spec_built": true, + "wrap_finished": true, + "should_skip": false, + "skip_reason": null, + "wrapper_tool": { + "name": "get_tag_by_id", + "description": { + "tagline": "Retrieve tag details using a specified ID.", + "detailed": "" + }, + "return_annotation": "Tag details for the specified ID.", + "arguments": [ + { + "name": "tag_id", + "alternative_names": [ + "tag_identifier", + "tag_reference" + ], + "description": "The unique identifier for the tag to retrieve details.", + "endpoint_argument_name": "id" + } + ] + }, + "method": "GET", + "path": "/tags/{id}", + "tags": [ + "tags" + ], + "summary": "", + "description": "Get a tag by its ID", + "requires_security": true, + "oauth_scopes": [], + "security_schemes": [ + "bearerAuth" + ], + "parameters": { + "query": [], + "path": [ + { + "name": "id", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The ID of the tag." + }, + "description": "The ID of the tag.", + "required": true, + "deprecated": false, + "default": null, + "location": "path", + "content_type": null, + "json_schema": { + "type": "string" + }, + "schema_required": false + } + ], + "header": [], + "cookie": [], + "body": [] + }, + "request_body_spec": null, + "use_request_body_schema_mode": false, + "validate_request_body_schema": false, + "use_flatten_mode": false + }, + { + "name": "UpdateTag", + "selected_for_wrapping": false, + "spec_built": true, + "wrap_finished": true, + "should_skip": false, + "skip_reason": null, + "wrapper_tool": { + "name": "update_existing_tag", + "description": { + "tagline": "Update an existing tag's information.", + "detailed": "Use this tool to modify the details of an already existing tag. It should be called when changes to tag attributes are needed." + }, + "return_annotation": "Confirmation of tag update completion.", + "arguments": [ + { + "name": "tag_id", + "alternative_names": [ + "tag_identifier", + "tag_id_number" + ], + "description": "The unique identifier of the tag that needs to be updated.", + "endpoint_argument_name": "id" + }, + { + "name": "tag_hex_color", + "alternative_names": [ + "tag_color_code", + "hex_color_value" + ], + "description": "The hex code representing the tag's color. Must be a valid six-digit hexadecimal value prefixed with '#'.", + "endpoint_argument_name": "hex_color" + }, + { + "name": "tag_name", + "alternative_names": [ + "tag_label", + "tag_title" + ], + "description": "The new name for the tag to be updated.", + "endpoint_argument_name": "value" + } + ] + }, + "method": "PATCH", + "path": "/tags/{id}", + "tags": [ + "tags" + ], + "summary": "", + "description": "Update an existing tag", + "requires_security": true, + "oauth_scopes": [], + "security_schemes": [ + "bearerAuth" + ], + "parameters": { + "query": [], + "path": [ + { + "name": "id", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The ID of the tag to update." + }, + "description": "The ID of the tag to update.", + "required": true, + "deprecated": false, + "default": null, + "location": "path", + "content_type": null, + "json_schema": { + "type": "string" + }, + "schema_required": false + } + ], + "header": [], + "cookie": [], + "body": [ + { + "name": "hex_color", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The hex code of the tag's color." + }, + "description": "The hex code of the tag's color.", + "required": false, + "deprecated": false, + "default": null, + "location": "body", + "content_type": "application/json", + "json_schema": { + "type": "string", + "description": "The hex code of the tag's color." + }, + "schema_required": false + }, + { + "name": "value", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "in: body\n\nThe name of the tag." + }, + "description": "in: body\n\nThe name of the tag.", + "required": false, + "deprecated": false, + "default": null, + "location": "body", + "content_type": "application/json", + "json_schema": { + "type": "string", + "description": "in: body\n\nThe name of the tag." + }, + "schema_required": false + } + ] + }, + "request_body_spec": "{\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"properties\": {\n \"hex_color\": {\n \"description\": \"The hex code of the tag's color.\",\n \"type\": \"string\",\n \"x-go-name\": \"HexColor\"\n },\n \"value\": {\n \"description\": \"in: body\\n\\nThe name of the tag.\",\n \"type\": \"string\",\n \"x-go-name\": \"Value\"\n }\n },\n \"type\": \"object\",\n \"x-go-package\": \"pylon/api/apiserver/endpoints\"\n }\n }\n },\n \"required\": false\n}", + "use_request_body_schema_mode": false, + "validate_request_body_schema": false, + "use_flatten_mode": true + }, + { + "name": "CreateTask", + "selected_for_wrapping": false, + "spec_built": true, + "wrap_finished": true, + "should_skip": false, + "skip_reason": null, + "wrapper_tool": { + "name": "create_task", + "description": { + "tagline": "Create a new task with specified parameters.", + "detailed": "Use this tool to create a task. It should be called when a new task needs to be added to the system, specifying necessary parameters." + }, + "return_annotation": "Details of the newly created task.", + "arguments": [ + { + "name": "task_title", + "alternative_names": [ + "task_name", + "title_of_task" + ], + "description": "The title of the task to be created. It should summarize the task clearly and concisely.", + "endpoint_argument_name": "title" + }, + { + "name": "task_body_html", + "alternative_names": [ + "task_description_html", + "content_html" + ], + "description": "HTML content for the task body. Provide detailed information or instructions here using HTML formatting.", + "endpoint_argument_name": "body_html" + }, + { + "name": "milestone_id", + "alternative_names": [ + "task_milestone_id", + "project_milestone_identifier" + ], + "description": "Unique identifier for the milestone associated with the task.", + "endpoint_argument_name": "milestone_id" + }, + { + "name": "task_status", + "alternative_names": [ + "status_of_task", + "task_progress_status" + ], + "description": "Set the task's current status: 'not_started', 'in_progress', or 'completed'.", + "endpoint_argument_name": "status" + }, + { + "name": "task_due_date", + "alternative_names": [ + "task_deadline", + "due_date" + ], + "description": "Due date for the task, formatted in RFC 3339. Specify the date by which the task should be completed.", + "endpoint_argument_name": "due_date" + }, + { + "name": "task_assignee_id", + "alternative_names": [ + "assignee_identifier", + "assigned_user_id" + ], + "description": "The ID of the user to whom the task is assigned. It should be a valid user ID in the system.", + "endpoint_argument_name": "assignee_id" + }, + { + "name": "account_id_for_task", + "alternative_names": [ + "task_account_id", + "id_for_task_account" + ], + "description": "Specify the Account ID associated with this task.", + "endpoint_argument_name": "account_id" + }, + { + "name": "project_id", + "alternative_names": [ + "task_project_id", + "project_identifier" + ], + "description": "Unique identifier for the project to which this task belongs.", + "endpoint_argument_name": "project_id" + }, + { + "name": "make_customer_portal_visible", + "alternative_names": [ + "enable_customer_portal_visibility", + "set_customer_portal_visible" + ], + "description": "Set to true to make the task visible on the customer portal, false to hide it.", + "endpoint_argument_name": "customer_portal_visible" + } + ] + }, + "method": "POST", + "path": "/tasks", + "tags": [ + "tasks" + ], + "summary": "", + "description": "Create a task", + "requires_security": true, + "oauth_scopes": [], + "security_schemes": [ + "bearerAuth" + ], + "parameters": { + "query": [ + { + "name": "title", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "Title for this task" + }, + "description": "Title for this task", + "required": true, + "deprecated": false, + "default": null, + "location": "query", + "content_type": null, + "json_schema": { + "type": "string" + }, + "schema_required": false + }, + { + "name": "body_html", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "Body HTML for this task" + }, + "description": "Body HTML for this task", + "required": false, + "deprecated": false, + "default": null, + "location": "query", + "content_type": null, + "json_schema": { + "type": "string" + }, + "schema_required": false + }, + { + "name": "milestone_id", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "Milestone ID for this task" + }, + "description": "Milestone ID for this task", + "required": false, + "deprecated": false, + "default": null, + "location": "query", + "content_type": null, + "json_schema": { + "type": "string" + }, + "schema_required": false + }, + { + "name": "status", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": [ + "not_started", + "in_progress", + "completed" + ], + "properties": null, + "inner_properties": null, + "description": "Status for this task\n\nnot_started TaskStatusNotStarted\n\nin_progress TaskStatusInProgress\n\ncompleted TaskStatusCompleted" + }, + "description": "Status for this task\n\nnot_started TaskStatusNotStarted\n\nin_progress TaskStatusInProgress\n\ncompleted TaskStatusCompleted", + "required": false, + "deprecated": false, + "default": null, + "location": "query", + "content_type": null, + "json_schema": { + "type": "string", + "enum": [ + "not_started", + "in_progress", + "completed" + ] + }, + "schema_required": false + }, + { + "name": "customer_portal_visible", + "value_schema": { + "val_type": "boolean", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "Customer portal visible for this task" + }, + "description": "Customer portal visible for this task", + "required": false, + "deprecated": false, + "default": false, + "location": "query", + "content_type": null, + "json_schema": { + "type": "boolean" + }, + "schema_required": false + }, + { + "name": "due_date", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "Due date for this task, in RFC 3339 format" + }, + "description": "Due date for this task, in RFC 3339 format", + "required": false, + "deprecated": false, + "default": null, + "location": "query", + "content_type": null, + "json_schema": { + "type": "string" + }, + "schema_required": false + }, + { + "name": "assignee_id", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "Assignee ID for this task" + }, + "description": "Assignee ID for this task", + "required": false, + "deprecated": false, + "default": null, + "location": "query", + "content_type": null, + "json_schema": { + "type": "string" + }, + "schema_required": false + }, + { + "name": "account_id", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "Account ID for this task" + }, + "description": "Account ID for this task", + "required": false, + "deprecated": false, + "default": null, + "location": "query", + "content_type": null, + "json_schema": { + "type": "string" + }, + "schema_required": false + }, + { + "name": "project_id", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "Project ID for this task" + }, + "description": "Project ID for this task", + "required": false, + "deprecated": false, + "default": null, + "location": "query", + "content_type": null, + "json_schema": { + "type": "string" + }, + "schema_required": false + } + ], + "path": [], + "header": [], + "cookie": [], + "body": [] + }, + "request_body_spec": null, + "use_request_body_schema_mode": false, + "validate_request_body_schema": false, + "use_flatten_mode": false + }, + { + "name": "DeleteTask", + "selected_for_wrapping": false, + "spec_built": true, + "wrap_finished": true, + "should_skip": false, + "skip_reason": null, + "wrapper_tool": { + "name": "delete_task", + "description": { + "tagline": "Delete an existing task by ID.", + "detailed": "Use this tool to delete a specific task by its ID. Call it when you need to remove a task permanently from the system." + }, + "return_annotation": "Confirmation of task deletion.", + "arguments": [ + { + "name": "task_id", + "alternative_names": [ + "task_identifier", + "task_id_value" + ], + "description": "The unique identifier of the task to be deleted.", + "endpoint_argument_name": "id" + } + ] + }, + "method": "DELETE", + "path": "/tasks/{id}", + "tags": [ + "tasks" + ], + "summary": "", + "description": "Delete an existing task", + "requires_security": true, + "oauth_scopes": [], + "security_schemes": [ + "bearerAuth" + ], + "parameters": { + "query": [], + "path": [ + { + "name": "id", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The ID of the task to delete." + }, + "description": "The ID of the task to delete.", + "required": true, + "deprecated": false, + "default": null, + "location": "path", + "content_type": null, + "json_schema": { + "type": "string" + }, + "schema_required": false + } + ], + "header": [], + "cookie": [], + "body": [] + }, + "request_body_spec": null, + "use_request_body_schema_mode": false, + "validate_request_body_schema": false, + "use_flatten_mode": false + }, + { + "name": "UpdateTask", + "selected_for_wrapping": false, + "spec_built": true, + "wrap_finished": true, + "should_skip": false, + "skip_reason": null, + "wrapper_tool": { + "name": "update_task", + "description": { + "tagline": "Update the details of an existing task.", + "detailed": "Use this tool to modify the information of a specific task by providing its ID. Ideal for updating any details like status, description, or due date." + }, + "return_annotation": "Confirmation of task update.", + "arguments": [ + { + "name": "task_id", + "alternative_names": [ + "task_identifier", + "task_key" + ], + "description": "The unique ID of the task you want to update.", + "endpoint_argument_name": "id" + }, + { + "name": "assignee_id", + "alternative_names": [ + "task_assignee_id", + "responsible_person_id" + ], + "description": "The ID of the person assigned to this task. It should be a string representing a valid user ID within the system.", + "endpoint_argument_name": "assignee_id" + }, + { + "name": "task_body_html", + "alternative_names": [ + "task_description_html", + "html_content" + ], + "description": "HTML content for the task's body. This defines the main description or details of the task.", + "endpoint_argument_name": "body_html" + }, + { + "name": "task_due_date", + "alternative_names": [ + "task_deadline", + "completion_date" + ], + "description": "Due date for the task in RFC 3339 format, e.g., '2023-12-31T23:59:59Z'.", + "endpoint_argument_name": "due_date" + }, + { + "name": "milestone_identifier", + "alternative_names": [ + "milestone_reference", + "milestone_key" + ], + "description": "Specify the Milestone ID associated with the task to update its milestone.", + "endpoint_argument_name": "milestone_id" + }, + { + "name": "project_id", + "alternative_names": [ + "task_project_id", + "associated_project_id" + ], + "description": "The unique identifier of the project associated with this task. Required to specify which project's task is being updated.", + "endpoint_argument_name": "project_id" + }, + { + "name": "task_status", + "alternative_names": [ + "task_progress_status", + "current_task_status" + ], + "description": "Specify the task status: `not_started`, `in_progress`, or `completed`.", + "endpoint_argument_name": "status" + }, + { + "name": "task_title", + "alternative_names": [ + "task_name", + "title_of_task" + ], + "description": "The new title for the task. Provide a clear and concise title for better understanding.", + "endpoint_argument_name": "title" + }, + { + "name": "customer_portal_visible", + "alternative_names": [ + "is_customer_portal_visible", + "show_on_customer_portal" + ], + "description": "Set to true to make the task visible on the customer portal. Accepts a boolean.", + "endpoint_argument_name": "customer_portal_visible" + } + ] + }, + "method": "PATCH", + "path": "/tasks/{id}", + "tags": [ + "tasks" + ], + "summary": "", + "description": "Update a task", + "requires_security": true, + "oauth_scopes": [], + "security_schemes": [ + "bearerAuth" + ], + "parameters": { + "query": [], + "path": [ + { + "name": "id", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The ID of the task to update." + }, + "description": "The ID of the task to update.", + "required": true, + "deprecated": false, + "default": null, + "location": "path", + "content_type": null, + "json_schema": { + "type": "string" + }, + "schema_required": false + } + ], + "header": [], + "cookie": [], + "body": [ + { + "name": "assignee_id", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "Assignee ID for this task" + }, + "description": "Assignee ID for this task", + "required": false, + "deprecated": false, + "default": null, + "location": "body", + "content_type": "application/json", + "json_schema": { + "type": "string", + "description": "Assignee ID for this task" + }, + "schema_required": false + }, + { + "name": "body_html", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "Body HTML for this task" + }, + "description": "Body HTML for this task", + "required": false, + "deprecated": false, + "default": null, + "location": "body", + "content_type": "application/json", + "json_schema": { + "type": "string", + "description": "Body HTML for this task" + }, + "schema_required": false + }, + { + "name": "customer_portal_visible", + "value_schema": { + "val_type": "boolean", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "Customer portal visible for this task" + }, + "description": "Customer portal visible for this task", + "required": false, + "deprecated": false, + "default": null, + "location": "body", + "content_type": "application/json", + "json_schema": { + "type": "boolean", + "description": "Customer portal visible for this task" + }, + "schema_required": false + }, + { + "name": "due_date", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "Due date for this task, in RFC 3339 format" + }, + "description": "Due date for this task, in RFC 3339 format", + "required": false, + "deprecated": false, + "default": null, + "location": "body", + "content_type": "application/json", + "json_schema": { + "type": "string", + "description": "Due date for this task, in RFC 3339 format" + }, + "schema_required": false + }, + { + "name": "milestone_id", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "Milestone ID for this task" + }, + "description": "Milestone ID for this task", + "required": false, + "deprecated": false, + "default": null, + "location": "body", + "content_type": "application/json", + "json_schema": { + "type": "string", + "description": "Milestone ID for this task" + }, + "schema_required": false + }, + { + "name": "project_id", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "Project ID for this task" + }, + "description": "Project ID for this task", + "required": false, + "deprecated": false, + "default": null, + "location": "body", + "content_type": "application/json", + "json_schema": { + "type": "string", + "description": "Project ID for this task" + }, + "schema_required": false + }, + { + "name": "status", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": [ + "not_started", + "in_progress", + "completed" + ], + "properties": null, + "inner_properties": null, + "description": "Status for this task\n\n* not_started TaskStatusNotStarted\n\n* in_progress TaskStatusInProgress\n\n* completed TaskStatusCompleted" + }, + "description": "Status for this task\n\n* not_started TaskStatusNotStarted\n\n* in_progress TaskStatusInProgress\n\n* completed TaskStatusCompleted", + "required": false, + "deprecated": false, + "default": null, + "location": "body", + "content_type": "application/json", + "json_schema": { + "type": "string", + "description": "Status for this task\n\n* not_started TaskStatusNotStarted\n\n* in_progress TaskStatusInProgress\n\n* completed TaskStatusCompleted", + "enum": [ + "not_started", + "in_progress", + "completed" + ] + }, + "schema_required": false + }, + { + "name": "title", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "Title for this task" + }, + "description": "Title for this task", + "required": false, + "deprecated": false, + "default": null, + "location": "body", + "content_type": "application/json", + "json_schema": { + "type": "string", + "description": "Title for this task" + }, + "schema_required": false + } + ] + }, + "request_body_spec": "{\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"properties\": {\n \"assignee_id\": {\n \"description\": \"Assignee ID for this task\",\n \"type\": \"string\",\n \"x-go-name\": \"AssigneeID\"\n },\n \"body_html\": {\n \"description\": \"Body HTML for this task\",\n \"type\": \"string\",\n \"x-go-name\": \"BodyHTML\"\n },\n \"customer_portal_visible\": {\n \"description\": \"Customer portal visible for this task\",\n \"type\": \"boolean\",\n \"x-go-name\": \"CustomerPortalVisible\"\n },\n \"due_date\": {\n \"description\": \"Due date for this task, in RFC 3339 format\",\n \"type\": \"string\",\n \"x-go-name\": \"DueDate\"\n },\n \"milestone_id\": {\n \"description\": \"Milestone ID for this task\",\n \"type\": \"string\",\n \"x-go-name\": \"MilestoneID\"\n },\n \"project_id\": {\n \"description\": \"Project ID for this task\",\n \"type\": \"string\",\n \"x-go-name\": \"ProjectID\"\n },\n \"status\": {\n \"description\": \"Status for this task\\n\\n* not_started TaskStatusNotStarted\\n\\n* in_progress TaskStatusInProgress\\n\\n* completed TaskStatusCompleted\",\n \"enum\": [\n \"not_started\",\n \"in_progress\",\n \"completed\"\n ],\n \"type\": \"string\",\n \"x-go-enum-desc\": \"not_started TaskStatusNotStarted\\nin_progress TaskStatusInProgress\\ncompleted TaskStatusCompleted\",\n \"x-go-name\": \"Status\"\n },\n \"title\": {\n \"description\": \"Title for this task\",\n \"type\": \"string\",\n \"x-go-name\": \"Title\"\n }\n },\n \"type\": \"object\",\n \"x-go-package\": \"pylon/api/apiserver/endpoints\"\n }\n }\n },\n \"required\": false\n}", + "use_request_body_schema_mode": false, + "validate_request_body_schema": false, + "use_flatten_mode": true + }, + { + "name": "GetTeams", + "selected_for_wrapping": false, + "spec_built": true, + "wrap_finished": true, + "should_skip": false, + "skip_reason": null, + "wrapper_tool": { + "name": "fetch_team_list", + "description": { + "tagline": "Retrieve the list of available teams.", + "detailed": "Use this tool to get a list of all teams from the service. Useful for displaying team information or selecting a team from the list." + }, + "return_annotation": "A list of teams available.", + "arguments": [] + }, + "method": "GET", + "path": "/teams", + "tags": [ + "teams" + ], + "summary": "", + "description": "Get a list of teams", + "requires_security": true, + "oauth_scopes": [], + "security_schemes": [ + "bearerAuth" + ], + "parameters": { + "query": [], + "path": [], + "header": [], + "cookie": [], + "body": [] + }, + "request_body_spec": null, + "use_request_body_schema_mode": false, + "validate_request_body_schema": false, + "use_flatten_mode": false + }, + { + "name": "CreateTeam", + "selected_for_wrapping": false, + "spec_built": true, + "wrap_finished": true, + "should_skip": false, + "skip_reason": null, + "wrapper_tool": { + "name": "create_new_team", + "description": { + "tagline": "Create a new team for collaboration.", + "detailed": "Use this tool to create a new team on the platform, facilitating collaboration and organization. It returns details about the newly created team." + }, + "return_annotation": "Information about the newly created team.", + "arguments": [ + { + "name": "team_name", + "alternative_names": [ + "new_team_name", + "team_title" + ], + "description": "The name to assign to the newly created team.", + "endpoint_argument_name": "name" + }, + { + "name": "user_ids_to_add", + "alternative_names": [ + "add_user_ids", + "team_user_ids" + ], + "description": "A list of user IDs to include in the new team. Each user ID should be a string.", + "endpoint_argument_name": "user_ids" + } + ] + }, + "method": "POST", + "path": "/teams", + "tags": [ + "teams" + ], + "summary": "", + "description": "Create a new team", + "requires_security": true, + "oauth_scopes": [], + "security_schemes": [ + "bearerAuth" + ], + "parameters": { + "query": [], + "path": [], + "header": [], + "cookie": [], + "body": [ + { + "name": "name", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The name of the team." + }, + "description": "The name of the team.", + "required": false, + "deprecated": false, + "default": null, + "location": "body", + "content_type": "application/json", + "json_schema": { + "type": "string", + "description": "The name of the team." + }, + "schema_required": false + }, + { + "name": "user_ids", + "value_schema": { + "val_type": "array", + "inner_val_type": "string", + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The list of user IDs to add to the team." + }, + "description": "The list of user IDs to add to the team.", + "required": false, + "deprecated": false, + "default": null, + "location": "body", + "content_type": "application/json", + "json_schema": { + "type": "array", + "description": "The list of user IDs to add to the team.", + "items": { + "type": "string" + } + }, + "schema_required": false + } + ] + }, + "request_body_spec": "{\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"properties\": {\n \"name\": {\n \"description\": \"The name of the team.\",\n \"type\": \"string\",\n \"x-go-name\": \"Name\"\n },\n \"user_ids\": {\n \"description\": \"The list of user IDs to add to the team.\",\n \"items\": {\n \"type\": \"string\"\n },\n \"type\": \"array\",\n \"x-go-name\": \"UserIDs\"\n }\n },\n \"type\": \"object\",\n \"x-go-package\": \"pylon/api/apiserver/endpoints\"\n }\n }\n },\n \"required\": false\n}", + "use_request_body_schema_mode": false, + "validate_request_body_schema": false, + "use_flatten_mode": true + }, + { + "name": "GetTeam", + "selected_for_wrapping": false, + "spec_built": true, + "wrap_finished": true, + "should_skip": false, + "skip_reason": null, + "wrapper_tool": { + "name": "get_team_by_id", + "description": { + "tagline": "Retrieve team details using the team's ID.", + "detailed": "Use this tool to get detailed information about a team by specifying its unique ID." + }, + "return_annotation": "Team information based on the provided ID.", + "arguments": [ + { + "name": "team_id", + "alternative_names": [ + "team_identifier", + "team_key" + ], + "description": "The unique ID of the team to retrieve details for.", + "endpoint_argument_name": "id" + } + ] + }, + "method": "GET", + "path": "/teams/{id}", + "tags": [ + "teams" + ], + "summary": "", + "description": "Get a team by its ID", + "requires_security": true, + "oauth_scopes": [], + "security_schemes": [ + "bearerAuth" + ], + "parameters": { + "query": [], + "path": [ + { + "name": "id", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The ID of the team to fetch." + }, + "description": "The ID of the team to fetch.", + "required": true, + "deprecated": false, + "default": null, + "location": "path", + "content_type": null, + "json_schema": { + "type": "string" + }, + "schema_required": false + } + ], + "header": [], + "cookie": [], + "body": [] + }, + "request_body_spec": null, + "use_request_body_schema_mode": false, + "validate_request_body_schema": false, + "use_flatten_mode": false + }, + { + "name": "UpdateTeam", + "selected_for_wrapping": false, + "spec_built": true, + "wrap_finished": true, + "should_skip": false, + "skip_reason": null, + "wrapper_tool": { + "name": "update_existing_team", + "description": { + "tagline": "Update details of an existing team.", + "detailed": "Use this tool to modify the information of an existing team. Ideal for updating team names, members, or other details." + }, + "return_annotation": "Updated team information.", + "arguments": [ + { + "name": "team_id", + "alternative_names": [ + "team_identifier", + "team_update_id" + ], + "description": "The ID of the team to update.", + "endpoint_argument_name": "id" + }, + { + "name": "team_name", + "alternative_names": [ + "group_name", + "organization_name" + ], + "description": "The new name for the team to be updated.", + "endpoint_argument_name": "name" + }, + { + "name": "team_member_user_ids", + "alternative_names": [ + "user_ids_list", + "team_user_ids" + ], + "description": "The list of user IDs to set as team members. This updates the team to include only these users.", + "endpoint_argument_name": "user_ids" + } + ] + }, + "method": "PATCH", + "path": "/teams/{id}", + "tags": [ + "teams" + ], + "summary": "", + "description": "Update an existing team", + "requires_security": true, + "oauth_scopes": [], + "security_schemes": [ + "bearerAuth" + ], + "parameters": { + "query": [], + "path": [ + { + "name": "id", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The ID of the team to update." + }, + "description": "The ID of the team to update.", + "required": true, + "deprecated": false, + "default": null, + "location": "path", + "content_type": null, + "json_schema": { + "type": "string" + }, + "schema_required": false + } + ], + "header": [], + "cookie": [], + "body": [ + { + "name": "name", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The name of the team." + }, + "description": "The name of the team.", + "required": false, + "deprecated": false, + "default": null, + "location": "body", + "content_type": "application/json", + "json_schema": { + "type": "string", + "description": "The name of the team." + }, + "schema_required": false + }, + { + "name": "user_ids", + "value_schema": { + "val_type": "array", + "inner_val_type": "string", + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The list of user IDs to add to the team. If provided, the team members will be updated to be exactly the given users." + }, + "description": "The list of user IDs to add to the team. If provided, the team members will be updated to be exactly the given users.", + "required": false, + "deprecated": false, + "default": null, + "location": "body", + "content_type": "application/json", + "json_schema": { + "type": "array", + "description": "The list of user IDs to add to the team. If provided, the team members will be updated to be exactly the given users.", + "items": { + "type": "string" + } + }, + "schema_required": false + } + ] + }, + "request_body_spec": "{\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"properties\": {\n \"name\": {\n \"description\": \"The name of the team.\",\n \"type\": \"string\",\n \"x-go-name\": \"Name\"\n },\n \"user_ids\": {\n \"description\": \"The list of user IDs to add to the team. If provided, the team members will be updated to be exactly the given users.\",\n \"items\": {\n \"type\": \"string\"\n },\n \"type\": \"array\",\n \"x-go-name\": \"UserIDs\"\n }\n },\n \"type\": \"object\",\n \"x-go-package\": \"pylon/api/apiserver/endpoints\"\n }\n }\n },\n \"required\": false\n}", + "use_request_body_schema_mode": false, + "validate_request_body_schema": false, + "use_flatten_mode": true + }, + { + "name": "GetTicketForms", + "selected_for_wrapping": false, + "spec_built": true, + "wrap_finished": true, + "should_skip": false, + "skip_reason": null, + "wrapper_tool": { + "name": "get_ticket_forms", + "description": { + "tagline": "Retrieve a list of ticket forms available.", + "detailed": "This tool fetches a list of ticket forms, which can be used to understand the structure of available forms for managing tickets. It should be called when you need to review or select from ticket forms." + }, + "return_annotation": "List of available ticket forms.", + "arguments": [] + }, + "method": "GET", + "path": "/ticket-forms", + "tags": [ + "ticket-forms" + ], + "summary": "", + "description": "Get a list of ticket forms", + "requires_security": true, + "oauth_scopes": [], + "security_schemes": [ + "bearerAuth" + ], + "parameters": { + "query": [], + "path": [], + "header": [], + "cookie": [], + "body": [] + }, + "request_body_spec": null, + "use_request_body_schema_mode": false, + "validate_request_body_schema": false, + "use_flatten_mode": false + }, + { + "name": "GetTicketForm", + "selected_for_wrapping": false, + "spec_built": true, + "wrap_finished": true, + "should_skip": false, + "skip_reason": null, + "wrapper_tool": { + "name": "get_ticket_form", + "description": { + "tagline": "Retrieve detailed information about a ticket form.", + "detailed": "Call this tool to obtain detailed information for a specific ticket form by providing its ID." + }, + "return_annotation": "Details of the specified ticket form.", + "arguments": [ + { + "name": "ticket_form_id", + "alternative_names": [ + "form_id", + "ticket_id" + ], + "description": "The unique ID of the ticket form to retrieve.", + "endpoint_argument_name": "id" + } + ] + }, + "method": "GET", + "path": "/ticket-forms/{id}", + "tags": [ + "ticket-forms" + ], + "summary": "", + "description": "Get a ticket form", + "requires_security": true, + "oauth_scopes": [], + "security_schemes": [ + "bearerAuth" + ], + "parameters": { + "query": [], + "path": [ + { + "name": "id", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The ID of the ticket form to fetch." + }, + "description": "The ID of the ticket form to fetch.", + "required": true, + "deprecated": false, + "default": null, + "location": "path", + "content_type": null, + "json_schema": { + "type": "string" + }, + "schema_required": false + } + ], + "header": [], + "cookie": [], + "body": [] + }, + "request_body_spec": null, + "use_request_body_schema_mode": false, + "validate_request_body_schema": false, + "use_flatten_mode": false + }, + { + "name": "ListTrainingData", + "selected_for_wrapping": false, + "spec_built": true, + "wrap_finished": true, + "should_skip": false, + "skip_reason": null, + "wrapper_tool": { + "name": "list_training_data", + "description": { + "tagline": "Fetches all training data configurations for the organization.", + "detailed": "Use this tool to retrieve a comprehensive list of training data configurations associated with the organization. Ideal for managing or reviewing training datasets." + }, + "return_annotation": "List of training data configurations for the organization.", + "arguments": [] + }, + "method": "GET", + "path": "/training-data", + "tags": [ + "training-data" + ], + "summary": "Retrieves a list of all training data configurations for the organization.", + "description": "", + "requires_security": true, + "oauth_scopes": [], + "security_schemes": [ + "bearerAuth" + ], + "parameters": { + "query": [], + "path": [], + "header": [], + "cookie": [], + "body": [] + }, + "request_body_spec": null, + "use_request_body_schema_mode": false, + "validate_request_body_schema": false, + "use_flatten_mode": false + }, + { + "name": "CreateTrainingData", + "selected_for_wrapping": false, + "spec_built": true, + "wrap_finished": true, + "should_skip": false, + "skip_reason": null, + "wrapper_tool": { + "name": "create_training_data_config", + "description": { + "tagline": "Create a new training data configuration.", + "detailed": "Call this tool to set up a new training data configuration for your application. It is used when you need to initialize or update your training data setup." + }, + "return_annotation": "Confirmation of new training data configuration creation.", + "arguments": [ + { + "name": "training_data_name", + "alternative_names": [ + "data_container_name", + "training_name" + ], + "description": "The name of the training data container to be created.", + "endpoint_argument_name": "training_data_name" + }, + { + "name": "training_data_visibility", + "alternative_names": [ + "data_visibility", + "visibility_setting" + ], + "description": "Specifies who can access the training data. Valid options: \"everyone\", \"user_only\", \"ai_agent_only\". Defaults to \"everyone\".", + "endpoint_argument_name": "visibility" + } + ] + }, + "method": "POST", + "path": "/training-data", + "tags": [ + "training-data" + ], + "summary": "Creates a new training data configuration.", + "description": "", + "requires_security": true, + "oauth_scopes": [], + "security_schemes": [ + "bearerAuth" + ], + "parameters": { + "query": [], + "path": [], + "header": [], + "cookie": [], + "body": [ + { + "name": "training_data_name", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The name of the training data container." + }, + "description": "The name of the training data container.", + "required": false, + "deprecated": false, + "default": null, + "location": "body", + "content_type": "application/json", + "json_schema": { + "type": "string", + "description": "The name of the training data container." + }, + "schema_required": false + }, + { + "name": "visibility", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The visibility of the training data. Defaults to \"everyone\".\n\nValid values: \"everyone\", \"user_only\", \"ai_agent_only\"" + }, + "description": "The visibility of the training data. Defaults to \"everyone\".\n\nValid values: \"everyone\", \"user_only\", \"ai_agent_only\"", + "required": false, + "deprecated": false, + "default": null, + "location": "body", + "content_type": "application/json", + "json_schema": { + "type": "string", + "description": "The visibility of the training data. Defaults to \"everyone\".\n\nValid values: \"everyone\", \"user_only\", \"ai_agent_only\"" + }, + "schema_required": false + } + ] + }, + "request_body_spec": "{\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"properties\": {\n \"training_data_name\": {\n \"description\": \"The name of the training data container.\",\n \"type\": \"string\",\n \"x-go-name\": \"TrainingDataName\"\n },\n \"visibility\": {\n \"description\": \"The visibility of the training data. Defaults to \\\"everyone\\\".\\n\\nValid values: \\\"everyone\\\", \\\"user_only\\\", \\\"ai_agent_only\\\"\",\n \"type\": \"string\",\n \"x-go-name\": \"Visibility\"\n }\n },\n \"type\": \"object\",\n \"x-go-package\": \"pylon/api/apiserver/endpoints\"\n }\n }\n },\n \"required\": false\n}", + "use_request_body_schema_mode": false, + "validate_request_body_schema": false, + "use_flatten_mode": true + }, + { + "name": "GetTrainingData", + "selected_for_wrapping": false, + "spec_built": true, + "wrap_finished": true, + "should_skip": false, + "skip_reason": null, + "wrapper_tool": { + "name": "retrieve_training_data_configuration", + "description": { + "tagline": "Retrieve a training data configuration by ID.", + "detailed": "This tool retrieves the details of a specific training data configuration using its unique ID. It should be called when you need to access the configuration settings or specifications for a particular training dataset." + }, + "return_annotation": "The specified training data configuration details.", + "arguments": [ + { + "name": "training_data_id", + "alternative_names": [ + "data_id", + "training_id" + ], + "description": "The unique ID of the training data to retrieve its configuration.", + "endpoint_argument_name": "id" + } + ] + }, + "method": "GET", + "path": "/training-data/{id}", + "tags": [ + "training-data" + ], + "summary": "Retrieves a specific training data configuration by its ID.", + "description": "", + "requires_security": true, + "oauth_scopes": [], + "security_schemes": [ + "bearerAuth" + ], + "parameters": { + "query": [], + "path": [ + { + "name": "id", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The ID of the training data." + }, + "description": "The ID of the training data.", + "required": true, + "deprecated": false, + "default": null, + "location": "path", + "content_type": null, + "json_schema": { + "type": "string" + }, + "schema_required": false + } + ], + "header": [], + "cookie": [], + "body": [] + }, + "request_body_spec": null, + "use_request_body_schema_mode": false, + "validate_request_body_schema": false, + "use_flatten_mode": false + }, + { + "name": "DeleteTrainingDataDocuments", + "selected_for_wrapping": false, + "spec_built": true, + "wrap_finished": true, + "should_skip": false, + "skip_reason": null, + "wrapper_tool": { + "name": "delete_training_data_documents", + "description": { + "tagline": "Deletes documents from a training data configuration.", + "detailed": "Use this tool to delete documents from a specific training data configuration by providing the relevant ID. This tool is helpful when managing or updating data sets for training purposes." + }, + "return_annotation": "Confirmation of document deletion from training data.", + "arguments": [ + { + "name": "training_data_id", + "alternative_names": [ + "training_set_id", + "dataset_id" + ], + "description": "The ID of the training data from which documents will be deleted. Provide this to specify the exact dataset.", + "endpoint_argument_name": "id" + }, + { + "name": "document_ids_to_delete", + "alternative_names": [ + "doc_ids_for_removal", + "document_identifiers_to_remove" + ], + "description": "An array of document IDs that need to be deleted from the training data configuration.", + "endpoint_argument_name": "document_ids" + }, + { + "name": "external_ids_to_delete", + "alternative_names": [ + "ids_to_remove", + "delete_external_ids" + ], + "description": "A list of external IDs to delete from the training data configuration.", + "endpoint_argument_name": "external_ids" + } + ] + }, + "method": "DELETE", + "path": "/training-data/{id}/documents", + "tags": [ + "training-data" + ], + "summary": "Deletes documents from a training data configuration.", + "description": "", + "requires_security": true, + "oauth_scopes": [], + "security_schemes": [ + "bearerAuth" + ], + "parameters": { + "query": [ + { + "name": "document_ids", + "value_schema": { + "val_type": "array", + "inner_val_type": "string", + "enum": null, + "properties": null, + "inner_properties": null, + "description": "Document IDs to delete." + }, + "description": "Document IDs to delete.", + "required": false, + "deprecated": false, + "default": null, + "location": "query", + "content_type": null, + "json_schema": { + "type": "array", + "items": { + "type": "string" + } + }, + "schema_required": false + }, + { + "name": "external_ids", + "value_schema": { + "val_type": "array", + "inner_val_type": "string", + "enum": null, + "properties": null, + "inner_properties": null, + "description": "External IDs to delete." + }, + "description": "External IDs to delete.", + "required": false, + "deprecated": false, + "default": null, + "location": "query", + "content_type": null, + "json_schema": { + "type": "array", + "items": { + "type": "string" + } + }, + "schema_required": false + } + ], + "path": [ + { + "name": "id", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The ID of the training data." + }, + "description": "The ID of the training data.", + "required": true, + "deprecated": false, + "default": null, + "location": "path", + "content_type": null, + "json_schema": { + "type": "string" + }, + "schema_required": false + } + ], + "header": [], + "cookie": [], + "body": [] + }, + "request_body_spec": null, + "use_request_body_schema_mode": false, + "validate_request_body_schema": false, + "use_flatten_mode": false + }, + { + "name": "GetUserRoles", + "selected_for_wrapping": false, + "spec_built": true, + "wrap_finished": true, + "should_skip": false, + "skip_reason": null, + "wrapper_tool": { + "name": "get_user_roles", + "description": { + "tagline": "Get a list of all user roles.", + "detailed": "Use this tool to retrieve a comprehensive list of all user roles. It is useful for managing and understanding user permissions." + }, + "return_annotation": "A list of all user roles.", + "arguments": [] + }, + "method": "GET", + "path": "/user-roles", + "tags": [ + "user-roles" + ], + "summary": "", + "description": "Get a list of all user roles", + "requires_security": true, + "oauth_scopes": [], + "security_schemes": [ + "bearerAuth" + ], + "parameters": { + "query": [], + "path": [], + "header": [], + "cookie": [], + "body": [] + }, + "request_body_spec": null, + "use_request_body_schema_mode": false, + "validate_request_body_schema": false, + "use_flatten_mode": false + }, + { + "name": "GetUsers", + "selected_for_wrapping": false, + "spec_built": true, + "wrap_finished": true, + "should_skip": false, + "skip_reason": null, + "wrapper_tool": { + "name": "list_users", + "description": { + "tagline": "Fetches a list of users.", + "detailed": "Use this tool to retrieve a list of all users. It provides an overview of the users available in the system." + }, + "return_annotation": "A list of users.", + "arguments": [] + }, + "method": "GET", + "path": "/users", + "tags": [ + "users" + ], + "summary": "", + "description": "Get a list of users", + "requires_security": true, + "oauth_scopes": [], + "security_schemes": [ + "bearerAuth" + ], + "parameters": { + "query": [], + "path": [], + "header": [], + "cookie": [], + "body": [] + }, + "request_body_spec": null, + "use_request_body_schema_mode": false, + "validate_request_body_schema": false, + "use_flatten_mode": false + }, + { + "name": "SearchUsers", + "selected_for_wrapping": false, + "spec_built": true, + "wrap_finished": true, + "should_skip": false, + "skip_reason": null, + "wrapper_tool": { + "name": "search_users_by_email", + "description": { + "tagline": "Search for users by email with filter options.", + "detailed": "Use this tool to find users by filtering their email with options such as 'equals', 'in', or 'not_in'. It should be called when there's a need to retrieve user information based on specific email criteria." + }, + "return_annotation": "Filtered user data based on email criteria.", + "arguments": [ + { + "name": "user_search_filter", + "alternative_names": [ + "search_criteria", + "email_filter" + ], + "description": "A JSON object defining the filter criteria for searching users by email. It includes fields for pagination, filtering, and limiting results.", + "endpoint_argument_name": "requestBody" + } + ] + }, + "method": "POST", + "path": "/users/search", + "tags": [ + "users" + ], + "summary": "Search for users by a given filter", + "description": "Currently, the following fields are filterable for users:\n\n* email. Allowed operators: `equals`, `in`, `not_in`", + "requires_security": true, + "oauth_scopes": [], + "security_schemes": [ + "bearerAuth" + ], + "parameters": { + "query": [], + "path": [], + "header": [], + "cookie": [], + "body": [ + { + "name": "requestBody", + "value_schema": { + "val_type": "json", + "inner_val_type": null, + "enum": null, + "properties": { + "cursor": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The cursor to use for pagination." + }, + "filter": { + "val_type": "json", + "inner_val_type": null, + "enum": null, + "properties": { + "field": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The field for this filter. For allowed fields, see the documentation for\n\nthe specific endpoint you are using.\n\nFor non-compound filters (any operators other than \"and\" or \"or\"),\n\nField must be set, along with either Value or Values, depending on the operator." + }, + "operator": { + "val_type": "string", + "inner_val_type": null, + "enum": [ + "equals", + "not_equals", + "contains", + "does_not_contain", + "in", + "not_in", + "and", + "or", + "time_is_after", + "time_is_before", + "time_range", + "string_contains", + "string_does_not_contain", + "is_set", + "is_unset" + ], + "properties": null, + "inner_properties": null, + "description": "The operator for this filter.\n\n* equals FilterOperatorEquals Matches objects that are exactly equal to the value in the field.\n\n* not_equals FilterOperatorNotEquals Matches objects that are not exactly equal to the value in the field.\n\n* contains FilterOperatorContains For a multi-valued field, such as tags, this operator will match objects that contain any of the values in the field.\n\n* does_not_contain FilterOperatorDoesNotContain For a multi-valued field, such as tags, this operator will match objects that do not contain any of the values in the field.\n\n* in FilterOperatorIn Matches objects if the field is one of several possible values, as specified in the values array.\n\n* not_in FilterOperatorNotIn Matches objects if the field is none of several possible values, as specified in the values array.\n\n* and FilterOperatorAnd Matches objects only if all subfilters match.\n\n* or FilterOperatorOr Matches objects if any subfilter matches.\n\n* time_is_after FilterOperatorTimeIsAfter Matches objects if the field is after the given time.\n\n* time_is_before FilterOperatorTimeIsBefore Matches objects if the field is before the given time.\n\n* time_range FilterOperatorTimeRange Matches objects if the field is between the given times.\n\n* string_contains FilterOperatorStringContains Matches objects if the field contains the given string.\n\n* string_does_not_contain FilterOperatorStringDoesNotContain Matches objects if the field does not contain the given string.\n\n* is_set FilterOperatorIsSet FilterOperatorIsSet matches objects if the field is set.\n\n* is_unset FilterOperatorIsUnset FilterOperatorIsUnset matches objects if the field is unset." + }, + "subfilters": { + "val_type": "array", + "inner_val_type": "json", + "enum": null, + "properties": null, + "inner_properties": {}, + "description": "Sub-filters for this filter. Valid only when operator is \"and\" or \"or\".\n\nThe maximum allowed depth for a tree of filters is 3." + }, + "value": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The value for this filter. Only used for single-valued operators\n\n(\"equals\", \"not_equals\", \"contains\", \"does_not_contain\")" + }, + "values": { + "val_type": "array", + "inner_val_type": "string", + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The values for this filter. Only used for multi-valued operators (\"in\", \"not_in\")." + } + }, + "inner_properties": null, + "description": null + }, + "limit": { + "val_type": "integer", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The number of users to fetch. Defaults to 100. Must be greater than 0 and less than 1000." + } + }, + "inner_properties": null, + "description": "" + }, + "description": "", + "required": false, + "deprecated": false, + "default": null, + "location": "body", + "content_type": "application/json", + "json_schema": { + "type": "object", + "properties": { + "cursor": { + "type": "string", + "description": "The cursor to use for pagination." + }, + "filter": { + "type": "object", + "properties": { + "field": { + "type": "string", + "description": "The field for this filter. For allowed fields, see the documentation for\n\nthe specific endpoint you are using.\n\nFor non-compound filters (any operators other than \"and\" or \"or\"),\n\nField must be set, along with either Value or Values, depending on the operator." + }, + "operator": { + "type": "string", + "description": "The operator for this filter.\n\n* equals FilterOperatorEquals Matches objects that are exactly equal to the value in the field.\n\n* not_equals FilterOperatorNotEquals Matches objects that are not exactly equal to the value in the field.\n\n* contains FilterOperatorContains For a multi-valued field, such as tags, this operator will match objects that contain any of the values in the field.\n\n* does_not_contain FilterOperatorDoesNotContain For a multi-valued field, such as tags, this operator will match objects that do not contain any of the values in the field.\n\n* in FilterOperatorIn Matches objects if the field is one of several possible values, as specified in the values array.\n\n* not_in FilterOperatorNotIn Matches objects if the field is none of several possible values, as specified in the values array.\n\n* and FilterOperatorAnd Matches objects only if all subfilters match.\n\n* or FilterOperatorOr Matches objects if any subfilter matches.\n\n* time_is_after FilterOperatorTimeIsAfter Matches objects if the field is after the given time.\n\n* time_is_before FilterOperatorTimeIsBefore Matches objects if the field is before the given time.\n\n* time_range FilterOperatorTimeRange Matches objects if the field is between the given times.\n\n* string_contains FilterOperatorStringContains Matches objects if the field contains the given string.\n\n* string_does_not_contain FilterOperatorStringDoesNotContain Matches objects if the field does not contain the given string.\n\n* is_set FilterOperatorIsSet FilterOperatorIsSet matches objects if the field is set.\n\n* is_unset FilterOperatorIsUnset FilterOperatorIsUnset matches objects if the field is unset.", + "enum": [ + "equals", + "not_equals", + "contains", + "does_not_contain", + "in", + "not_in", + "and", + "or", + "time_is_after", + "time_is_before", + "time_range", + "string_contains", + "string_does_not_contain", + "is_set", + "is_unset" + ] + }, + "subfilters": { + "type": "array", + "description": "Sub-filters for this filter. Valid only when operator is \"and\" or \"or\".\n\nThe maximum allowed depth for a tree of filters is 3.", + "items": { + "type": "object", + "properties": {} + } + }, + "value": { + "type": "string", + "description": "The value for this filter. Only used for single-valued operators\n\n(\"equals\", \"not_equals\", \"contains\", \"does_not_contain\")" + }, + "values": { + "type": "array", + "description": "The values for this filter. Only used for multi-valued operators (\"in\", \"not_in\").", + "items": { + "type": "string" + } + } + }, + "required": [ + "field", + "operator" + ] + }, + "limit": { + "type": "integer", + "description": "The number of users to fetch. Defaults to 100. Must be greater than 0 and less than 1000.", + "format": "int64" + } + }, + "required": [ + "filter" + ] + }, + "schema_required": false + } + ] + }, + "request_body_spec": "{\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"properties\": {\n \"cursor\": {\n \"description\": \"The cursor to use for pagination.\",\n \"type\": \"string\",\n \"x-go-name\": \"Cursor\"\n },\n \"filter\": {\n \"properties\": {\n \"field\": {\n \"description\": \"The field for this filter. For allowed fields, see the documentation for\\n\\nthe specific endpoint you are using.\\n\\nFor non-compound filters (any operators other than \\\"and\\\" or \\\"or\\\"),\\n\\nField must be set, along with either Value or Values, depending on the operator.\",\n \"type\": \"string\",\n \"x-go-name\": \"Field\"\n },\n \"operator\": {\n \"description\": \"The operator for this filter.\\n\\n* equals FilterOperatorEquals Matches objects that are exactly equal to the value in the field.\\n\\n* not_equals FilterOperatorNotEquals Matches objects that are not exactly equal to the value in the field.\\n\\n* contains FilterOperatorContains For a multi-valued field, such as tags, this operator will match objects that contain any of the values in the field.\\n\\n* does_not_contain FilterOperatorDoesNotContain For a multi-valued field, such as tags, this operator will match objects that do not contain any of the values in the field.\\n\\n* in FilterOperatorIn Matches objects if the field is one of several possible values, as specified in the values array.\\n\\n* not_in FilterOperatorNotIn Matches objects if the field is none of several possible values, as specified in the values array.\\n\\n* and FilterOperatorAnd Matches objects only if all subfilters match.\\n\\n* or FilterOperatorOr Matches objects if any subfilter matches.\\n\\n* time_is_after FilterOperatorTimeIsAfter Matches objects if the field is after the given time.\\n\\n* time_is_before FilterOperatorTimeIsBefore Matches objects if the field is before the given time.\\n\\n* time_range FilterOperatorTimeRange Matches objects if the field is between the given times.\\n\\n* string_contains FilterOperatorStringContains Matches objects if the field contains the given string.\\n\\n* string_does_not_contain FilterOperatorStringDoesNotContain Matches objects if the field does not contain the given string.\\n\\n* is_set FilterOperatorIsSet FilterOperatorIsSet matches objects if the field is set.\\n\\n* is_unset FilterOperatorIsUnset FilterOperatorIsUnset matches objects if the field is unset.\",\n \"enum\": [\n \"equals\",\n \"not_equals\",\n \"contains\",\n \"does_not_contain\",\n \"in\",\n \"not_in\",\n \"and\",\n \"or\",\n \"time_is_after\",\n \"time_is_before\",\n \"time_range\",\n \"string_contains\",\n \"string_does_not_contain\",\n \"is_set\",\n \"is_unset\"\n ],\n \"type\": \"string\",\n \"x-go-enum-desc\": \"equals FilterOperatorEquals Matches objects that are exactly equal to the value in the field.\\nnot_equals FilterOperatorNotEquals Matches objects that are not exactly equal to the value in the field.\\ncontains FilterOperatorContains For a multi-valued field, such as tags, this operator will match objects that contain any of the values in the field.\\ndoes_not_contain FilterOperatorDoesNotContain For a multi-valued field, such as tags, this operator will match objects that do not contain any of the values in the field.\\nin FilterOperatorIn Matches objects if the field is one of several possible values, as specified in the values array.\\nnot_in FilterOperatorNotIn Matches objects if the field is none of several possible values, as specified in the values array.\\nand FilterOperatorAnd Matches objects only if all subfilters match.\\nor FilterOperatorOr Matches objects if any subfilter matches.\\ntime_is_after FilterOperatorTimeIsAfter Matches objects if the field is after the given time.\\ntime_is_before FilterOperatorTimeIsBefore Matches objects if the field is before the given time.\\ntime_range FilterOperatorTimeRange Matches objects if the field is between the given times.\\nstring_contains FilterOperatorStringContains Matches objects if the field contains the given string.\\nstring_does_not_contain FilterOperatorStringDoesNotContain Matches objects if the field does not contain the given string.\\nis_set FilterOperatorIsSet FilterOperatorIsSet matches objects if the field is set.\\nis_unset FilterOperatorIsUnset FilterOperatorIsUnset matches objects if the field is unset.\",\n \"x-go-name\": \"Operator\"\n },\n \"subfilters\": {\n \"description\": \"Sub-filters for this filter. Valid only when operator is \\\"and\\\" or \\\"or\\\".\\n\\nThe maximum allowed depth for a tree of filters is 3.\",\n \"items\": {\n \"$ref\": \"#/components/schemas/Filter\",\n \"has_circular_reference\": true\n },\n \"type\": \"array\",\n \"x-go-name\": \"Subfilters\"\n },\n \"value\": {\n \"description\": \"The value for this filter. Only used for single-valued operators\\n\\n(\\\"equals\\\", \\\"not_equals\\\", \\\"contains\\\", \\\"does_not_contain\\\")\",\n \"type\": \"string\",\n \"x-go-name\": \"Value\"\n },\n \"values\": {\n \"description\": \"The values for this filter. Only used for multi-valued operators (\\\"in\\\", \\\"not_in\\\").\",\n \"items\": {\n \"type\": \"string\"\n },\n \"type\": \"array\",\n \"x-go-name\": \"Values\"\n }\n },\n \"required\": [\n \"field\",\n \"operator\"\n ],\n \"type\": \"object\",\n \"x-go-package\": \"pylon/api/apiserver/apitypes\"\n },\n \"limit\": {\n \"description\": \"The number of users to fetch. Defaults to 100. Must be greater than 0 and less than 1000.\",\n \"format\": \"int64\",\n \"type\": \"integer\",\n \"x-go-name\": \"Limit\"\n }\n },\n \"required\": [\n \"filter\"\n ],\n \"type\": \"object\",\n \"x-go-package\": \"pylon/api/apiserver/endpoints\"\n }\n }\n },\n \"required\": false\n}", + "use_request_body_schema_mode": true, + "validate_request_body_schema": false, + "use_flatten_mode": false + }, + { + "name": "GetUser", + "selected_for_wrapping": false, + "spec_built": true, + "wrap_finished": true, + "should_skip": false, + "skip_reason": null, + "wrapper_tool": { + "name": "get_user_by_id", + "description": { + "tagline": "Retrieve user details using their unique ID.", + "detailed": "Use this tool to get detailed information about a user by providing their unique ID." + }, + "return_annotation": "Details of the user with the specified ID.", + "arguments": [ + { + "name": "user_id", + "alternative_names": [ + "user_identifier", + "user_id_number" + ], + "description": "The unique ID of the user to fetch details for.", + "endpoint_argument_name": "id" + } + ] + }, + "method": "GET", + "path": "/users/{id}", + "tags": [ + "user" + ], + "summary": "", + "description": "Get a user by its ID", + "requires_security": true, + "oauth_scopes": [], + "security_schemes": [ + "bearerAuth" + ], + "parameters": { + "query": [], + "path": [ + { + "name": "id", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The ID of the user to fetch." + }, + "description": "The ID of the user to fetch.", + "required": true, + "deprecated": false, + "default": null, + "location": "path", + "content_type": null, + "json_schema": { + "type": "string" + }, + "schema_required": false + } + ], + "header": [], + "cookie": [], + "body": [] + }, + "request_body_spec": null, + "use_request_body_schema_mode": false, + "validate_request_body_schema": false, + "use_flatten_mode": false + }, + { + "name": "UpdateUser", + "selected_for_wrapping": false, + "spec_built": true, + "wrap_finished": true, + "should_skip": false, + "skip_reason": null, + "wrapper_tool": { + "name": "update_user_profile", + "description": { + "tagline": "Update a user's profile information.", + "detailed": "This tool updates the information of a user identified by a specific ID. It should be called when changes to a user's profile are needed, such as updating personal details or contact information." + }, + "return_annotation": "Confirmation of user profile update.", + "arguments": [ + { + "name": "user_id", + "alternative_names": [ + "user_identifier", + "user_key" + ], + "description": "The unique identifier of the user to be updated.", + "endpoint_argument_name": "id" + }, + { + "name": "user_role_id", + "alternative_names": [ + "user_role_identifier", + "role_identifier" + ], + "description": "The role ID to assign to the user.", + "endpoint_argument_name": "role_id" + }, + { + "name": "user_status", + "alternative_names": [ + "account_status", + "profile_status" + ], + "description": "The updated status for the user. Options: `active`, `away`, or `out_of_office`.", + "endpoint_argument_name": "status" + } + ] + }, + "method": "PATCH", + "path": "/users/{id}", + "tags": [ + "user" + ], + "summary": "", + "description": "Update a user", + "requires_security": true, + "oauth_scopes": [], + "security_schemes": [ + "bearerAuth" + ], + "parameters": { + "query": [], + "path": [ + { + "name": "id", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The ID of the user to update." + }, + "description": "The ID of the user to update.", + "required": true, + "deprecated": false, + "default": null, + "location": "path", + "content_type": null, + "json_schema": { + "type": "string" + }, + "schema_required": false + } + ], + "header": [], + "cookie": [], + "body": [ + { + "name": "role_id", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The role_id of the user." + }, + "description": "The role_id of the user.", + "required": false, + "deprecated": false, + "default": null, + "location": "body", + "content_type": "application/json", + "json_schema": { + "type": "string", + "description": "The role_id of the user." + }, + "schema_required": false + }, + { + "name": "status", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The new user status for the user. Can be one of `active`, `away`, or `out_of_office`." + }, + "description": "The new user status for the user. Can be one of `active`, `away`, or `out_of_office`.", + "required": false, + "deprecated": false, + "default": null, + "location": "body", + "content_type": "application/json", + "json_schema": { + "type": "string", + "description": "The new user status for the user. Can be one of `active`, `away`, or `out_of_office`." + }, + "schema_required": false + } + ] + }, + "request_body_spec": "{\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"properties\": {\n \"role_id\": {\n \"description\": \"The role_id of the user.\",\n \"type\": \"string\",\n \"x-go-name\": \"RoleID\"\n },\n \"status\": {\n \"description\": \"The new user status for the user. Can be one of `active`, `away`, or `out_of_office`.\",\n \"type\": \"string\",\n \"x-go-name\": \"Status\"\n }\n },\n \"type\": \"object\",\n \"x-go-package\": \"pylon/api/apiserver/endpoints\"\n }\n }\n },\n \"required\": false\n}", + "use_request_body_schema_mode": false, + "validate_request_body_schema": false, + "use_flatten_mode": true + } + ], + "security_scheme_key_selected": null, + "security_scheme_selected": {} +} diff --git a/toolkits/pylon_api/pylon_api/tools/__init__.py b/toolkits/pylon_api/pylon_api/tools/__init__.py new file mode 100644 index 00000000..1cced017 --- /dev/null +++ b/toolkits/pylon_api/pylon_api/tools/__init__.py @@ -0,0 +1,5176 @@ +"""Arcade Starter Tools for Pylon + +DO NOT EDIT THIS MODULE DIRECTLY. + +THIS MODULE WAS AUTO-GENERATED BY TRANSPILING THE API STARTER TOOL JSON DEFINITIONS +IN THE ../wrapper_tools DIRECTORY INTO PYTHON CODE. ANY CHANGES TO THIS MODULE WILL +BE OVERWRITTEN BY THE TRANSPILER. +""" + +import asyncio +import json +import jsonschema +from enum import Enum +from typing import Annotated, Any + +import httpx + +from arcade_tdk import tool, ToolContext +from arcade_tdk.errors import RetryableToolError + +from .request_body_schemas import REQUEST_BODY_SCHEMAS + +# Retry configuration +INITIAL_RETRY_DELAY = 0.5 # seconds + +HTTP_CLIENT = httpx.AsyncClient( + timeout=httpx.Timeout(60.0, connect=10.0), + limits=httpx.Limits(max_keepalive_connections=20, max_connections=100), + transport=httpx.AsyncHTTPTransport(retries=3), + http2=True, + follow_redirects=True, +) + + +class ToolMode(str, Enum): + """Mode for tools with complex request bodies.""" + + GET_REQUEST_SCHEMA = "get_request_schema" + EXECUTE = "execute" + + +def remove_none_values(data: dict[str, Any]) -> dict[str, Any]: + return {k: v for k, v in data.items() if v is not None} + + +async def make_request( + url: str, + method: str, + params: dict[str, Any] | None = None, + headers: dict[str, Any] | None = None, + content: str | None = None, + data: dict[str, Any] | None = None, + auth: tuple[str, str] | None = None, + max_retries: int = 3, +) -> httpx.Response: + """Make an HTTP request with retry logic for 5xx server errors.""" + for attempt in range(max_retries): + try: + response = await HTTP_CLIENT.request( + url=url, + auth=auth, + method=method, + params=params, + headers=headers, + content=content, + ) + response.raise_for_status() + except httpx.HTTPStatusError as e: + # Only retry on 5xx server errors + if e.response.status_code >= 500 and attempt < max_retries - 1: + # Exponential backoff: 0.5s, 1s, 2s + await asyncio.sleep(INITIAL_RETRY_DELAY * (2**attempt)) + continue + # Re-raise for 4xx errors or if max retries reached + raise + except httpx.RequestError as e: + # Don't retry request errors (network issues are handled by transport) + raise + else: + return response + + # This should never be reached, but satisfies type checker + raise httpx.RequestError("Max retries exceeded") # noqa: TRY003 + + +async def make_request_with_schema_validation( + url: str, + method: str, + request_data: dict[str, Any], + schema: dict[str, Any] | str, + auth: tuple[str, str] | None = None, + params: dict[str, Any] | None = None, + headers: dict[str, Any] | None = None, + max_retries: int = 3, +) -> httpx.Response: + """Make an HTTP request with schema validation on format errors.""" + # Parse schema if it's a string, skip validation if parsing fails + parsed_schema = None + if isinstance(schema, str): + try: + parsed_schema = json.loads(schema) + except Exception: + # If schema parsing fails, just skip validation + parsed_schema = None + else: + parsed_schema = schema + + try: + response = await make_request( + url=url, + auth=auth, + method=method, + params=params, + headers=headers, + content=json.dumps(request_data), + max_retries=max_retries, + ) + except httpx.HTTPStatusError as e: + # Only provide schema validation for format-related errors + if e.response.status_code in (400, 422): + api_error_details = f"API returned {e.response.status_code}: {e.response.text}" + + # Only run validation if we have a valid parsed schema + if parsed_schema is not None: + # Run validation to provide additional context + is_valid, validation_error = validate_json_against_schema( + request_data, parsed_schema + ) + + if not is_valid: + # Schema validation found issues - additional context + additional_context = ( + f"{api_error_details}\n\n" + f"Schema validation found the following issues:\n" + f"{validation_error}" + ) + else: + # Schema validation passed - just show API error + additional_context = api_error_details + else: + # No valid schema - just show API error + additional_context = api_error_details + + raise RetryableToolError( + message=(f"API request failed with validation error: {e.response.status_code}"), + developer_message=api_error_details, + additional_prompt_content=additional_context, + ) from e + else: + # For non-validation errors, re-raise as-is + raise + else: + return response + + +def validate_json_against_schema( + json_data: dict[str, Any], schema: dict[str, Any] +) -> tuple[bool, str | None]: + """Validate JSON data against an OpenAPI/JSON Schema. + + This provides full JSON Schema Draft 7 validation including: + - Required fields, types, enums + - Pattern validation (regex) + - Format validation (email, uuid, date-time, etc.) + - Min/max length and values + - oneOf, anyOf, allOf + - And all other JSON Schema features + + Args: + json_data: The JSON data to validate + schema: The JSON Schema to validate against + + Returns: + Tuple of (is_valid, error_messages). If valid, error_messages is None. + If invalid, error_messages contains all validation errors. + """ + try: + validator = jsonschema.Draft7Validator( + schema, format_checker=jsonschema.Draft7Validator.FORMAT_CHECKER + ) + # Collect ALL validation errors + errors = list(validator.iter_errors(json_data)) + if errors: + # Format all errors with their paths + error_messages = [] + for error in errors: + error_path = ".".join(str(p) for p in error.path) if error.path else "root" + error_messages.append(f"{error.message} at {error_path}") + # Join all errors with newlines + return False, "\n".join(error_messages) + else: + return True, None + except jsonschema.SchemaError as e: + return False, f"Invalid schema: {e.message}" + except Exception as e: + return False, f"Validation error: {e!s}" + + +@tool(requires_secrets=["PYLON_SECRET_TOKEN"]) +async def get_account_list( + context: ToolContext, + account_fetch_limit: Annotated[ + int, + "Specify the number of accounts to fetch, from 1 to 999. Defaults to 100 if not specified.", + ], + pagination_cursor: Annotated[ + str | None, + "A string representing the cursor for pagination. Use this to fetch the next set of accounts.", # noqa: E501 + ] = None, +) -> Annotated[dict[str, Any], "Response from the API endpoint 'GetAccounts'."]: + """Retrieve a list of accounts from the service. + + This tool fetches a complete list of accounts from the Pylon service. It should be called when you need to obtain account information.""" # noqa: E501 + request_data: Any = {} + if isinstance(request_data, dict): + request_data = remove_none_values(request_data) + content = json.dumps(request_data) if request_data else None + response = await make_request( + url="https://api.usepylon.com/accounts", + method="GET", + params=remove_none_values({"cursor": pagination_cursor, "limit": account_fetch_limit}), + headers=remove_none_values({ + "Authorization": "Bearer {authorization}".format( # noqa: UP032 + authorization=context.get_secret("PYLON_SECRET_TOKEN") + ) + }), + content=content, + ) + try: + return {"response_json": response.json()} + except Exception: + return {"response_text": response.text} + + +@tool(requires_secrets=["PYLON_SECRET_TOKEN"]) +async def update_multiple_accounts( + context: ToolContext, + mode: Annotated[ + ToolMode, + "Operation mode: 'get_request_schema' returns the OpenAPI spec " + "for the request body, 'execute' performs the actual operation", + ], + request_body: Annotated[ + str | None, + "Stringified JSON representing the request body. Required when " + "mode is 'execute', ignored when mode is 'get_request_schema'", + ] = None, +) -> Annotated[dict[str, Any], "Response from the API endpoint 'UpdateAccounts'."]: + """Update multiple accounts simultaneously. + + Use this tool to update details for multiple accounts in one request. It is helpful for batch processing of account modifications. + + Note: Understanding the request schema is necessary to properly create + the stringified JSON input object for execution. + + Modes: + - GET_REQUEST_SCHEMA: Returns the schema. Only call if you don't + already have it. Do NOT call repeatedly if you already received + the schema. + - EXECUTE: Performs the operation with the provided request body + JSON. + + If you need the schema, call with mode='get_request_schema' ONCE, then execute. + """ # noqa: E501 + if mode == ToolMode.GET_REQUEST_SCHEMA: + return { + "request_body_schema": REQUEST_BODY_SCHEMAS["UPDATEMULTIPLEACCOUNTS"], + "instructions": ( + "Use the request_body_schema to construct a valid JSON object. " + "Once you have populated the object following the schema " + "structure and requirements, call this tool again with " + "mode='execute' and the stringified JSON as the " + "request_body parameter. " + "Do NOT call the schema mode again - you already have " + "the schema now." + ), + } + + # Mode is EXECUTE - validate parameters + + # Validate request body is provided (not None or empty string) + # Note: Empty objects like {} are allowed - schema validation will check if valid + if request_body is None or request_body.strip() == "": + raise RetryableToolError( + message="Request body is required when mode is 'execute'", + developer_message="The request_body parameter was null or empty string", + additional_prompt_content=( + "The request body is required to perform this operation. " + "Use the schema below to construct a valid JSON object, " + "then call this tool again in execute mode with the " + "stringified JSON as the request_body parameter.\n\n" + "Schema:\n\n```json\n" + REQUEST_BODY_SCHEMAS["UPDATEMULTIPLEACCOUNTS"] + "\n```" + ), + ) + + # Parse JSON + try: + request_data = json.loads(request_body) + except json.JSONDecodeError as e: + raise RetryableToolError( + message=f"Invalid JSON in request body: {e!s}", + developer_message=f"JSON parsing failed: {e!s}", + additional_prompt_content=( + f"The request body contains invalid JSON. Error: {e!s}\n\n" + "Please provide a valid JSON string that matches the schema " + "below, then call this tool again in execute mode.\n\n" + "Schema:\n\n```json\n" + REQUEST_BODY_SCHEMAS["UPDATEMULTIPLEACCOUNTS"] + "\n```" + ), + ) from e + + response = await make_request_with_schema_validation( + url="https://api.usepylon.com/accounts", + method="PATCH", + request_data=request_data, + schema=REQUEST_BODY_SCHEMAS["UPDATEMULTIPLEACCOUNTS"], + params=remove_none_values({}), + headers=remove_none_values({ + "Content-Type": "application/json", + "Authorization": "Bearer {authorization}".format( # noqa: UP032 + authorization=context.get_secret("PYLON_SECRET_TOKEN") + ), + }), + ) + try: + return {"response_json": response.json()} + except Exception: + return {"response_text": response.text} + + +@tool(requires_secrets=["PYLON_SECRET_TOKEN"]) +async def create_new_account( + context: ToolContext, + mode: Annotated[ + ToolMode, + "Operation mode: 'get_request_schema' returns the OpenAPI spec " + "for the request body, 'execute' performs the actual operation", + ], + request_body: Annotated[ + str | None, + "Stringified JSON representing the request body. Required when " + "mode is 'execute', ignored when mode is 'get_request_schema'", + ] = None, +) -> Annotated[dict[str, Any], "Response from the API endpoint 'CreateAccount'."]: + """Creates a new user account. + + This tool should be called to create a new user account when registration or account opening is requested. + + Note: Understanding the request schema is necessary to properly create + the stringified JSON input object for execution. + + Modes: + - GET_REQUEST_SCHEMA: Returns the schema. Only call if you don't + already have it. Do NOT call repeatedly if you already received + the schema. + - EXECUTE: Performs the operation with the provided request body + JSON. + + If you need the schema, call with mode='get_request_schema' ONCE, then execute. + """ # noqa: E501 + if mode == ToolMode.GET_REQUEST_SCHEMA: + return { + "request_body_schema": REQUEST_BODY_SCHEMAS["CREATENEWACCOUNT"], + "instructions": ( + "Use the request_body_schema to construct a valid JSON object. " + "Once you have populated the object following the schema " + "structure and requirements, call this tool again with " + "mode='execute' and the stringified JSON as the " + "request_body parameter. " + "Do NOT call the schema mode again - you already have " + "the schema now." + ), + } + + # Mode is EXECUTE - validate parameters + + # Validate request body is provided (not None or empty string) + # Note: Empty objects like {} are allowed - schema validation will check if valid + if request_body is None or request_body.strip() == "": + raise RetryableToolError( + message="Request body is required when mode is 'execute'", + developer_message="The request_body parameter was null or empty string", + additional_prompt_content=( + "The request body is required to perform this operation. " + "Use the schema below to construct a valid JSON object, " + "then call this tool again in execute mode with the " + "stringified JSON as the request_body parameter.\n\n" + "Schema:\n\n```json\n" + REQUEST_BODY_SCHEMAS["CREATENEWACCOUNT"] + "\n```" + ), + ) + + # Parse JSON + try: + request_data = json.loads(request_body) + except json.JSONDecodeError as e: + raise RetryableToolError( + message=f"Invalid JSON in request body: {e!s}", + developer_message=f"JSON parsing failed: {e!s}", + additional_prompt_content=( + f"The request body contains invalid JSON. Error: {e!s}\n\n" + "Please provide a valid JSON string that matches the schema " + "below, then call this tool again in execute mode.\n\n" + "Schema:\n\n```json\n" + REQUEST_BODY_SCHEMAS["CREATENEWACCOUNT"] + "\n```" + ), + ) from e + + response = await make_request_with_schema_validation( + url="https://api.usepylon.com/accounts", + method="POST", + request_data=request_data, + schema=REQUEST_BODY_SCHEMAS["CREATENEWACCOUNT"], + params=remove_none_values({}), + headers=remove_none_values({ + "Content-Type": "application/json", + "Authorization": "Bearer {authorization}".format( # noqa: UP032 + authorization=context.get_secret("PYLON_SECRET_TOKEN") + ), + }), + ) + try: + return {"response_json": response.json()} + except Exception: + return {"response_text": response.text} + + +@tool(requires_secrets=["PYLON_SECRET_TOKEN"]) +async def search_accounts( + context: ToolContext, + mode: Annotated[ + ToolMode, + "Operation mode: 'get_request_schema' returns the OpenAPI spec " + "for the request body, 'execute' performs the actual operation", + ], + request_body: Annotated[ + str | None, + "Stringified JSON representing the request body. Required when " + "mode is 'execute', ignored when mode is 'get_request_schema'", + ] = None, +) -> Annotated[dict[str, Any], "Response from the API endpoint 'SearchAccounts'."]: + """Search and filter accounts using various criteria. + + This tool allows searching and filtering of accounts with specific criteria such as domains, tags, name, external IDs, and custom fields. It supports operators like 'contains', 'equals', 'in', 'not_in', and others, enabling detailed account queries. + + Note: Understanding the request schema is necessary to properly create + the stringified JSON input object for execution. + + Modes: + - GET_REQUEST_SCHEMA: Returns the schema. Only call if you don't + already have it. Do NOT call repeatedly if you already received + the schema. + - EXECUTE: Performs the operation with the provided request body + JSON. + + If you need the schema, call with mode='get_request_schema' ONCE, then execute. + """ # noqa: E501 + if mode == ToolMode.GET_REQUEST_SCHEMA: + return { + "request_body_schema": REQUEST_BODY_SCHEMAS["SEARCHACCOUNTS"], + "instructions": ( + "Use the request_body_schema to construct a valid JSON object. " + "Once you have populated the object following the schema " + "structure and requirements, call this tool again with " + "mode='execute' and the stringified JSON as the " + "request_body parameter. " + "Do NOT call the schema mode again - you already have " + "the schema now." + ), + } + + # Mode is EXECUTE - validate parameters + + # Validate request body is provided (not None or empty string) + # Note: Empty objects like {} are allowed - schema validation will check if valid + if request_body is None or request_body.strip() == "": + raise RetryableToolError( + message="Request body is required when mode is 'execute'", + developer_message="The request_body parameter was null or empty string", + additional_prompt_content=( + "The request body is required to perform this operation. " + "Use the schema below to construct a valid JSON object, " + "then call this tool again in execute mode with the " + "stringified JSON as the request_body parameter.\n\n" + "Schema:\n\n```json\n" + REQUEST_BODY_SCHEMAS["SEARCHACCOUNTS"] + "\n```" + ), + ) + + # Parse JSON + try: + request_data = json.loads(request_body) + except json.JSONDecodeError as e: + raise RetryableToolError( + message=f"Invalid JSON in request body: {e!s}", + developer_message=f"JSON parsing failed: {e!s}", + additional_prompt_content=( + f"The request body contains invalid JSON. Error: {e!s}\n\n" + "Please provide a valid JSON string that matches the schema " + "below, then call this tool again in execute mode.\n\n" + "Schema:\n\n```json\n" + REQUEST_BODY_SCHEMAS["SEARCHACCOUNTS"] + "\n```" + ), + ) from e + + response = await make_request( + url="https://api.usepylon.com/accounts/search", + method="POST", + params=remove_none_values({}), + headers=remove_none_values({ + "Content-Type": "application/json", + "Authorization": "Bearer {authorization}".format( # noqa: UP032 + authorization=context.get_secret("PYLON_SECRET_TOKEN") + ), + }), + content=json.dumps(request_data), + ) + try: + return {"response_json": response.json()} + except Exception: + return {"response_text": response.text} + + +@tool(requires_secrets=["PYLON_SECRET_TOKEN"]) +async def create_account_highlight( + context: ToolContext, + mode: Annotated[ + ToolMode, + "Operation mode: 'get_request_schema' returns the OpenAPI spec " + "for the request body, 'execute' performs the actual operation", + ], + account_identifier: Annotated[ + str | None, + "The ID (UUID) or external ID (string) of the account for the highlight. Required when mode is 'execute', ignored when mode is 'get_request_schema'.", # noqa: E501 + ] = None, + request_body: Annotated[ + str | None, + "Stringified JSON representing the request body. Required when " + "mode is 'execute', ignored when mode is 'get_request_schema'", + ] = None, +) -> Annotated[dict[str, Any], "Response from the API endpoint 'CreateAccountHighlight'."]: + """Create a highlight for a specified account. + + This tool is used to create a highlight for an account, using either an internal account ID in UUID format or an external ID in string format. It should be called when there is a need to add or update a highlight for an account. + + Note: Understanding the request schema is necessary to properly create + the stringified JSON input object for execution.\n\nThis operation also requires path parameters. + + Modes: + - GET_REQUEST_SCHEMA: Returns the schema. Only call if you don't + already have it. Do NOT call repeatedly if you already received + the schema. + - EXECUTE: Performs the operation with the provided request body + JSON.\n Note: You must also provide the required path parameters when executing. + + If you need the schema, call with mode='get_request_schema' ONCE, then execute. + """ # noqa: E501 + if mode == ToolMode.GET_REQUEST_SCHEMA: + return { + "request_body_schema": REQUEST_BODY_SCHEMAS["CREATEACCOUNTHIGHLIGHT"], + "instructions": ( + "Use the request_body_schema to construct a valid JSON object. " + "Once you have populated the object following the schema " + "structure and requirements, call this tool again with " + "mode='execute' and the stringified JSON as the " + "request_body parameter along with the required path parameters. " + "Do NOT call the schema mode again - you already have " + "the schema now." + ), + } + + # Mode is EXECUTE - validate parameters + # Validate required parameters + missing_params = [] + if not account_identifier: + missing_params.append(("account_identifier", "path")) + + if missing_params: + param_names = [p[0] for p in missing_params] + param_details = ", ".join([f"{p[0]} ({p[1]})" for p in missing_params]) + raise RetryableToolError( + message=f"Missing required parameters: {param_names}", + developer_message=(f"Required parameters validation failed: {param_details}"), + additional_prompt_content=( + f"The following required parameters are missing: " + f"{param_details}. Please call this tool again with all " + "required parameters." + ), + ) + + # Validate request body is provided (not None or empty string) + # Note: Empty objects like {} are allowed - schema validation will check if valid + if request_body is None or request_body.strip() == "": + raise RetryableToolError( + message="Request body is required when mode is 'execute'", + developer_message="The request_body parameter was null or empty string", + additional_prompt_content=( + "The request body is required to perform this operation. " + "Use the schema below to construct a valid JSON object, " + "then call this tool again in execute mode with the " + "stringified JSON as the request_body parameter.\n\n" + "Schema:\n\n```json\n" + REQUEST_BODY_SCHEMAS["CREATEACCOUNTHIGHLIGHT"] + "\n```" + ), + ) + + # Parse JSON + try: + request_data = json.loads(request_body) + except json.JSONDecodeError as e: + raise RetryableToolError( + message=f"Invalid JSON in request body: {e!s}", + developer_message=f"JSON parsing failed: {e!s}", + additional_prompt_content=( + f"The request body contains invalid JSON. Error: {e!s}\n\n" + "Please provide a valid JSON string that matches the schema " + "below, then call this tool again in execute mode.\n\n" + "Schema:\n\n```json\n" + REQUEST_BODY_SCHEMAS["CREATEACCOUNTHIGHLIGHT"] + "\n```" + ), + ) from e + + response = await make_request_with_schema_validation( + url="https://api.usepylon.com/accounts/{account_id}/highlights".format( # noqa: UP032 + account_id=account_identifier + ), + method="POST", + request_data=request_data, + schema=REQUEST_BODY_SCHEMAS["CREATEACCOUNTHIGHLIGHT"], + params=remove_none_values({}), + headers=remove_none_values({ + "Content-Type": "application/json", + "Authorization": "Bearer {authorization}".format( # noqa: UP032 + authorization=context.get_secret("PYLON_SECRET_TOKEN") + ), + }), + ) + try: + return {"response_json": response.json()} + except Exception: + return {"response_text": response.text} + + +@tool(requires_secrets=["PYLON_SECRET_TOKEN"]) +async def delete_account_highlight( + context: ToolContext, + account_identifier: Annotated[ + str, + "The ID or external ID of the account that the highlight belongs to. Can be a UUID or any string.", # noqa: E501 + ], + highlight_id: Annotated[str, "The unique ID of the highlight you intend to delete."], +) -> Annotated[dict[str, Any], "Response from the API endpoint 'DeleteAccountHighlight'."]: + """Delete a specific highlight from an account. + + Use this tool to delete a specific highlight by providing the account ID and highlight ID. It should be called when a user wants to remove a highlight linked to an account.""" # noqa: E501 + request_data: Any = {} + if isinstance(request_data, dict): + request_data = remove_none_values(request_data) + content = json.dumps(request_data) if request_data else None + response = await make_request( + url="https://api.usepylon.com/accounts/{account_id}/highlights/{highlight_id}".format( # noqa: UP032 + account_id=account_identifier, highlight_id=highlight_id + ), + method="DELETE", + params=remove_none_values({}), + headers=remove_none_values({ + "Authorization": "Bearer {authorization}".format( # noqa: UP032 + authorization=context.get_secret("PYLON_SECRET_TOKEN") + ) + }), + content=content, + ) + try: + return {"response_json": response.json()} + except Exception: + return {"response_text": response.text} + + +@tool(requires_secrets=["PYLON_SECRET_TOKEN"]) +async def update_account_highlight( + context: ToolContext, + account_identifier: Annotated[ + str, + "The internal account ID (UUID) or external ID (any string) of the account associated with the highlight.", # noqa: E501 + ], + highlight_id: Annotated[ + str, + "The unique identifier of the highlight you wish to update. Ensure this accurately corresponds to the highlight needing modification.", # noqa: E501 + ], + updated_expiration_timestamp: Annotated[ + str | None, "The new expiration timestamp for the highlight in RFC3339 format." + ] = None, + updated_html_content: Annotated[ + str | None, "The updated HTML content for the account highlight." + ] = None, +) -> Annotated[dict[str, Any], "Response from the API endpoint 'UpdateAccountHighlight'."]: + """Updates the highlight for a specified account. + + Use this tool to update the highlight information for a given account by specifying either the internal account ID or an external ID. Appropriate when modifications to account highlights are needed.""" # noqa: E501 + request_data: Any = { + "content_html": updated_html_content, + "expires_at": updated_expiration_timestamp, + } + if isinstance(request_data, dict): + request_data = remove_none_values(request_data) + content = json.dumps(request_data) if request_data else None + response = await make_request( + url="https://api.usepylon.com/accounts/{account_id}/highlights/{highlight_id}".format( # noqa: UP032 + highlight_id=highlight_id, account_id=account_identifier + ), + method="PATCH", + params=remove_none_values({}), + headers=remove_none_values({ + "Content-Type": "application/json", + "Authorization": "Bearer {authorization}".format( # noqa: UP032 + authorization=context.get_secret("PYLON_SECRET_TOKEN") + ), + }), + content=content, + ) + try: + return {"response_json": response.json()} + except Exception: + return {"response_text": response.text} + + +@tool(requires_secrets=["PYLON_SECRET_TOKEN"]) +async def delete_account( + context: ToolContext, + account_id: Annotated[str, "The ID or external ID of the account to delete."], +) -> Annotated[dict[str, Any], "Response from the API endpoint 'DeleteAccount'."]: + """Delete an existing account. + + This tool deletes an existing account based on the provided account ID. Call this tool when you need to permanently remove an account.""" # noqa: E501 + request_data: Any = {} + if isinstance(request_data, dict): + request_data = remove_none_values(request_data) + content = json.dumps(request_data) if request_data else None + response = await make_request( + url="https://api.usepylon.com/accounts/{id}".format(id=account_id), # noqa: UP032 + method="DELETE", + params=remove_none_values({}), + headers=remove_none_values({ + "Authorization": "Bearer {authorization}".format( # noqa: UP032 + authorization=context.get_secret("PYLON_SECRET_TOKEN") + ) + }), + content=content, + ) + try: + return {"response_json": response.json()} + except Exception: + return {"response_text": response.text} + + +@tool(requires_secrets=["PYLON_SECRET_TOKEN"]) +async def get_account_info( + context: ToolContext, + account_id: Annotated[str, "The ID or external ID of the account to fetch."], +) -> Annotated[dict[str, Any], "Response from the API endpoint 'GetAccount'."]: + """Retrieve an account's details using its ID or external ID. + + Call this tool to obtain detailed information about an account by providing either the account ID or external ID.""" # noqa: E501 + request_data: Any = {} + if isinstance(request_data, dict): + request_data = remove_none_values(request_data) + content = json.dumps(request_data) if request_data else None + response = await make_request( + url="https://api.usepylon.com/accounts/{id}".format(id=account_id), # noqa: UP032 + method="GET", + params=remove_none_values({}), + headers=remove_none_values({ + "Authorization": "Bearer {authorization}".format( # noqa: UP032 + authorization=context.get_secret("PYLON_SECRET_TOKEN") + ) + }), + content=content, + ) + try: + return {"response_json": response.json()} + except Exception: + return {"response_text": response.text} + + +@tool(requires_secrets=["PYLON_SECRET_TOKEN"]) +async def update_account( + context: ToolContext, + mode: Annotated[ + ToolMode, + "Operation mode: 'get_request_schema' returns the OpenAPI spec " + "for the request body, 'execute' performs the actual operation", + ], + account_id: Annotated[ + str | None, + "The ID or external ID of the account to update. Required when mode is 'execute', ignored when mode is 'get_request_schema'.", # noqa: E501 + ] = None, + request_body: Annotated[ + str | None, + "Stringified JSON representing the request body. Required when " + "mode is 'execute', ignored when mode is 'get_request_schema'", + ] = None, +) -> Annotated[dict[str, Any], "Response from the API endpoint 'UpdateAccount'."]: + """Update details of an existing account. + + Use this tool to modify the information of an existing account by providing the account ID and new details. It should be called when account information needs to be updated. + + Note: Understanding the request schema is necessary to properly create + the stringified JSON input object for execution.\n\nThis operation also requires path parameters. + + Modes: + - GET_REQUEST_SCHEMA: Returns the schema. Only call if you don't + already have it. Do NOT call repeatedly if you already received + the schema. + - EXECUTE: Performs the operation with the provided request body + JSON.\n Note: You must also provide the required path parameters when executing. + + If you need the schema, call with mode='get_request_schema' ONCE, then execute. + """ # noqa: E501 + if mode == ToolMode.GET_REQUEST_SCHEMA: + return { + "request_body_schema": REQUEST_BODY_SCHEMAS["UPDATEACCOUNT"], + "instructions": ( + "Use the request_body_schema to construct a valid JSON object. " + "Once you have populated the object following the schema " + "structure and requirements, call this tool again with " + "mode='execute' and the stringified JSON as the " + "request_body parameter along with the required path parameters. " + "Do NOT call the schema mode again - you already have " + "the schema now." + ), + } + + # Mode is EXECUTE - validate parameters + # Validate required parameters + missing_params = [] + if not account_id: + missing_params.append(("account_id", "path")) + + if missing_params: + param_names = [p[0] for p in missing_params] + param_details = ", ".join([f"{p[0]} ({p[1]})" for p in missing_params]) + raise RetryableToolError( + message=f"Missing required parameters: {param_names}", + developer_message=(f"Required parameters validation failed: {param_details}"), + additional_prompt_content=( + f"The following required parameters are missing: " + f"{param_details}. Please call this tool again with all " + "required parameters." + ), + ) + + # Validate request body is provided (not None or empty string) + # Note: Empty objects like {} are allowed - schema validation will check if valid + if request_body is None or request_body.strip() == "": + raise RetryableToolError( + message="Request body is required when mode is 'execute'", + developer_message="The request_body parameter was null or empty string", + additional_prompt_content=( + "The request body is required to perform this operation. " + "Use the schema below to construct a valid JSON object, " + "then call this tool again in execute mode with the " + "stringified JSON as the request_body parameter.\n\n" + "Schema:\n\n```json\n" + REQUEST_BODY_SCHEMAS["UPDATEACCOUNT"] + "\n```" + ), + ) + + # Parse JSON + try: + request_data = json.loads(request_body) + except json.JSONDecodeError as e: + raise RetryableToolError( + message=f"Invalid JSON in request body: {e!s}", + developer_message=f"JSON parsing failed: {e!s}", + additional_prompt_content=( + f"The request body contains invalid JSON. Error: {e!s}\n\n" + "Please provide a valid JSON string that matches the schema " + "below, then call this tool again in execute mode.\n\n" + "Schema:\n\n```json\n" + REQUEST_BODY_SCHEMAS["UPDATEACCOUNT"] + "\n```" + ), + ) from e + + response = await make_request_with_schema_validation( + url="https://api.usepylon.com/accounts/{id}".format(id=account_id), # noqa: UP032 + method="PATCH", + request_data=request_data, + schema=REQUEST_BODY_SCHEMAS["UPDATEACCOUNT"], + params=remove_none_values({}), + headers=remove_none_values({ + "Content-Type": "application/json", + "Authorization": "Bearer {authorization}".format( # noqa: UP032 + authorization=context.get_secret("PYLON_SECRET_TOKEN") + ), + }), + ) + try: + return {"response_json": response.json()} + except Exception: + return {"response_text": response.text} + + +@tool(requires_secrets=["PYLON_SECRET_TOKEN"]) +async def create_account_activity( + context: ToolContext, + mode: Annotated[ + ToolMode, + "Operation mode: 'get_request_schema' returns the OpenAPI spec " + "for the request body, 'execute' performs the actual operation", + ], + account_id_for_activity: Annotated[ + str | None, + "The internal or external ID of the account to create the activity for. Accepts a UUID or any string format. Required when mode is 'execute', ignored when mode is 'get_request_schema'.", # noqa: E501 + ] = None, + request_body: Annotated[ + str | None, + "Stringified JSON representing the request body. Required when " + "mode is 'execute', ignored when mode is 'get_request_schema'", + ] = None, +) -> Annotated[dict[str, Any], "Response from the API endpoint 'CreateActivity'."]: + """Creates a new activity for a specified account. + + Use this tool to add a new activity to an account by providing the account's internal or external ID. It will confirm the creation of the activity. + + Note: Understanding the request schema is necessary to properly create + the stringified JSON input object for execution.\n\nThis operation also requires path parameters. + + Modes: + - GET_REQUEST_SCHEMA: Returns the schema. Only call if you don't + already have it. Do NOT call repeatedly if you already received + the schema. + - EXECUTE: Performs the operation with the provided request body + JSON.\n Note: You must also provide the required path parameters when executing. + + If you need the schema, call with mode='get_request_schema' ONCE, then execute. + """ # noqa: E501 + if mode == ToolMode.GET_REQUEST_SCHEMA: + return { + "request_body_schema": REQUEST_BODY_SCHEMAS["CREATEACCOUNTACTIVITY"], + "instructions": ( + "Use the request_body_schema to construct a valid JSON object. " + "Once you have populated the object following the schema " + "structure and requirements, call this tool again with " + "mode='execute' and the stringified JSON as the " + "request_body parameter along with the required path parameters. " + "Do NOT call the schema mode again - you already have " + "the schema now." + ), + } + + # Mode is EXECUTE - validate parameters + # Validate required parameters + missing_params = [] + if not account_id_for_activity: + missing_params.append(("account_id_for_activity", "path")) + + if missing_params: + param_names = [p[0] for p in missing_params] + param_details = ", ".join([f"{p[0]} ({p[1]})" for p in missing_params]) + raise RetryableToolError( + message=f"Missing required parameters: {param_names}", + developer_message=(f"Required parameters validation failed: {param_details}"), + additional_prompt_content=( + f"The following required parameters are missing: " + f"{param_details}. Please call this tool again with all " + "required parameters." + ), + ) + + # Validate request body is provided (not None or empty string) + # Note: Empty objects like {} are allowed - schema validation will check if valid + if request_body is None or request_body.strip() == "": + raise RetryableToolError( + message="Request body is required when mode is 'execute'", + developer_message="The request_body parameter was null or empty string", + additional_prompt_content=( + "The request body is required to perform this operation. " + "Use the schema below to construct a valid JSON object, " + "then call this tool again in execute mode with the " + "stringified JSON as the request_body parameter.\n\n" + "Schema:\n\n```json\n" + REQUEST_BODY_SCHEMAS["CREATEACCOUNTACTIVITY"] + "\n```" + ), + ) + + # Parse JSON + try: + request_data = json.loads(request_body) + except json.JSONDecodeError as e: + raise RetryableToolError( + message=f"Invalid JSON in request body: {e!s}", + developer_message=f"JSON parsing failed: {e!s}", + additional_prompt_content=( + f"The request body contains invalid JSON. Error: {e!s}\n\n" + "Please provide a valid JSON string that matches the schema " + "below, then call this tool again in execute mode.\n\n" + "Schema:\n\n```json\n" + REQUEST_BODY_SCHEMAS["CREATEACCOUNTACTIVITY"] + "\n```" + ), + ) from e + + response = await make_request_with_schema_validation( + url="https://api.usepylon.com/accounts/{id}/activities".format(id=account_id_for_activity), # noqa: UP032 + method="POST", + request_data=request_data, + schema=REQUEST_BODY_SCHEMAS["CREATEACCOUNTACTIVITY"], + params=remove_none_values({}), + headers=remove_none_values({ + "Content-Type": "application/json", + "Authorization": "Bearer {authorization}".format( # noqa: UP032 + authorization=context.get_secret("PYLON_SECRET_TOKEN") + ), + }), + ) + try: + return {"response_json": response.json()} + except Exception: + return {"response_text": response.text} + + +@tool(requires_secrets=["PYLON_SECRET_TOKEN"]) +async def get_custom_activity_types( + context: ToolContext, +) -> Annotated[dict[str, Any], "Response from the API endpoint 'GetActivityTypes'."]: + """Retrieve a list of custom activity types. + + Use this tool to get a list of custom activity types that are available. It should be called when there's a need to know what custom activity types exist.""" # noqa: E501 + request_data: Any = {} + if isinstance(request_data, dict): + request_data = remove_none_values(request_data) + content = json.dumps(request_data) if request_data else None + response = await make_request( + url="https://api.usepylon.com/activity-types", + method="GET", + params=remove_none_values({}), + headers=remove_none_values({ + "Authorization": "Bearer {authorization}".format( # noqa: UP032 + authorization=context.get_secret("PYLON_SECRET_TOKEN") + ) + }), + content=content, + ) + try: + return {"response_json": response.json()} + except Exception: + return {"response_text": response.text} + + +@tool(requires_secrets=["PYLON_SECRET_TOKEN"]) +async def get_all_contacts( + context: ToolContext, +) -> Annotated[dict[str, Any], "Response from the API endpoint 'GetContacts'."]: + """Retrieve all contacts from the service. + + This tool retrieves all contacts using the Pylon service. It should be called when there's a need to fetch a complete list of contacts from the service.""" # noqa: E501 + request_data: Any = {} + if isinstance(request_data, dict): + request_data = remove_none_values(request_data) + content = json.dumps(request_data) if request_data else None + response = await make_request( + url="https://api.usepylon.com/contacts", + method="GET", + params=remove_none_values({}), + headers=remove_none_values({ + "Authorization": "Bearer {authorization}".format( # noqa: UP032 + authorization=context.get_secret("PYLON_SECRET_TOKEN") + ) + }), + content=content, + ) + try: + return {"response_json": response.json()} + except Exception: + return {"response_text": response.text} + + +@tool(requires_secrets=["PYLON_SECRET_TOKEN"]) +async def create_new_contact( + context: ToolContext, + mode: Annotated[ + ToolMode, + "Operation mode: 'get_request_schema' returns the OpenAPI spec " + "for the request body, 'execute' performs the actual operation", + ], + request_body: Annotated[ + str | None, + "Stringified JSON representing the request body. Required when " + "mode is 'execute', ignored when mode is 'get_request_schema'", + ] = None, +) -> Annotated[dict[str, Any], "Response from the API endpoint 'CreateContact'."]: + """Create a new contact in the system. + + This tool creates a new contact by sending the necessary details to the endpoint. Use it when you need to add a new person's contact information to the database. + + Note: Understanding the request schema is necessary to properly create + the stringified JSON input object for execution. + + Modes: + - GET_REQUEST_SCHEMA: Returns the schema. Only call if you don't + already have it. Do NOT call repeatedly if you already received + the schema. + - EXECUTE: Performs the operation with the provided request body + JSON. + + If you need the schema, call with mode='get_request_schema' ONCE, then execute. + """ # noqa: E501 + if mode == ToolMode.GET_REQUEST_SCHEMA: + return { + "request_body_schema": REQUEST_BODY_SCHEMAS["CREATENEWCONTACT"], + "instructions": ( + "Use the request_body_schema to construct a valid JSON object. " + "Once you have populated the object following the schema " + "structure and requirements, call this tool again with " + "mode='execute' and the stringified JSON as the " + "request_body parameter. " + "Do NOT call the schema mode again - you already have " + "the schema now." + ), + } + + # Mode is EXECUTE - validate parameters + + # Validate request body is provided (not None or empty string) + # Note: Empty objects like {} are allowed - schema validation will check if valid + if request_body is None or request_body.strip() == "": + raise RetryableToolError( + message="Request body is required when mode is 'execute'", + developer_message="The request_body parameter was null or empty string", + additional_prompt_content=( + "The request body is required to perform this operation. " + "Use the schema below to construct a valid JSON object, " + "then call this tool again in execute mode with the " + "stringified JSON as the request_body parameter.\n\n" + "Schema:\n\n```json\n" + REQUEST_BODY_SCHEMAS["CREATENEWCONTACT"] + "\n```" + ), + ) + + # Parse JSON + try: + request_data = json.loads(request_body) + except json.JSONDecodeError as e: + raise RetryableToolError( + message=f"Invalid JSON in request body: {e!s}", + developer_message=f"JSON parsing failed: {e!s}", + additional_prompt_content=( + f"The request body contains invalid JSON. Error: {e!s}\n\n" + "Please provide a valid JSON string that matches the schema " + "below, then call this tool again in execute mode.\n\n" + "Schema:\n\n```json\n" + REQUEST_BODY_SCHEMAS["CREATENEWCONTACT"] + "\n```" + ), + ) from e + + response = await make_request_with_schema_validation( + url="https://api.usepylon.com/contacts", + method="POST", + request_data=request_data, + schema=REQUEST_BODY_SCHEMAS["CREATENEWCONTACT"], + params=remove_none_values({}), + headers=remove_none_values({ + "Content-Type": "application/json", + "Authorization": "Bearer {authorization}".format( # noqa: UP032 + authorization=context.get_secret("PYLON_SECRET_TOKEN") + ), + }), + ) + try: + return {"response_json": response.json()} + except Exception: + return {"response_text": response.text} + + +@tool(requires_secrets=["PYLON_SECRET_TOKEN"]) +async def search_contacts( + context: ToolContext, + mode: Annotated[ + ToolMode, + "Operation mode: 'get_request_schema' returns the OpenAPI spec " + "for the request body, 'execute' performs the actual operation", + ], + request_body: Annotated[ + str | None, + "Stringified JSON representing the request body. Required when " + "mode is 'execute', ignored when mode is 'get_request_schema'", + ] = None, +) -> Annotated[dict[str, Any], "Response from the API endpoint 'SearchContacts'."]: + """Search for contacts using various filter criteria. + + This tool allows you to search for contacts by applying filters on fields such as id, email, custom fields, and account_id. Use it to find specific contacts based on these criteria. + + Note: Understanding the request schema is necessary to properly create + the stringified JSON input object for execution. + + Modes: + - GET_REQUEST_SCHEMA: Returns the schema. Only call if you don't + already have it. Do NOT call repeatedly if you already received + the schema. + - EXECUTE: Performs the operation with the provided request body + JSON. + + If you need the schema, call with mode='get_request_schema' ONCE, then execute. + """ # noqa: E501 + if mode == ToolMode.GET_REQUEST_SCHEMA: + return { + "request_body_schema": REQUEST_BODY_SCHEMAS["SEARCHCONTACTS"], + "instructions": ( + "Use the request_body_schema to construct a valid JSON object. " + "Once you have populated the object following the schema " + "structure and requirements, call this tool again with " + "mode='execute' and the stringified JSON as the " + "request_body parameter. " + "Do NOT call the schema mode again - you already have " + "the schema now." + ), + } + + # Mode is EXECUTE - validate parameters + + # Validate request body is provided (not None or empty string) + # Note: Empty objects like {} are allowed - schema validation will check if valid + if request_body is None or request_body.strip() == "": + raise RetryableToolError( + message="Request body is required when mode is 'execute'", + developer_message="The request_body parameter was null or empty string", + additional_prompt_content=( + "The request body is required to perform this operation. " + "Use the schema below to construct a valid JSON object, " + "then call this tool again in execute mode with the " + "stringified JSON as the request_body parameter.\n\n" + "Schema:\n\n```json\n" + REQUEST_BODY_SCHEMAS["SEARCHCONTACTS"] + "\n```" + ), + ) + + # Parse JSON + try: + request_data = json.loads(request_body) + except json.JSONDecodeError as e: + raise RetryableToolError( + message=f"Invalid JSON in request body: {e!s}", + developer_message=f"JSON parsing failed: {e!s}", + additional_prompt_content=( + f"The request body contains invalid JSON. Error: {e!s}\n\n" + "Please provide a valid JSON string that matches the schema " + "below, then call this tool again in execute mode.\n\n" + "Schema:\n\n```json\n" + REQUEST_BODY_SCHEMAS["SEARCHCONTACTS"] + "\n```" + ), + ) from e + + response = await make_request( + url="https://api.usepylon.com/contacts/search", + method="POST", + params=remove_none_values({}), + headers=remove_none_values({ + "Content-Type": "application/json", + "Authorization": "Bearer {authorization}".format( # noqa: UP032 + authorization=context.get_secret("PYLON_SECRET_TOKEN") + ), + }), + content=json.dumps(request_data), + ) + try: + return {"response_json": response.json()} + except Exception: + return {"response_text": response.text} + + +@tool(requires_secrets=["PYLON_SECRET_TOKEN"]) +async def delete_contact( + context: ToolContext, + contact_id: Annotated[str, "The ID of the contact to be deleted."], +) -> Annotated[dict[str, Any], "Response from the API endpoint 'DeleteContact'."]: + """Delete an existing contact by ID. + + This tool deletes a contact by its ID. It should be called when a user needs to remove a contact from the system.""" # noqa: E501 + request_data: Any = {} + if isinstance(request_data, dict): + request_data = remove_none_values(request_data) + content = json.dumps(request_data) if request_data else None + response = await make_request( + url="https://api.usepylon.com/contacts/{id}".format(id=contact_id), # noqa: UP032 + method="DELETE", + params=remove_none_values({}), + headers=remove_none_values({ + "Authorization": "Bearer {authorization}".format( # noqa: UP032 + authorization=context.get_secret("PYLON_SECRET_TOKEN") + ) + }), + content=content, + ) + try: + return {"response_json": response.json()} + except Exception: + return {"response_text": response.text} + + +@tool(requires_secrets=["PYLON_SECRET_TOKEN"]) +async def get_contact_by_id( + context: ToolContext, + contact_id: Annotated[str, "The unique identifier for the contact to fetch details."], + number_of_accounts_to_fetch: Annotated[ + int, + "Specifies the number of accounts to fetch. Must be between 1 and 999. Defaults to 100 if not provided.", # noqa: E501 + ], + pagination_cursor: Annotated[ + str | None, + "A string representing the cursor for pagination purposes, used to fetch the next set of results in a paginated response.", # noqa: E501 + ] = None, +) -> Annotated[dict[str, Any], "Response from the API endpoint 'GetContact'."]: + """Retrieve contact details using the contact ID. + + This tool fetches and returns contact details by querying with a specified contact ID. Use it when you need to obtain specific contact information.""" # noqa: E501 + request_data: Any = {} + if isinstance(request_data, dict): + request_data = remove_none_values(request_data) + content = json.dumps(request_data) if request_data else None + response = await make_request( + url="https://api.usepylon.com/contacts/{id}".format(id=contact_id), # noqa: UP032 + method="GET", + params=remove_none_values({ + "cursor": pagination_cursor, + "limit": number_of_accounts_to_fetch, + }), + headers=remove_none_values({ + "Authorization": "Bearer {authorization}".format( # noqa: UP032 + authorization=context.get_secret("PYLON_SECRET_TOKEN") + ) + }), + content=content, + ) + try: + return {"response_json": response.json()} + except Exception: + return {"response_text": response.text} + + +@tool(requires_secrets=["PYLON_SECRET_TOKEN"]) +async def update_contact_info( + context: ToolContext, + mode: Annotated[ + ToolMode, + "Operation mode: 'get_request_schema' returns the OpenAPI spec " + "for the request body, 'execute' performs the actual operation", + ], + contact_id: Annotated[ + str | None, + "The unique identifier of the contact to be updated. This should match the existing contact's ID in the system. Required when mode is 'execute', ignored when mode is 'get_request_schema'.", # noqa: E501 + ] = None, + request_body: Annotated[ + str | None, + "Stringified JSON representing the request body. Required when " + "mode is 'execute', ignored when mode is 'get_request_schema'", + ] = None, +) -> Annotated[dict[str, Any], "Response from the API endpoint 'UpdateContact'."]: + """Updates an existing contact's information. + + Use this tool to update the details of an existing contact when modifications are needed. + + Note: Understanding the request schema is necessary to properly create + the stringified JSON input object for execution.\n\nThis operation also requires path parameters. + + Modes: + - GET_REQUEST_SCHEMA: Returns the schema. Only call if you don't + already have it. Do NOT call repeatedly if you already received + the schema. + - EXECUTE: Performs the operation with the provided request body + JSON.\n Note: You must also provide the required path parameters when executing. + + If you need the schema, call with mode='get_request_schema' ONCE, then execute. + """ # noqa: E501 + if mode == ToolMode.GET_REQUEST_SCHEMA: + return { + "request_body_schema": REQUEST_BODY_SCHEMAS["UPDATECONTACTINFO"], + "instructions": ( + "Use the request_body_schema to construct a valid JSON object. " + "Once you have populated the object following the schema " + "structure and requirements, call this tool again with " + "mode='execute' and the stringified JSON as the " + "request_body parameter along with the required path parameters. " + "Do NOT call the schema mode again - you already have " + "the schema now." + ), + } + + # Mode is EXECUTE - validate parameters + # Validate required parameters + missing_params = [] + if not contact_id: + missing_params.append(("contact_id", "path")) + + if missing_params: + param_names = [p[0] for p in missing_params] + param_details = ", ".join([f"{p[0]} ({p[1]})" for p in missing_params]) + raise RetryableToolError( + message=f"Missing required parameters: {param_names}", + developer_message=(f"Required parameters validation failed: {param_details}"), + additional_prompt_content=( + f"The following required parameters are missing: " + f"{param_details}. Please call this tool again with all " + "required parameters." + ), + ) + + # Validate request body is provided (not None or empty string) + # Note: Empty objects like {} are allowed - schema validation will check if valid + if request_body is None or request_body.strip() == "": + raise RetryableToolError( + message="Request body is required when mode is 'execute'", + developer_message="The request_body parameter was null or empty string", + additional_prompt_content=( + "The request body is required to perform this operation. " + "Use the schema below to construct a valid JSON object, " + "then call this tool again in execute mode with the " + "stringified JSON as the request_body parameter.\n\n" + "Schema:\n\n```json\n" + REQUEST_BODY_SCHEMAS["UPDATECONTACTINFO"] + "\n```" + ), + ) + + # Parse JSON + try: + request_data = json.loads(request_body) + except json.JSONDecodeError as e: + raise RetryableToolError( + message=f"Invalid JSON in request body: {e!s}", + developer_message=f"JSON parsing failed: {e!s}", + additional_prompt_content=( + f"The request body contains invalid JSON. Error: {e!s}\n\n" + "Please provide a valid JSON string that matches the schema " + "below, then call this tool again in execute mode.\n\n" + "Schema:\n\n```json\n" + REQUEST_BODY_SCHEMAS["UPDATECONTACTINFO"] + "\n```" + ), + ) from e + + response = await make_request_with_schema_validation( + url="https://api.usepylon.com/contacts/{id}".format(id=contact_id), # noqa: UP032 + method="PATCH", + request_data=request_data, + schema=REQUEST_BODY_SCHEMAS["UPDATECONTACTINFO"], + params=remove_none_values({}), + headers=remove_none_values({ + "Content-Type": "application/json", + "Authorization": "Bearer {authorization}".format( # noqa: UP032 + authorization=context.get_secret("PYLON_SECRET_TOKEN") + ), + }), + ) + try: + return {"response_json": response.json()} + except Exception: + return {"response_text": response.text} + + +@tool(requires_secrets=["PYLON_SECRET_TOKEN"]) +async def get_all_custom_fields( + context: ToolContext, + custom_field_object_type: Annotated[ + str, 'Specify the object type for custom fields. Options: "account", "issue", or "contact".' + ], +) -> Annotated[dict[str, Any], "Response from the API endpoint 'GetCustomFields'."]: + """Retrieve all custom fields from the system. + + This tool is used to get a complete list of custom fields. It should be called when you need information about available custom fields.""" # noqa: E501 + request_data: Any = {} + if isinstance(request_data, dict): + request_data = remove_none_values(request_data) + content = json.dumps(request_data) if request_data else None + response = await make_request( + url="https://api.usepylon.com/custom-fields", + method="GET", + params=remove_none_values({"object_type": custom_field_object_type}), + headers=remove_none_values({ + "Authorization": "Bearer {authorization}".format( # noqa: UP032 + authorization=context.get_secret("PYLON_SECRET_TOKEN") + ) + }), + content=content, + ) + try: + return {"response_json": response.json()} + except Exception: + return {"response_text": response.text} + + +@tool(requires_secrets=["PYLON_SECRET_TOKEN"]) +async def create_custom_field( + context: ToolContext, + mode: Annotated[ + ToolMode, + "Operation mode: 'get_request_schema' returns the OpenAPI spec " + "for the request body, 'execute' performs the actual operation", + ], + request_body: Annotated[ + str | None, + "Stringified JSON representing the request body. Required when " + "mode is 'execute', ignored when mode is 'get_request_schema'", + ] = None, +) -> Annotated[dict[str, Any], "Response from the API endpoint 'CreateCustomField'."]: + """Create a new custom field in the system. + + Use this tool to add a custom field to your database or application configuration. It allows for extending the available data fields to include additional, personalized information. + + Note: Understanding the request schema is necessary to properly create + the stringified JSON input object for execution. + + Modes: + - GET_REQUEST_SCHEMA: Returns the schema. Only call if you don't + already have it. Do NOT call repeatedly if you already received + the schema. + - EXECUTE: Performs the operation with the provided request body + JSON. + + If you need the schema, call with mode='get_request_schema' ONCE, then execute. + """ # noqa: E501 + if mode == ToolMode.GET_REQUEST_SCHEMA: + return { + "request_body_schema": REQUEST_BODY_SCHEMAS["CREATECUSTOMFIELD"], + "instructions": ( + "Use the request_body_schema to construct a valid JSON object. " + "Once you have populated the object following the schema " + "structure and requirements, call this tool again with " + "mode='execute' and the stringified JSON as the " + "request_body parameter. " + "Do NOT call the schema mode again - you already have " + "the schema now." + ), + } + + # Mode is EXECUTE - validate parameters + + # Validate request body is provided (not None or empty string) + # Note: Empty objects like {} are allowed - schema validation will check if valid + if request_body is None or request_body.strip() == "": + raise RetryableToolError( + message="Request body is required when mode is 'execute'", + developer_message="The request_body parameter was null or empty string", + additional_prompt_content=( + "The request body is required to perform this operation. " + "Use the schema below to construct a valid JSON object, " + "then call this tool again in execute mode with the " + "stringified JSON as the request_body parameter.\n\n" + "Schema:\n\n```json\n" + REQUEST_BODY_SCHEMAS["CREATECUSTOMFIELD"] + "\n```" + ), + ) + + # Parse JSON + try: + request_data = json.loads(request_body) + except json.JSONDecodeError as e: + raise RetryableToolError( + message=f"Invalid JSON in request body: {e!s}", + developer_message=f"JSON parsing failed: {e!s}", + additional_prompt_content=( + f"The request body contains invalid JSON. Error: {e!s}\n\n" + "Please provide a valid JSON string that matches the schema " + "below, then call this tool again in execute mode.\n\n" + "Schema:\n\n```json\n" + REQUEST_BODY_SCHEMAS["CREATECUSTOMFIELD"] + "\n```" + ), + ) from e + + response = await make_request_with_schema_validation( + url="https://api.usepylon.com/custom-fields", + method="POST", + request_data=request_data, + schema=REQUEST_BODY_SCHEMAS["CREATECUSTOMFIELD"], + params=remove_none_values({}), + headers=remove_none_values({ + "Content-Type": "application/json", + "Authorization": "Bearer {authorization}".format( # noqa: UP032 + authorization=context.get_secret("PYLON_SECRET_TOKEN") + ), + }), + ) + try: + return {"response_json": response.json()} + except Exception: + return {"response_text": response.text} + + +@tool(requires_secrets=["PYLON_SECRET_TOKEN"]) +async def get_custom_field( + context: ToolContext, + custom_field_id: Annotated[str, "The unique identifier of the custom field to retrieve."], +) -> Annotated[dict[str, Any], "Response from the API endpoint 'GetCustomField'."]: + """Retrieve a custom field by its ID. + + Use this tool to obtain details of a specific custom field using its unique identifier.""" + request_data: Any = {} + if isinstance(request_data, dict): + request_data = remove_none_values(request_data) + content = json.dumps(request_data) if request_data else None + response = await make_request( + url="https://api.usepylon.com/custom-fields/{id}".format(id=custom_field_id), # noqa: UP032 + method="GET", + params=remove_none_values({}), + headers=remove_none_values({ + "Authorization": "Bearer {authorization}".format( # noqa: UP032 + authorization=context.get_secret("PYLON_SECRET_TOKEN") + ) + }), + content=content, + ) + try: + return {"response_json": response.json()} + except Exception: + return {"response_text": response.text} + + +@tool(requires_secrets=["PYLON_SECRET_TOKEN"]) +async def update_custom_field( + context: ToolContext, + mode: Annotated[ + ToolMode, + "Operation mode: 'get_request_schema' returns the OpenAPI spec " + "for the request body, 'execute' performs the actual operation", + ], + custom_field_id: Annotated[ + str | None, + "The unique identifier for the custom field to be updated. Required when mode is 'execute', ignored when mode is 'get_request_schema'.", # noqa: E501 + ] = None, + request_body: Annotated[ + str | None, + "Stringified JSON representing the request body. Required when " + "mode is 'execute', ignored when mode is 'get_request_schema'", + ] = None, +) -> Annotated[dict[str, Any], "Response from the API endpoint 'UpdateCustomField'."]: + """Update a custom field in a record. + + + + Note: Understanding the request schema is necessary to properly create + the stringified JSON input object for execution.\n\nThis operation also requires path parameters. + + Modes: + - GET_REQUEST_SCHEMA: Returns the schema. Only call if you don't + already have it. Do NOT call repeatedly if you already received + the schema. + - EXECUTE: Performs the operation with the provided request body + JSON.\n Note: You must also provide the required path parameters when executing. + + If you need the schema, call with mode='get_request_schema' ONCE, then execute. + """ # noqa: E501 + if mode == ToolMode.GET_REQUEST_SCHEMA: + return { + "request_body_schema": REQUEST_BODY_SCHEMAS["UPDATECUSTOMFIELD"], + "instructions": ( + "Use the request_body_schema to construct a valid JSON object. " + "Once you have populated the object following the schema " + "structure and requirements, call this tool again with " + "mode='execute' and the stringified JSON as the " + "request_body parameter along with the required path parameters. " + "Do NOT call the schema mode again - you already have " + "the schema now." + ), + } + + # Mode is EXECUTE - validate parameters + # Validate required parameters + missing_params = [] + if not custom_field_id: + missing_params.append(("custom_field_id", "path")) + + if missing_params: + param_names = [p[0] for p in missing_params] + param_details = ", ".join([f"{p[0]} ({p[1]})" for p in missing_params]) + raise RetryableToolError( + message=f"Missing required parameters: {param_names}", + developer_message=(f"Required parameters validation failed: {param_details}"), + additional_prompt_content=( + f"The following required parameters are missing: " + f"{param_details}. Please call this tool again with all " + "required parameters." + ), + ) + + # Validate request body is provided (not None or empty string) + # Note: Empty objects like {} are allowed - schema validation will check if valid + if request_body is None or request_body.strip() == "": + raise RetryableToolError( + message="Request body is required when mode is 'execute'", + developer_message="The request_body parameter was null or empty string", + additional_prompt_content=( + "The request body is required to perform this operation. " + "Use the schema below to construct a valid JSON object, " + "then call this tool again in execute mode with the " + "stringified JSON as the request_body parameter.\n\n" + "Schema:\n\n```json\n" + REQUEST_BODY_SCHEMAS["UPDATECUSTOMFIELD"] + "\n```" + ), + ) + + # Parse JSON + try: + request_data = json.loads(request_body) + except json.JSONDecodeError as e: + raise RetryableToolError( + message=f"Invalid JSON in request body: {e!s}", + developer_message=f"JSON parsing failed: {e!s}", + additional_prompt_content=( + f"The request body contains invalid JSON. Error: {e!s}\n\n" + "Please provide a valid JSON string that matches the schema " + "below, then call this tool again in execute mode.\n\n" + "Schema:\n\n```json\n" + REQUEST_BODY_SCHEMAS["UPDATECUSTOMFIELD"] + "\n```" + ), + ) from e + + response = await make_request_with_schema_validation( + url="https://api.usepylon.com/custom-fields/{id}".format(id=custom_field_id), # noqa: UP032 + method="PATCH", + request_data=request_data, + schema=REQUEST_BODY_SCHEMAS["UPDATECUSTOMFIELD"], + params=remove_none_values({}), + headers=remove_none_values({ + "Content-Type": "application/json", + "Authorization": "Bearer {authorization}".format( # noqa: UP032 + authorization=context.get_secret("PYLON_SECRET_TOKEN") + ), + }), + ) + try: + return {"response_json": response.json()} + except Exception: + return {"response_text": response.text} + + +@tool(requires_secrets=["PYLON_SECRET_TOKEN"]) +async def import_new_contact( + context: ToolContext, + mode: Annotated[ + ToolMode, + "Operation mode: 'get_request_schema' returns the OpenAPI spec " + "for the request body, 'execute' performs the actual operation", + ], + request_body: Annotated[ + str | None, + "Stringified JSON representing the request body. Required when " + "mode is 'execute', ignored when mode is 'get_request_schema'", + ] = None, +) -> Annotated[dict[str, Any], "Response from the API endpoint 'ImportContact'."]: + """Import a new contact into the system. + + Use this tool to import a new contact into the system whenever you need to add contact information. + + Note: Understanding the request schema is necessary to properly create + the stringified JSON input object for execution. + + Modes: + - GET_REQUEST_SCHEMA: Returns the schema. Only call if you don't + already have it. Do NOT call repeatedly if you already received + the schema. + - EXECUTE: Performs the operation with the provided request body + JSON. + + If you need the schema, call with mode='get_request_schema' ONCE, then execute. + """ # noqa: E501 + if mode == ToolMode.GET_REQUEST_SCHEMA: + return { + "request_body_schema": REQUEST_BODY_SCHEMAS["IMPORTNEWCONTACT"], + "instructions": ( + "Use the request_body_schema to construct a valid JSON object. " + "Once you have populated the object following the schema " + "structure and requirements, call this tool again with " + "mode='execute' and the stringified JSON as the " + "request_body parameter. " + "Do NOT call the schema mode again - you already have " + "the schema now." + ), + } + + # Mode is EXECUTE - validate parameters + + # Validate request body is provided (not None or empty string) + # Note: Empty objects like {} are allowed - schema validation will check if valid + if request_body is None or request_body.strip() == "": + raise RetryableToolError( + message="Request body is required when mode is 'execute'", + developer_message="The request_body parameter was null or empty string", + additional_prompt_content=( + "The request body is required to perform this operation. " + "Use the schema below to construct a valid JSON object, " + "then call this tool again in execute mode with the " + "stringified JSON as the request_body parameter.\n\n" + "Schema:\n\n```json\n" + REQUEST_BODY_SCHEMAS["IMPORTNEWCONTACT"] + "\n```" + ), + ) + + # Parse JSON + try: + request_data = json.loads(request_body) + except json.JSONDecodeError as e: + raise RetryableToolError( + message=f"Invalid JSON in request body: {e!s}", + developer_message=f"JSON parsing failed: {e!s}", + additional_prompt_content=( + f"The request body contains invalid JSON. Error: {e!s}\n\n" + "Please provide a valid JSON string that matches the schema " + "below, then call this tool again in execute mode.\n\n" + "Schema:\n\n```json\n" + REQUEST_BODY_SCHEMAS["IMPORTNEWCONTACT"] + "\n```" + ), + ) from e + + response = await make_request_with_schema_validation( + url="https://api.usepylon.com/import/contacts", + method="POST", + request_data=request_data, + schema=REQUEST_BODY_SCHEMAS["IMPORTNEWCONTACT"], + params=remove_none_values({}), + headers=remove_none_values({ + "Content-Type": "application/json", + "Authorization": "Bearer {authorization}".format( # noqa: UP032 + authorization=context.get_secret("PYLON_SECRET_TOKEN") + ), + }), + ) + try: + return {"response_json": response.json()} + except Exception: + return {"response_text": response.text} + + +@tool(requires_secrets=["PYLON_SECRET_TOKEN"]) +async def import_issue( + context: ToolContext, + mode: Annotated[ + ToolMode, + "Operation mode: 'get_request_schema' returns the OpenAPI spec " + "for the request body, 'execute' performs the actual operation", + ], + request_body: Annotated[ + str | None, + "Stringified JSON representing the request body. Required when " + "mode is 'execute', ignored when mode is 'get_request_schema'", + ] = None, +) -> Annotated[dict[str, Any], "Response from the API endpoint 'ImportIssue'."]: + """Import an issue into the system. + + This tool is used to import an issue into the Pylon system. Use it when you need to add new issues by importing them through a specified format or integration. + + Note: Understanding the request schema is necessary to properly create + the stringified JSON input object for execution. + + Modes: + - GET_REQUEST_SCHEMA: Returns the schema. Only call if you don't + already have it. Do NOT call repeatedly if you already received + the schema. + - EXECUTE: Performs the operation with the provided request body + JSON. + + If you need the schema, call with mode='get_request_schema' ONCE, then execute. + """ # noqa: E501 + if mode == ToolMode.GET_REQUEST_SCHEMA: + return { + "request_body_schema": REQUEST_BODY_SCHEMAS["IMPORTISSUE"], + "instructions": ( + "Use the request_body_schema to construct a valid JSON object. " + "Once you have populated the object following the schema " + "structure and requirements, call this tool again with " + "mode='execute' and the stringified JSON as the " + "request_body parameter. " + "Do NOT call the schema mode again - you already have " + "the schema now." + ), + } + + # Mode is EXECUTE - validate parameters + + # Validate request body is provided (not None or empty string) + # Note: Empty objects like {} are allowed - schema validation will check if valid + if request_body is None or request_body.strip() == "": + raise RetryableToolError( + message="Request body is required when mode is 'execute'", + developer_message="The request_body parameter was null or empty string", + additional_prompt_content=( + "The request body is required to perform this operation. " + "Use the schema below to construct a valid JSON object, " + "then call this tool again in execute mode with the " + "stringified JSON as the request_body parameter.\n\n" + "Schema:\n\n```json\n" + REQUEST_BODY_SCHEMAS["IMPORTISSUE"] + "\n```" + ), + ) + + # Parse JSON + try: + request_data = json.loads(request_body) + except json.JSONDecodeError as e: + raise RetryableToolError( + message=f"Invalid JSON in request body: {e!s}", + developer_message=f"JSON parsing failed: {e!s}", + additional_prompt_content=( + f"The request body contains invalid JSON. Error: {e!s}\n\n" + "Please provide a valid JSON string that matches the schema " + "below, then call this tool again in execute mode.\n\n" + "Schema:\n\n```json\n" + REQUEST_BODY_SCHEMAS["IMPORTISSUE"] + "\n```" + ), + ) from e + + response = await make_request_with_schema_validation( + url="https://api.usepylon.com/import/issues", + method="POST", + request_data=request_data, + schema=REQUEST_BODY_SCHEMAS["IMPORTISSUE"], + params=remove_none_values({}), + headers=remove_none_values({ + "Content-Type": "application/json", + "Authorization": "Bearer {authorization}".format( # noqa: UP032 + authorization=context.get_secret("PYLON_SECRET_TOKEN") + ), + }), + ) + try: + return {"response_json": response.json()} + except Exception: + return {"response_text": response.text} + + +@tool(requires_secrets=["PYLON_SECRET_TOKEN"]) +async def import_messages_to_issue( + context: ToolContext, + mode: Annotated[ + ToolMode, + "Operation mode: 'get_request_schema' returns the OpenAPI spec " + "for the request body, 'execute' performs the actual operation", + ], + issue_id: Annotated[ + str | None, + "The unique ID of the existing issue to which messages will be imported. Required when mode is 'execute', ignored when mode is 'get_request_schema'.", # noqa: E501 + ] = None, + request_body: Annotated[ + str | None, + "Stringified JSON representing the request body. Required when " + "mode is 'execute', ignored when mode is 'get_request_schema'", + ] = None, +) -> Annotated[dict[str, Any], "Response from the API endpoint 'ImportMessages'."]: + """Import messages into an existing issue. + + Use this tool to import new messages onto an existing issue, facilitating better organization and tracking within issue management systems. + + Note: Understanding the request schema is necessary to properly create + the stringified JSON input object for execution.\n\nThis operation also requires path parameters. + + Modes: + - GET_REQUEST_SCHEMA: Returns the schema. Only call if you don't + already have it. Do NOT call repeatedly if you already received + the schema. + - EXECUTE: Performs the operation with the provided request body + JSON.\n Note: You must also provide the required path parameters when executing. + + If you need the schema, call with mode='get_request_schema' ONCE, then execute. + """ # noqa: E501 + if mode == ToolMode.GET_REQUEST_SCHEMA: + return { + "request_body_schema": REQUEST_BODY_SCHEMAS["IMPORTMESSAGESTOISSUE"], + "instructions": ( + "Use the request_body_schema to construct a valid JSON object. " + "Once you have populated the object following the schema " + "structure and requirements, call this tool again with " + "mode='execute' and the stringified JSON as the " + "request_body parameter along with the required path parameters. " + "Do NOT call the schema mode again - you already have " + "the schema now." + ), + } + + # Mode is EXECUTE - validate parameters + # Validate required parameters + missing_params = [] + if not issue_id: + missing_params.append(("issue_id", "path")) + + if missing_params: + param_names = [p[0] for p in missing_params] + param_details = ", ".join([f"{p[0]} ({p[1]})" for p in missing_params]) + raise RetryableToolError( + message=f"Missing required parameters: {param_names}", + developer_message=(f"Required parameters validation failed: {param_details}"), + additional_prompt_content=( + f"The following required parameters are missing: " + f"{param_details}. Please call this tool again with all " + "required parameters." + ), + ) + + # Validate request body is provided (not None or empty string) + # Note: Empty objects like {} are allowed - schema validation will check if valid + if request_body is None or request_body.strip() == "": + raise RetryableToolError( + message="Request body is required when mode is 'execute'", + developer_message="The request_body parameter was null or empty string", + additional_prompt_content=( + "The request body is required to perform this operation. " + "Use the schema below to construct a valid JSON object, " + "then call this tool again in execute mode with the " + "stringified JSON as the request_body parameter.\n\n" + "Schema:\n\n```json\n" + REQUEST_BODY_SCHEMAS["IMPORTMESSAGESTOISSUE"] + "\n```" + ), + ) + + # Parse JSON + try: + request_data = json.loads(request_body) + except json.JSONDecodeError as e: + raise RetryableToolError( + message=f"Invalid JSON in request body: {e!s}", + developer_message=f"JSON parsing failed: {e!s}", + additional_prompt_content=( + f"The request body contains invalid JSON. Error: {e!s}\n\n" + "Please provide a valid JSON string that matches the schema " + "below, then call this tool again in execute mode.\n\n" + "Schema:\n\n```json\n" + REQUEST_BODY_SCHEMAS["IMPORTMESSAGESTOISSUE"] + "\n```" + ), + ) from e + + response = await make_request_with_schema_validation( + url="https://api.usepylon.com/import/issues/{id}/messages".format(id=issue_id), # noqa: UP032 + method="POST", + request_data=request_data, + schema=REQUEST_BODY_SCHEMAS["IMPORTMESSAGESTOISSUE"], + params=remove_none_values({}), + headers=remove_none_values({ + "Content-Type": "application/json", + "Authorization": "Bearer {authorization}".format( # noqa: UP032 + authorization=context.get_secret("PYLON_SECRET_TOKEN") + ), + }), + ) + try: + return {"response_json": response.json()} + except Exception: + return {"response_text": response.text} + + +@tool(requires_secrets=["PYLON_SECRET_TOKEN"]) +async def get_issue_statuses( + context: ToolContext, +) -> Annotated[dict[str, Any], "Response from the API endpoint 'GetIssueStatuses'."]: + """Retrieve all issue statuses from the system. + + Use this tool to get a complete list of issue statuses available in the project management system. This can help with tracking and managing project workflows efficiently.""" # noqa: E501 + request_data: Any = {} + if isinstance(request_data, dict): + request_data = remove_none_values(request_data) + content = json.dumps(request_data) if request_data else None + response = await make_request( + url="https://api.usepylon.com/issue-statuses", + method="GET", + params=remove_none_values({}), + headers=remove_none_values({ + "Authorization": "Bearer {authorization}".format( # noqa: UP032 + authorization=context.get_secret("PYLON_SECRET_TOKEN") + ) + }), + content=content, + ) + try: + return {"response_json": response.json()} + except Exception: + return {"response_text": response.text} + + +@tool(requires_secrets=["PYLON_SECRET_TOKEN"]) +async def get_issues_list( + context: ToolContext, + end_time_rfc3339: Annotated[ + str, + "The end time in RFC3339 format for the issue retrieval range, must be within 30 days of the start time.", # noqa: E501 + ], + start_time_for_issue_range: Annotated[ + str, + "The start time in RFC3339 format to query issues. Duration with end_time must be <= 30 days.", # noqa: E501 + ], +) -> Annotated[dict[str, Any], "Response from the API endpoint 'GetIssues'."]: + """Retrieve a list of issues. + + Call this tool to get a list of issues from the Pylon service, useful for tracking or managing tasks and bugs.""" # noqa: E501 + request_data: Any = {} + if isinstance(request_data, dict): + request_data = remove_none_values(request_data) + content = json.dumps(request_data) if request_data else None + response = await make_request( + url="https://api.usepylon.com/issues", + method="GET", + params=remove_none_values({ + "start_time": start_time_for_issue_range, + "end_time": end_time_rfc3339, + }), + headers=remove_none_values({ + "Authorization": "Bearer {authorization}".format( # noqa: UP032 + authorization=context.get_secret("PYLON_SECRET_TOKEN") + ) + }), + content=content, + ) + try: + return {"response_json": response.json()} + except Exception: + return {"response_text": response.text} + + +@tool(requires_secrets=["PYLON_SECRET_TOKEN"]) +async def create_new_issue( + context: ToolContext, + mode: Annotated[ + ToolMode, + "Operation mode: 'get_request_schema' returns the OpenAPI spec " + "for the request body, 'execute' performs the actual operation", + ], + request_body: Annotated[ + str | None, + "Stringified JSON representing the request body. Required when " + "mode is 'execute', ignored when mode is 'get_request_schema'", + ] = None, +) -> Annotated[dict[str, Any], "Response from the API endpoint 'CreateIssue'."]: + """Create a new issue in the system. + + This tool is used to create a new issue in the system. It should be called whenever there's a need to log or track a new issue or task. + + Note: Understanding the request schema is necessary to properly create + the stringified JSON input object for execution. + + Modes: + - GET_REQUEST_SCHEMA: Returns the schema. Only call if you don't + already have it. Do NOT call repeatedly if you already received + the schema. + - EXECUTE: Performs the operation with the provided request body + JSON. + + If you need the schema, call with mode='get_request_schema' ONCE, then execute. + """ # noqa: E501 + if mode == ToolMode.GET_REQUEST_SCHEMA: + return { + "request_body_schema": REQUEST_BODY_SCHEMAS["CREATENEWISSUE"], + "instructions": ( + "Use the request_body_schema to construct a valid JSON object. " + "Once you have populated the object following the schema " + "structure and requirements, call this tool again with " + "mode='execute' and the stringified JSON as the " + "request_body parameter. " + "Do NOT call the schema mode again - you already have " + "the schema now." + ), + } + + # Mode is EXECUTE - validate parameters + + # Validate request body is provided (not None or empty string) + # Note: Empty objects like {} are allowed - schema validation will check if valid + if request_body is None or request_body.strip() == "": + raise RetryableToolError( + message="Request body is required when mode is 'execute'", + developer_message="The request_body parameter was null or empty string", + additional_prompt_content=( + "The request body is required to perform this operation. " + "Use the schema below to construct a valid JSON object, " + "then call this tool again in execute mode with the " + "stringified JSON as the request_body parameter.\n\n" + "Schema:\n\n```json\n" + REQUEST_BODY_SCHEMAS["CREATENEWISSUE"] + "\n```" + ), + ) + + # Parse JSON + try: + request_data = json.loads(request_body) + except json.JSONDecodeError as e: + raise RetryableToolError( + message=f"Invalid JSON in request body: {e!s}", + developer_message=f"JSON parsing failed: {e!s}", + additional_prompt_content=( + f"The request body contains invalid JSON. Error: {e!s}\n\n" + "Please provide a valid JSON string that matches the schema " + "below, then call this tool again in execute mode.\n\n" + "Schema:\n\n```json\n" + REQUEST_BODY_SCHEMAS["CREATENEWISSUE"] + "\n```" + ), + ) from e + + response = await make_request_with_schema_validation( + url="https://api.usepylon.com/issues", + method="POST", + request_data=request_data, + schema=REQUEST_BODY_SCHEMAS["CREATENEWISSUE"], + params=remove_none_values({}), + headers=remove_none_values({ + "Content-Type": "application/json", + "Authorization": "Bearer {authorization}".format( # noqa: UP032 + authorization=context.get_secret("PYLON_SECRET_TOKEN") + ), + }), + ) + try: + return {"response_json": response.json()} + except Exception: + return {"response_text": response.text} + + +@tool(requires_secrets=["PYLON_SECRET_TOKEN"]) +async def search_issues_by_filters( + context: ToolContext, + mode: Annotated[ + ToolMode, + "Operation mode: 'get_request_schema' returns the OpenAPI spec " + "for the request body, 'execute' performs the actual operation", + ], + request_body: Annotated[ + str | None, + "Stringified JSON representing the request body. Required when " + "mode is 'execute', ignored when mode is 'get_request_schema'", + ] = None, +) -> Annotated[dict[str, Any], "Response from the API endpoint 'SearchIssues'."]: + """Search for issues using various filters and criteria. + + Use this tool to search for issues by applying filters such as creation date, account ID, requester ID, status, tags, title, and more. Suitable for retrieving specific issues according to predefined criteria and operators. + + Note: Understanding the request schema is necessary to properly create + the stringified JSON input object for execution. + + Modes: + - GET_REQUEST_SCHEMA: Returns the schema. Only call if you don't + already have it. Do NOT call repeatedly if you already received + the schema. + - EXECUTE: Performs the operation with the provided request body + JSON. + + If you need the schema, call with mode='get_request_schema' ONCE, then execute. + """ # noqa: E501 + if mode == ToolMode.GET_REQUEST_SCHEMA: + return { + "request_body_schema": REQUEST_BODY_SCHEMAS["SEARCHISSUESBYFILTERS"], + "instructions": ( + "Use the request_body_schema to construct a valid JSON object. " + "Once you have populated the object following the schema " + "structure and requirements, call this tool again with " + "mode='execute' and the stringified JSON as the " + "request_body parameter. " + "Do NOT call the schema mode again - you already have " + "the schema now." + ), + } + + # Mode is EXECUTE - validate parameters + + # Validate request body is provided (not None or empty string) + # Note: Empty objects like {} are allowed - schema validation will check if valid + if request_body is None or request_body.strip() == "": + raise RetryableToolError( + message="Request body is required when mode is 'execute'", + developer_message="The request_body parameter was null or empty string", + additional_prompt_content=( + "The request body is required to perform this operation. " + "Use the schema below to construct a valid JSON object, " + "then call this tool again in execute mode with the " + "stringified JSON as the request_body parameter.\n\n" + "Schema:\n\n```json\n" + REQUEST_BODY_SCHEMAS["SEARCHISSUESBYFILTERS"] + "\n```" + ), + ) + + # Parse JSON + try: + request_data = json.loads(request_body) + except json.JSONDecodeError as e: + raise RetryableToolError( + message=f"Invalid JSON in request body: {e!s}", + developer_message=f"JSON parsing failed: {e!s}", + additional_prompt_content=( + f"The request body contains invalid JSON. Error: {e!s}\n\n" + "Please provide a valid JSON string that matches the schema " + "below, then call this tool again in execute mode.\n\n" + "Schema:\n\n```json\n" + REQUEST_BODY_SCHEMAS["SEARCHISSUESBYFILTERS"] + "\n```" + ), + ) from e + + response = await make_request( + url="https://api.usepylon.com/issues/search", + method="POST", + params=remove_none_values({}), + headers=remove_none_values({ + "Content-Type": "application/json", + "Authorization": "Bearer {authorization}".format( # noqa: UP032 + authorization=context.get_secret("PYLON_SECRET_TOKEN") + ), + }), + content=json.dumps(request_data), + ) + try: + return {"response_json": response.json()} + except Exception: + return {"response_text": response.text} + + +@tool(requires_secrets=["PYLON_SECRET_TOKEN"]) +async def delete_issue( + context: ToolContext, + issue_id: Annotated[str, "The unique identifier of the issue to delete."], +) -> Annotated[dict[str, Any], "Response from the API endpoint 'DeleteIssue'."]: + """Delete an existing issue by ID. + + Use this tool to delete an issue from the system by providing its ID. It is ideal for scenarios where issues need to be managed or cleaned up.""" # noqa: E501 + request_data: Any = {} + if isinstance(request_data, dict): + request_data = remove_none_values(request_data) + content = json.dumps(request_data) if request_data else None + response = await make_request( + url="https://api.usepylon.com/issues/{id}".format(id=issue_id), # noqa: UP032 + method="DELETE", + params=remove_none_values({}), + headers=remove_none_values({ + "Authorization": "Bearer {authorization}".format( # noqa: UP032 + authorization=context.get_secret("PYLON_SECRET_TOKEN") + ) + }), + content=content, + ) + try: + return {"response_json": response.json()} + except Exception: + return {"response_text": response.text} + + +@tool(requires_secrets=["PYLON_SECRET_TOKEN"]) +async def get_issue_by_id( + context: ToolContext, + issue_id: Annotated[str, "The unique ID or number of the issue you want to retrieve."], +) -> Annotated[dict[str, Any], "Response from the API endpoint 'GetIssue'."]: + """Retrieve issue details using its ID or number. + + Use this tool to access details of an issue by providing its specific ID or number. Ideal for tasks requiring detailed issue information retrieval in issue tracking systems.""" # noqa: E501 + request_data: Any = {} + if isinstance(request_data, dict): + request_data = remove_none_values(request_data) + content = json.dumps(request_data) if request_data else None + response = await make_request( + url="https://api.usepylon.com/issues/{id}".format(id=issue_id), # noqa: UP032 + method="GET", + params=remove_none_values({}), + headers=remove_none_values({ + "Authorization": "Bearer {authorization}".format( # noqa: UP032 + authorization=context.get_secret("PYLON_SECRET_TOKEN") + ) + }), + content=content, + ) + try: + return {"response_json": response.json()} + except Exception: + return {"response_text": response.text} + + +@tool(requires_secrets=["PYLON_SECRET_TOKEN"]) +async def update_issue( + context: ToolContext, + mode: Annotated[ + ToolMode, + "Operation mode: 'get_request_schema' returns the OpenAPI spec " + "for the request body, 'execute' performs the actual operation", + ], + issue_id: Annotated[ + str | None, + "The ID of the issue to update. This should be a string representing the unique identifier for the issue. Required when mode is 'execute', ignored when mode is 'get_request_schema'.", # noqa: E501 + ] = None, + request_body: Annotated[ + str | None, + "Stringified JSON representing the request body. Required when " + "mode is 'execute', ignored when mode is 'get_request_schema'", + ] = None, +) -> Annotated[dict[str, Any], "Response from the API endpoint 'UpdateIssue'."]: + """Update details of an existing issue. + + Use this tool to modify information for an already existing issue when changes or corrections are needed. + + Note: Understanding the request schema is necessary to properly create + the stringified JSON input object for execution.\n\nThis operation also requires path parameters. + + Modes: + - GET_REQUEST_SCHEMA: Returns the schema. Only call if you don't + already have it. Do NOT call repeatedly if you already received + the schema. + - EXECUTE: Performs the operation with the provided request body + JSON.\n Note: You must also provide the required path parameters when executing. + + If you need the schema, call with mode='get_request_schema' ONCE, then execute. + """ # noqa: E501 + if mode == ToolMode.GET_REQUEST_SCHEMA: + return { + "request_body_schema": REQUEST_BODY_SCHEMAS["UPDATEISSUE"], + "instructions": ( + "Use the request_body_schema to construct a valid JSON object. " + "Once you have populated the object following the schema " + "structure and requirements, call this tool again with " + "mode='execute' and the stringified JSON as the " + "request_body parameter along with the required path parameters. " + "Do NOT call the schema mode again - you already have " + "the schema now." + ), + } + + # Mode is EXECUTE - validate parameters + # Validate required parameters + missing_params = [] + if not issue_id: + missing_params.append(("issue_id", "path")) + + if missing_params: + param_names = [p[0] for p in missing_params] + param_details = ", ".join([f"{p[0]} ({p[1]})" for p in missing_params]) + raise RetryableToolError( + message=f"Missing required parameters: {param_names}", + developer_message=(f"Required parameters validation failed: {param_details}"), + additional_prompt_content=( + f"The following required parameters are missing: " + f"{param_details}. Please call this tool again with all " + "required parameters." + ), + ) + + # Validate request body is provided (not None or empty string) + # Note: Empty objects like {} are allowed - schema validation will check if valid + if request_body is None or request_body.strip() == "": + raise RetryableToolError( + message="Request body is required when mode is 'execute'", + developer_message="The request_body parameter was null or empty string", + additional_prompt_content=( + "The request body is required to perform this operation. " + "Use the schema below to construct a valid JSON object, " + "then call this tool again in execute mode with the " + "stringified JSON as the request_body parameter.\n\n" + "Schema:\n\n```json\n" + REQUEST_BODY_SCHEMAS["UPDATEISSUE"] + "\n```" + ), + ) + + # Parse JSON + try: + request_data = json.loads(request_body) + except json.JSONDecodeError as e: + raise RetryableToolError( + message=f"Invalid JSON in request body: {e!s}", + developer_message=f"JSON parsing failed: {e!s}", + additional_prompt_content=( + f"The request body contains invalid JSON. Error: {e!s}\n\n" + "Please provide a valid JSON string that matches the schema " + "below, then call this tool again in execute mode.\n\n" + "Schema:\n\n```json\n" + REQUEST_BODY_SCHEMAS["UPDATEISSUE"] + "\n```" + ), + ) from e + + response = await make_request_with_schema_validation( + url="https://api.usepylon.com/issues/{id}".format(id=issue_id), # noqa: UP032 + method="PATCH", + request_data=request_data, + schema=REQUEST_BODY_SCHEMAS["UPDATEISSUE"], + params=remove_none_values({}), + headers=remove_none_values({ + "Content-Type": "application/json", + "Authorization": "Bearer {authorization}".format( # noqa: UP032 + authorization=context.get_secret("PYLON_SECRET_TOKEN") + ), + }), + ) + try: + return {"response_json": response.json()} + except Exception: + return {"response_text": response.text} + + +@tool(requires_secrets=["PYLON_SECRET_TOKEN"]) +async def create_ai_response_for_issue( + context: ToolContext, + mode: Annotated[ + ToolMode, + "Operation mode: 'get_request_schema' returns the OpenAPI spec " + "for the request body, 'execute' performs the actual operation", + ], + issue_id: Annotated[ + str | None, + "The unique ID or number of the issue for which an AI response is required. Required when mode is 'execute', ignored when mode is 'get_request_schema'.", # noqa: E501 + ] = None, + request_body: Annotated[ + str | None, + "Stringified JSON representing the request body. Required when " + "mode is 'execute', ignored when mode is 'get_request_schema'", + ] = None, +) -> Annotated[dict[str, Any], "Response from the API endpoint 'CreateIssueAIResponse'."]: + """Generate an AI response for a specific issue. + + This tool creates an AI-generated response for a given issue by specifying the issue ID. It should be called when an automated response is required for issue resolution or documentation. + + Note: Understanding the request schema is necessary to properly create + the stringified JSON input object for execution.\n\nThis operation also requires path parameters. + + Modes: + - GET_REQUEST_SCHEMA: Returns the schema. Only call if you don't + already have it. Do NOT call repeatedly if you already received + the schema. + - EXECUTE: Performs the operation with the provided request body + JSON.\n Note: You must also provide the required path parameters when executing. + + If you need the schema, call with mode='get_request_schema' ONCE, then execute. + """ # noqa: E501 + if mode == ToolMode.GET_REQUEST_SCHEMA: + return { + "request_body_schema": REQUEST_BODY_SCHEMAS["CREATEAIRESPONSEFORISSUE"], + "instructions": ( + "Use the request_body_schema to construct a valid JSON object. " + "Once you have populated the object following the schema " + "structure and requirements, call this tool again with " + "mode='execute' and the stringified JSON as the " + "request_body parameter along with the required path parameters. " + "Do NOT call the schema mode again - you already have " + "the schema now." + ), + } + + # Mode is EXECUTE - validate parameters + # Validate required parameters + missing_params = [] + if not issue_id: + missing_params.append(("issue_id", "path")) + + if missing_params: + param_names = [p[0] for p in missing_params] + param_details = ", ".join([f"{p[0]} ({p[1]})" for p in missing_params]) + raise RetryableToolError( + message=f"Missing required parameters: {param_names}", + developer_message=(f"Required parameters validation failed: {param_details}"), + additional_prompt_content=( + f"The following required parameters are missing: " + f"{param_details}. Please call this tool again with all " + "required parameters." + ), + ) + + # Validate request body is provided (not None or empty string) + # Note: Empty objects like {} are allowed - schema validation will check if valid + if request_body is None or request_body.strip() == "": + raise RetryableToolError( + message="Request body is required when mode is 'execute'", + developer_message="The request_body parameter was null or empty string", + additional_prompt_content=( + "The request body is required to perform this operation. " + "Use the schema below to construct a valid JSON object, " + "then call this tool again in execute mode with the " + "stringified JSON as the request_body parameter.\n\n" + "Schema:\n\n```json\n" + REQUEST_BODY_SCHEMAS["CREATEAIRESPONSEFORISSUE"] + "\n```" + ), + ) + + # Parse JSON + try: + request_data = json.loads(request_body) + except json.JSONDecodeError as e: + raise RetryableToolError( + message=f"Invalid JSON in request body: {e!s}", + developer_message=f"JSON parsing failed: {e!s}", + additional_prompt_content=( + f"The request body contains invalid JSON. Error: {e!s}\n\n" + "Please provide a valid JSON string that matches the schema " + "below, then call this tool again in execute mode.\n\n" + "Schema:\n\n```json\n" + REQUEST_BODY_SCHEMAS["CREATEAIRESPONSEFORISSUE"] + "\n```" + ), + ) from e + + response = await make_request_with_schema_validation( + url="https://api.usepylon.com/issues/{id}/ai-response".format(id=issue_id), # noqa: UP032 + method="POST", + request_data=request_data, + schema=REQUEST_BODY_SCHEMAS["CREATEAIRESPONSEFORISSUE"], + params=remove_none_values({}), + headers=remove_none_values({ + "Content-Type": "application/json", + "Authorization": "Bearer {authorization}".format( # noqa: UP032 + authorization=context.get_secret("PYLON_SECRET_TOKEN") + ), + }), + ) + try: + return {"response_json": response.json()} + except Exception: + return {"response_text": response.text} + + +@tool(requires_secrets=["PYLON_SECRET_TOKEN"]) +async def link_external_issue( + context: ToolContext, + mode: Annotated[ + ToolMode, + "Operation mode: 'get_request_schema' returns the OpenAPI spec " + "for the request body, 'execute' performs the actual operation", + ], + issue_identifier: Annotated[ + str | None, + "The unique ID or number of the internal issue to which external issues should be linked or unlinked. Required when mode is 'execute', ignored when mode is 'get_request_schema'.", # noqa: E501 + ] = None, + request_body: Annotated[ + str | None, + "Stringified JSON representing the request body. Required when " + "mode is 'execute', ignored when mode is 'get_request_schema'", + ] = None, +) -> Annotated[dict[str, Any], "Response from the API endpoint 'LinkExternalIssue'."]: + """Link or unlink external issues to an internal issue. + + Use this tool to link external issues to an internal issue or unlink them by specifying the operation type. Ideal for managing issue relationships between different systems. + + Note: Understanding the request schema is necessary to properly create + the stringified JSON input object for execution.\n\nThis operation also requires path parameters. + + Modes: + - GET_REQUEST_SCHEMA: Returns the schema. Only call if you don't + already have it. Do NOT call repeatedly if you already received + the schema. + - EXECUTE: Performs the operation with the provided request body + JSON.\n Note: You must also provide the required path parameters when executing. + + If you need the schema, call with mode='get_request_schema' ONCE, then execute. + """ # noqa: E501 + if mode == ToolMode.GET_REQUEST_SCHEMA: + return { + "request_body_schema": REQUEST_BODY_SCHEMAS["LINKEXTERNALISSUE"], + "instructions": ( + "Use the request_body_schema to construct a valid JSON object. " + "Once you have populated the object following the schema " + "structure and requirements, call this tool again with " + "mode='execute' and the stringified JSON as the " + "request_body parameter along with the required path parameters. " + "Do NOT call the schema mode again - you already have " + "the schema now." + ), + } + + # Mode is EXECUTE - validate parameters + # Validate required parameters + missing_params = [] + if not issue_identifier: + missing_params.append(("issue_identifier", "path")) + + if missing_params: + param_names = [p[0] for p in missing_params] + param_details = ", ".join([f"{p[0]} ({p[1]})" for p in missing_params]) + raise RetryableToolError( + message=f"Missing required parameters: {param_names}", + developer_message=(f"Required parameters validation failed: {param_details}"), + additional_prompt_content=( + f"The following required parameters are missing: " + f"{param_details}. Please call this tool again with all " + "required parameters." + ), + ) + + # Validate request body is provided (not None or empty string) + # Note: Empty objects like {} are allowed - schema validation will check if valid + if request_body is None or request_body.strip() == "": + raise RetryableToolError( + message="Request body is required when mode is 'execute'", + developer_message="The request_body parameter was null or empty string", + additional_prompt_content=( + "The request body is required to perform this operation. " + "Use the schema below to construct a valid JSON object, " + "then call this tool again in execute mode with the " + "stringified JSON as the request_body parameter.\n\n" + "Schema:\n\n```json\n" + REQUEST_BODY_SCHEMAS["LINKEXTERNALISSUE"] + "\n```" + ), + ) + + # Parse JSON + try: + request_data = json.loads(request_body) + except json.JSONDecodeError as e: + raise RetryableToolError( + message=f"Invalid JSON in request body: {e!s}", + developer_message=f"JSON parsing failed: {e!s}", + additional_prompt_content=( + f"The request body contains invalid JSON. Error: {e!s}\n\n" + "Please provide a valid JSON string that matches the schema " + "below, then call this tool again in execute mode.\n\n" + "Schema:\n\n```json\n" + REQUEST_BODY_SCHEMAS["LINKEXTERNALISSUE"] + "\n```" + ), + ) from e + + response = await make_request_with_schema_validation( + url="https://api.usepylon.com/issues/{id}/external-issues".format(id=issue_identifier), # noqa: UP032 + method="POST", + request_data=request_data, + schema=REQUEST_BODY_SCHEMAS["LINKEXTERNALISSUE"], + params=remove_none_values({}), + headers=remove_none_values({ + "Content-Type": "application/json", + "Authorization": "Bearer {authorization}".format( # noqa: UP032 + authorization=context.get_secret("PYLON_SECRET_TOKEN") + ), + }), + ) + try: + return {"response_json": response.json()} + except Exception: + return {"response_text": response.text} + + +@tool(requires_secrets=["PYLON_SECRET_TOKEN"]) +async def get_issue_followers( + context: ToolContext, + issue_id: Annotated[str, "The unique ID or number of the issue to retrieve followers for."], +) -> Annotated[dict[str, Any], "Response from the API endpoint 'GetIssueFollowers'."]: + """Get followers of a specific issue to manage participation. + + This tool retrieves the list of users who are following a specified issue. Use this tool when you need to know who is engaging with or interested in updates about an issue.""" # noqa: E501 + request_data: Any = {} + if isinstance(request_data, dict): + request_data = remove_none_values(request_data) + content = json.dumps(request_data) if request_data else None + response = await make_request( + url="https://api.usepylon.com/issues/{id}/followers".format(id=issue_id), # noqa: UP032 + method="GET", + params=remove_none_values({}), + headers=remove_none_values({ + "Authorization": "Bearer {authorization}".format( # noqa: UP032 + authorization=context.get_secret("PYLON_SECRET_TOKEN") + ) + }), + content=content, + ) + try: + return {"response_json": response.json()} + except Exception: + return {"response_text": response.text} + + +@tool(requires_secrets=["PYLON_SECRET_TOKEN"]) +async def update_issue_followers( + context: ToolContext, + issue_id: Annotated[str, "The ID or number of the issue to add or remove followers from."], + contact_ids_to_add: Annotated[ + list[str] | None, + "An array of contact IDs to add as followers to the issue. Each ID should be a string.", + ] = None, + update_operation: Annotated[ + str | None, "Specify 'add' to add followers or 'remove' to remove them." + ] = None, + user_ids_to_add_as_followers: Annotated[ + list[str] | None, "List of user IDs to add as followers to a specific issue." + ] = None, +) -> Annotated[dict[str, Any], "Response from the API endpoint 'AddIssueFollowers'."]: + """Add or remove followers for an issue. + + This tool allows you to add or remove followers to a specific issue. Use it when managing the users who should receive notifications about updates on an issue. Set the operation field to \"remove\" to remove followers.""" # noqa: E501 + request_data: Any = { + "contact_ids": contact_ids_to_add, + "operation": update_operation, + "user_ids": user_ids_to_add_as_followers, + } + if isinstance(request_data, dict): + request_data = remove_none_values(request_data) + content = json.dumps(request_data) if request_data else None + response = await make_request( + url="https://api.usepylon.com/issues/{id}/followers".format(id=issue_id), # noqa: UP032 + method="POST", + params=remove_none_values({}), + headers=remove_none_values({ + "Content-Type": "application/json", + "Authorization": "Bearer {authorization}".format( # noqa: UP032 + authorization=context.get_secret("PYLON_SECRET_TOKEN") + ), + }), + content=content, + ) + try: + return {"response_json": response.json()} + except Exception: + return {"response_text": response.text} + + +@tool(requires_secrets=["PYLON_SECRET_TOKEN"]) +async def get_issue_messages( + context: ToolContext, + issue_id: Annotated[str, "The unique ID of the issue for which to retrieve messages."], +) -> Annotated[dict[str, Any], "Response from the API endpoint 'GetIssueMessages'."]: + """Retrieve messages for a specific issue. + + This tool is used to obtain all messages associated with a particular issue, identified by its ID.""" # noqa: E501 + request_data: Any = {} + if isinstance(request_data, dict): + request_data = remove_none_values(request_data) + content = json.dumps(request_data) if request_data else None + response = await make_request( + url="https://api.usepylon.com/issues/{id}/messages".format(id=issue_id), # noqa: UP032 + method="GET", + params=remove_none_values({}), + headers=remove_none_values({ + "Authorization": "Bearer {authorization}".format( # noqa: UP032 + authorization=context.get_secret("PYLON_SECRET_TOKEN") + ) + }), + content=content, + ) + try: + return {"response_json": response.json()} + except Exception: + return {"response_text": response.text} + + +@tool(requires_secrets=["PYLON_SECRET_TOKEN"]) +async def redact_message( + context: ToolContext, + issue_id: Annotated[str, "The ID of the issue associated with the message to be redacted."], + message_id: Annotated[str, "The unique identifier of the message to be redacted."], +) -> Annotated[dict[str, Any], "Response from the API endpoint 'RedactMessage'."]: + """Removes or hides the content of a specified message. + + Use this tool to redact (remove or hide) the content of a message identified by a specific message ID within an issue. This is useful for maintaining privacy or correcting errors.""" # noqa: E501 + request_data: Any = {} + if isinstance(request_data, dict): + request_data = remove_none_values(request_data) + content = json.dumps(request_data) if request_data else None + response = await make_request( + url="https://api.usepylon.com/issues/{id}/messages/{message_id}/redact".format( # noqa: UP032 + id=issue_id, message_id=message_id + ), + method="POST", + params=remove_none_values({}), + headers=remove_none_values({ + "Authorization": "Bearer {authorization}".format( # noqa: UP032 + authorization=context.get_secret("PYLON_SECRET_TOKEN") + ) + }), + content=content, + ) + try: + return {"response_json": response.json()} + except Exception: + return {"response_text": response.text} + + +@tool(requires_secrets=["PYLON_SECRET_TOKEN"]) +async def create_issue_note( + context: ToolContext, + mode: Annotated[ + ToolMode, + "Operation mode: 'get_request_schema' returns the OpenAPI spec " + "for the request body, 'execute' performs the actual operation", + ], + issue_id: Annotated[ + str | None, + "The unique identifier of the issue to which the note will be added. Required when mode is 'execute', ignored when mode is 'get_request_schema'.", # noqa: E501 + ] = None, + request_body: Annotated[ + str | None, + "Stringified JSON representing the request body. Required when " + "mode is 'execute', ignored when mode is 'get_request_schema'", + ] = None, +) -> Annotated[dict[str, Any], "Response from the API endpoint 'CreateIssueNote'."]: + """Creates a note on an issue to track additional details. + + This tool should be called when there's a need to add a note or comment to an existing issue to provide further information or updates. + + Note: Understanding the request schema is necessary to properly create + the stringified JSON input object for execution.\n\nThis operation also requires path parameters. + + Modes: + - GET_REQUEST_SCHEMA: Returns the schema. Only call if you don't + already have it. Do NOT call repeatedly if you already received + the schema. + - EXECUTE: Performs the operation with the provided request body + JSON.\n Note: You must also provide the required path parameters when executing. + + If you need the schema, call with mode='get_request_schema' ONCE, then execute. + """ # noqa: E501 + if mode == ToolMode.GET_REQUEST_SCHEMA: + return { + "request_body_schema": REQUEST_BODY_SCHEMAS["CREATEISSUENOTE"], + "instructions": ( + "Use the request_body_schema to construct a valid JSON object. " + "Once you have populated the object following the schema " + "structure and requirements, call this tool again with " + "mode='execute' and the stringified JSON as the " + "request_body parameter along with the required path parameters. " + "Do NOT call the schema mode again - you already have " + "the schema now." + ), + } + + # Mode is EXECUTE - validate parameters + # Validate required parameters + missing_params = [] + if not issue_id: + missing_params.append(("issue_id", "path")) + + if missing_params: + param_names = [p[0] for p in missing_params] + param_details = ", ".join([f"{p[0]} ({p[1]})" for p in missing_params]) + raise RetryableToolError( + message=f"Missing required parameters: {param_names}", + developer_message=(f"Required parameters validation failed: {param_details}"), + additional_prompt_content=( + f"The following required parameters are missing: " + f"{param_details}. Please call this tool again with all " + "required parameters." + ), + ) + + # Validate request body is provided (not None or empty string) + # Note: Empty objects like {} are allowed - schema validation will check if valid + if request_body is None or request_body.strip() == "": + raise RetryableToolError( + message="Request body is required when mode is 'execute'", + developer_message="The request_body parameter was null or empty string", + additional_prompt_content=( + "The request body is required to perform this operation. " + "Use the schema below to construct a valid JSON object, " + "then call this tool again in execute mode with the " + "stringified JSON as the request_body parameter.\n\n" + "Schema:\n\n```json\n" + REQUEST_BODY_SCHEMAS["CREATEISSUENOTE"] + "\n```" + ), + ) + + # Parse JSON + try: + request_data = json.loads(request_body) + except json.JSONDecodeError as e: + raise RetryableToolError( + message=f"Invalid JSON in request body: {e!s}", + developer_message=f"JSON parsing failed: {e!s}", + additional_prompt_content=( + f"The request body contains invalid JSON. Error: {e!s}\n\n" + "Please provide a valid JSON string that matches the schema " + "below, then call this tool again in execute mode.\n\n" + "Schema:\n\n```json\n" + REQUEST_BODY_SCHEMAS["CREATEISSUENOTE"] + "\n```" + ), + ) from e + + response = await make_request_with_schema_validation( + url="https://api.usepylon.com/issues/{id}/note".format(id=issue_id), # noqa: UP032 + method="POST", + request_data=request_data, + schema=REQUEST_BODY_SCHEMAS["CREATEISSUENOTE"], + params=remove_none_values({}), + headers=remove_none_values({ + "Content-Type": "application/json", + "Authorization": "Bearer {authorization}".format( # noqa: UP032 + authorization=context.get_secret("PYLON_SECRET_TOKEN") + ), + }), + ) + try: + return {"response_json": response.json()} + except Exception: + return {"response_text": response.text} + + +@tool(requires_secrets=["PYLON_SECRET_TOKEN"]) +async def create_issue_reply( + context: ToolContext, + mode: Annotated[ + ToolMode, + "Operation mode: 'get_request_schema' returns the OpenAPI spec " + "for the request body, 'execute' performs the actual operation", + ], + issue_id: Annotated[ + str | None, + "The unique identifier of the issue to which you want to reply. Required when mode is 'execute', ignored when mode is 'get_request_schema'.", # noqa: E501 + ] = None, + request_body: Annotated[ + str | None, + "Stringified JSON representing the request body. Required when " + "mode is 'execute', ignored when mode is 'get_request_schema'", + ] = None, +) -> Annotated[dict[str, Any], "Response from the API endpoint 'CreateIssueReply'."]: + """Create a reply to an existing issue. + + Use this tool to add a comment or response to an existing issue when interaction or follow-up is required. + + Note: Understanding the request schema is necessary to properly create + the stringified JSON input object for execution.\n\nThis operation also requires path parameters. + + Modes: + - GET_REQUEST_SCHEMA: Returns the schema. Only call if you don't + already have it. Do NOT call repeatedly if you already received + the schema. + - EXECUTE: Performs the operation with the provided request body + JSON.\n Note: You must also provide the required path parameters when executing. + + If you need the schema, call with mode='get_request_schema' ONCE, then execute. + """ # noqa: E501 + if mode == ToolMode.GET_REQUEST_SCHEMA: + return { + "request_body_schema": REQUEST_BODY_SCHEMAS["CREATEISSUEREPLY"], + "instructions": ( + "Use the request_body_schema to construct a valid JSON object. " + "Once you have populated the object following the schema " + "structure and requirements, call this tool again with " + "mode='execute' and the stringified JSON as the " + "request_body parameter along with the required path parameters. " + "Do NOT call the schema mode again - you already have " + "the schema now." + ), + } + + # Mode is EXECUTE - validate parameters + # Validate required parameters + missing_params = [] + if not issue_id: + missing_params.append(("issue_id", "path")) + + if missing_params: + param_names = [p[0] for p in missing_params] + param_details = ", ".join([f"{p[0]} ({p[1]})" for p in missing_params]) + raise RetryableToolError( + message=f"Missing required parameters: {param_names}", + developer_message=(f"Required parameters validation failed: {param_details}"), + additional_prompt_content=( + f"The following required parameters are missing: " + f"{param_details}. Please call this tool again with all " + "required parameters." + ), + ) + + # Validate request body is provided (not None or empty string) + # Note: Empty objects like {} are allowed - schema validation will check if valid + if request_body is None or request_body.strip() == "": + raise RetryableToolError( + message="Request body is required when mode is 'execute'", + developer_message="The request_body parameter was null or empty string", + additional_prompt_content=( + "The request body is required to perform this operation. " + "Use the schema below to construct a valid JSON object, " + "then call this tool again in execute mode with the " + "stringified JSON as the request_body parameter.\n\n" + "Schema:\n\n```json\n" + REQUEST_BODY_SCHEMAS["CREATEISSUEREPLY"] + "\n```" + ), + ) + + # Parse JSON + try: + request_data = json.loads(request_body) + except json.JSONDecodeError as e: + raise RetryableToolError( + message=f"Invalid JSON in request body: {e!s}", + developer_message=f"JSON parsing failed: {e!s}", + additional_prompt_content=( + f"The request body contains invalid JSON. Error: {e!s}\n\n" + "Please provide a valid JSON string that matches the schema " + "below, then call this tool again in execute mode.\n\n" + "Schema:\n\n```json\n" + REQUEST_BODY_SCHEMAS["CREATEISSUEREPLY"] + "\n```" + ), + ) from e + + response = await make_request_with_schema_validation( + url="https://api.usepylon.com/issues/{id}/reply".format(id=issue_id), # noqa: UP032 + method="POST", + request_data=request_data, + schema=REQUEST_BODY_SCHEMAS["CREATEISSUEREPLY"], + params=remove_none_values({}), + headers=remove_none_values({ + "Content-Type": "application/json", + "Authorization": "Bearer {authorization}".format( # noqa: UP032 + authorization=context.get_secret("PYLON_SECRET_TOKEN") + ), + }), + ) + try: + return {"response_json": response.json()} + except Exception: + return {"response_text": response.text} + + +@tool(requires_secrets=["PYLON_SECRET_TOKEN"]) +async def snooze_issue( + context: ToolContext, + mode: Annotated[ + ToolMode, + "Operation mode: 'get_request_schema' returns the OpenAPI spec " + "for the request body, 'execute' performs the actual operation", + ], + issue_id: Annotated[ + str | None, + "The ID or number of the issue to snooze. Required when mode is 'execute', ignored when mode is 'get_request_schema'.", # noqa: E501 + ] = None, + request_body: Annotated[ + str | None, + "Stringified JSON representing the request body. Required when " + "mode is 'execute', ignored when mode is 'get_request_schema'", + ] = None, +) -> Annotated[dict[str, Any], "Response from the API endpoint 'SnoozeIssue'."]: + """Temporarily pause notifications for an issue. + + Use this tool to snooze notifications for a specific issue temporarily. It is helpful when you want to focus elsewhere without getting alerts for the issue. + + Note: Understanding the request schema is necessary to properly create + the stringified JSON input object for execution.\n\nThis operation also requires path parameters. + + Modes: + - GET_REQUEST_SCHEMA: Returns the schema. Only call if you don't + already have it. Do NOT call repeatedly if you already received + the schema. + - EXECUTE: Performs the operation with the provided request body + JSON.\n Note: You must also provide the required path parameters when executing. + + If you need the schema, call with mode='get_request_schema' ONCE, then execute. + """ # noqa: E501 + if mode == ToolMode.GET_REQUEST_SCHEMA: + return { + "request_body_schema": REQUEST_BODY_SCHEMAS["SNOOZEISSUE"], + "instructions": ( + "Use the request_body_schema to construct a valid JSON object. " + "Once you have populated the object following the schema " + "structure and requirements, call this tool again with " + "mode='execute' and the stringified JSON as the " + "request_body parameter along with the required path parameters. " + "Do NOT call the schema mode again - you already have " + "the schema now." + ), + } + + # Mode is EXECUTE - validate parameters + # Validate required parameters + missing_params = [] + if not issue_id: + missing_params.append(("issue_id", "path")) + + if missing_params: + param_names = [p[0] for p in missing_params] + param_details = ", ".join([f"{p[0]} ({p[1]})" for p in missing_params]) + raise RetryableToolError( + message=f"Missing required parameters: {param_names}", + developer_message=(f"Required parameters validation failed: {param_details}"), + additional_prompt_content=( + f"The following required parameters are missing: " + f"{param_details}. Please call this tool again with all " + "required parameters." + ), + ) + + # Validate request body is provided (not None or empty string) + # Note: Empty objects like {} are allowed - schema validation will check if valid + if request_body is None or request_body.strip() == "": + raise RetryableToolError( + message="Request body is required when mode is 'execute'", + developer_message="The request_body parameter was null or empty string", + additional_prompt_content=( + "The request body is required to perform this operation. " + "Use the schema below to construct a valid JSON object, " + "then call this tool again in execute mode with the " + "stringified JSON as the request_body parameter.\n\n" + "Schema:\n\n```json\n" + REQUEST_BODY_SCHEMAS["SNOOZEISSUE"] + "\n```" + ), + ) + + # Parse JSON + try: + request_data = json.loads(request_body) + except json.JSONDecodeError as e: + raise RetryableToolError( + message=f"Invalid JSON in request body: {e!s}", + developer_message=f"JSON parsing failed: {e!s}", + additional_prompt_content=( + f"The request body contains invalid JSON. Error: {e!s}\n\n" + "Please provide a valid JSON string that matches the schema " + "below, then call this tool again in execute mode.\n\n" + "Schema:\n\n```json\n" + REQUEST_BODY_SCHEMAS["SNOOZEISSUE"] + "\n```" + ), + ) from e + + response = await make_request_with_schema_validation( + url="https://api.usepylon.com/issues/{id}/snooze".format(id=issue_id), # noqa: UP032 + method="POST", + request_data=request_data, + schema=REQUEST_BODY_SCHEMAS["SNOOZEISSUE"], + params=remove_none_values({}), + headers=remove_none_values({ + "Content-Type": "application/json", + "Authorization": "Bearer {authorization}".format( # noqa: UP032 + authorization=context.get_secret("PYLON_SECRET_TOKEN") + ), + }), + ) + try: + return {"response_json": response.json()} + except Exception: + return {"response_text": response.text} + + +@tool(requires_secrets=["PYLON_SECRET_TOKEN"]) +async def get_issue_threads( + context: ToolContext, + issue_id: Annotated[str, "The unique ID of the issue for which threads need to be retrieved."], +) -> Annotated[dict[str, Any], "Response from the API endpoint 'GetIssueThreads'."]: + """Retrieve threads for a specific issue. + + Call this tool to get all threads associated with a particular issue using its ID. Useful for tracking conversations or discussions related to an issue.""" # noqa: E501 + request_data: Any = {} + if isinstance(request_data, dict): + request_data = remove_none_values(request_data) + content = json.dumps(request_data) if request_data else None + response = await make_request( + url="https://api.usepylon.com/issues/{id}/threads".format(id=issue_id), # noqa: UP032 + method="GET", + params=remove_none_values({}), + headers=remove_none_values({ + "Authorization": "Bearer {authorization}".format( # noqa: UP032 + authorization=context.get_secret("PYLON_SECRET_TOKEN") + ) + }), + content=content, + ) + try: + return {"response_json": response.json()} + except Exception: + return {"response_text": response.text} + + +@tool(requires_secrets=["PYLON_SECRET_TOKEN"]) +async def create_issue_thread( + context: ToolContext, + issue_id: Annotated[ + str, + "The ID for the issue you want to create a thread for. Required to link the thread to the correct issue.", # noqa: E501 + ], + thread_name: Annotated[ + str | None, + "The title or name of the thread to be created. This should be descriptive of the discussion purpose.", # noqa: E501 + ] = None, +) -> Annotated[dict[str, Any], "Response from the API endpoint 'CreateIssueThread'."]: + """Create an issue thread for an existing issue. + + Use this tool to initiate a discussion thread related to a specific issue by providing the issue ID. This helps in organizing conversations around particular issues efficiently.""" # noqa: E501 + request_data: Any = {"name": thread_name} + if isinstance(request_data, dict): + request_data = remove_none_values(request_data) + content = json.dumps(request_data) if request_data else None + response = await make_request( + url="https://api.usepylon.com/issues/{id}/threads".format(id=issue_id), # noqa: UP032 + method="POST", + params=remove_none_values({}), + headers=remove_none_values({ + "Content-Type": "application/json", + "Authorization": "Bearer {authorization}".format( # noqa: UP032 + authorization=context.get_secret("PYLON_SECRET_TOKEN") + ), + }), + content=content, + ) + try: + return {"response_json": response.json()} + except Exception: + return {"response_text": response.text} + + +@tool(requires_secrets=["PYLON_SECRET_TOKEN"]) +async def get_knowledge_bases( + context: ToolContext, +) -> Annotated[dict[str, Any], "Response from the API endpoint 'GetKnowledgeBases'."]: + """Retrieve all available knowledge bases. + + This tool is called to get a list of all knowledge bases from the Pylon service.""" + request_data: Any = {} + if isinstance(request_data, dict): + request_data = remove_none_values(request_data) + content = json.dumps(request_data) if request_data else None + response = await make_request( + url="https://api.usepylon.com/knowledge-bases", + method="GET", + params=remove_none_values({}), + headers=remove_none_values({ + "Authorization": "Bearer {authorization}".format( # noqa: UP032 + authorization=context.get_secret("PYLON_SECRET_TOKEN") + ) + }), + content=content, + ) + try: + return {"response_json": response.json()} + except Exception: + return {"response_text": response.text} + + +@tool(requires_secrets=["PYLON_SECRET_TOKEN"]) +async def get_knowledge_base_by_id( + context: ToolContext, + knowledge_base_id: Annotated[ + str, "The unique identifier for the knowledge base to be retrieved." + ], +) -> Annotated[dict[str, Any], "Response from the API endpoint 'GetKnowledgeBase'."]: + """Retrieve a knowledge base using its ID. + + Use this tool to fetch information about a specific knowledge base by providing its ID.""" + request_data: Any = {} + if isinstance(request_data, dict): + request_data = remove_none_values(request_data) + content = json.dumps(request_data) if request_data else None + response = await make_request( + url="https://api.usepylon.com/knowledge-bases/{id}".format(id=knowledge_base_id), # noqa: UP032 + method="GET", + params=remove_none_values({}), + headers=remove_none_values({ + "Authorization": "Bearer {authorization}".format( # noqa: UP032 + authorization=context.get_secret("PYLON_SECRET_TOKEN") + ) + }), + content=content, + ) + try: + return {"response_json": response.json()} + except Exception: + return {"response_text": response.text} + + +@tool(requires_secrets=["PYLON_SECRET_TOKEN"]) +async def create_knowledge_base_article( + context: ToolContext, + mode: Annotated[ + ToolMode, + "Operation mode: 'get_request_schema' returns the OpenAPI spec " + "for the request body, 'execute' performs the actual operation", + ], + knowledge_base_id: Annotated[ + str | None, + "The unique identifier for the knowledge base where the article will be added. Required when mode is 'execute', ignored when mode is 'get_request_schema'.", # noqa: E501 + ] = None, + request_body: Annotated[ + str | None, + "Stringified JSON representing the request body. Required when " + "mode is 'execute', ignored when mode is 'get_request_schema'", + ] = None, +) -> Annotated[dict[str, Any], "Response from the API endpoint 'CreateArticle'."]: + """Create and publish an article in a knowledge base. + + This tool allows the creation of a new article in a specified knowledge base, including optional translations. If the article is set to publish, translations will also be published. + + Note: Understanding the request schema is necessary to properly create + the stringified JSON input object for execution.\n\nThis operation also requires path parameters. + + Modes: + - GET_REQUEST_SCHEMA: Returns the schema. Only call if you don't + already have it. Do NOT call repeatedly if you already received + the schema. + - EXECUTE: Performs the operation with the provided request body + JSON.\n Note: You must also provide the required path parameters when executing. + + If you need the schema, call with mode='get_request_schema' ONCE, then execute. + """ # noqa: E501 + if mode == ToolMode.GET_REQUEST_SCHEMA: + return { + "request_body_schema": REQUEST_BODY_SCHEMAS["CREATEKNOWLEDGEBASEARTICLE"], + "instructions": ( + "Use the request_body_schema to construct a valid JSON object. " + "Once you have populated the object following the schema " + "structure and requirements, call this tool again with " + "mode='execute' and the stringified JSON as the " + "request_body parameter along with the required path parameters. " + "Do NOT call the schema mode again - you already have " + "the schema now." + ), + } + + # Mode is EXECUTE - validate parameters + # Validate required parameters + missing_params = [] + if not knowledge_base_id: + missing_params.append(("knowledge_base_id", "path")) + + if missing_params: + param_names = [p[0] for p in missing_params] + param_details = ", ".join([f"{p[0]} ({p[1]})" for p in missing_params]) + raise RetryableToolError( + message=f"Missing required parameters: {param_names}", + developer_message=(f"Required parameters validation failed: {param_details}"), + additional_prompt_content=( + f"The following required parameters are missing: " + f"{param_details}. Please call this tool again with all " + "required parameters." + ), + ) + + # Validate request body is provided (not None or empty string) + # Note: Empty objects like {} are allowed - schema validation will check if valid + if request_body is None or request_body.strip() == "": + raise RetryableToolError( + message="Request body is required when mode is 'execute'", + developer_message="The request_body parameter was null or empty string", + additional_prompt_content=( + "The request body is required to perform this operation. " + "Use the schema below to construct a valid JSON object, " + "then call this tool again in execute mode with the " + "stringified JSON as the request_body parameter.\n\n" + "Schema:\n\n```json\n" + + REQUEST_BODY_SCHEMAS["CREATEKNOWLEDGEBASEARTICLE"] + + "\n```" + ), + ) + + # Parse JSON + try: + request_data = json.loads(request_body) + except json.JSONDecodeError as e: + raise RetryableToolError( + message=f"Invalid JSON in request body: {e!s}", + developer_message=f"JSON parsing failed: {e!s}", + additional_prompt_content=( + f"The request body contains invalid JSON. Error: {e!s}\n\n" + "Please provide a valid JSON string that matches the schema " + "below, then call this tool again in execute mode.\n\n" + "Schema:\n\n```json\n" + + REQUEST_BODY_SCHEMAS["CREATEKNOWLEDGEBASEARTICLE"] + + "\n```" + ), + ) from e + + response = await make_request( + url="https://api.usepylon.com/knowledge-bases/{id}/articles".format(id=knowledge_base_id), # noqa: UP032 + method="POST", + params=remove_none_values({}), + headers=remove_none_values({ + "Content-Type": "application/json", + "Authorization": "Bearer {authorization}".format( # noqa: UP032 + authorization=context.get_secret("PYLON_SECRET_TOKEN") + ), + }), + content=json.dumps(request_data), + ) + try: + return {"response_json": response.json()} + except Exception: + return {"response_text": response.text} + + +@tool(requires_secrets=["PYLON_SECRET_TOKEN"]) +async def delete_article( + context: ToolContext, + article_id: Annotated[ + str, "The ID of the article that needs to be deleted from the knowledge base." + ], + knowledge_base_id: Annotated[str, "The KnowledgeBaseID of the article to delete."], +) -> Annotated[dict[str, Any], "Response from the API endpoint 'DeleteArticle'."]: + """Delete an existing article from a knowledge base. + + Call this tool to remove an article from a knowledge base by specifying the knowledge base and article IDs.""" # noqa: E501 + request_data: Any = {} + if isinstance(request_data, dict): + request_data = remove_none_values(request_data) + content = json.dumps(request_data) if request_data else None + response = await make_request( + url="https://api.usepylon.com/knowledge-bases/{id}/articles/{article_id}".format( # noqa: UP032 + id=knowledge_base_id, article_id=article_id + ), + method="DELETE", + params=remove_none_values({}), + headers=remove_none_values({ + "Authorization": "Bearer {authorization}".format( # noqa: UP032 + authorization=context.get_secret("PYLON_SECRET_TOKEN") + ) + }), + content=content, + ) + try: + return {"response_json": response.json()} + except Exception: + return {"response_text": response.text} + + +@tool(requires_secrets=["PYLON_SECRET_TOKEN"]) +async def update_article( + context: ToolContext, + mode: Annotated[ + ToolMode, + "Operation mode: 'get_request_schema' returns the OpenAPI spec " + "for the request body, 'execute' performs the actual operation", + ], + knowledge_base_id: Annotated[ + str | None, + "The identifier for the knowledge base where the article to be updated is located. Required when mode is 'execute', ignored when mode is 'get_request_schema'.", # noqa: E501 + ] = None, + article_id: Annotated[ + str | None, + "Specify the unique identifier of the article you want to update in the knowledge base. Required when mode is 'execute', ignored when mode is 'get_request_schema'.", # noqa: E501 + ] = None, + request_body: Annotated[ + str | None, + "Stringified JSON representing the request body. Required when " + "mode is 'execute', ignored when mode is 'get_request_schema'", + ] = None, +) -> Annotated[dict[str, Any], "Response from the API endpoint 'UpdateArticle'."]: + """Update the content of an existing article. + + Use this tool to modify the content or details of an existing article in a knowledge base when updates are needed. + + Note: Understanding the request schema is necessary to properly create + the stringified JSON input object for execution.\n\nThis operation also requires path parameters. + + Modes: + - GET_REQUEST_SCHEMA: Returns the schema. Only call if you don't + already have it. Do NOT call repeatedly if you already received + the schema. + - EXECUTE: Performs the operation with the provided request body + JSON.\n Note: You must also provide the required path parameters when executing. + + If you need the schema, call with mode='get_request_schema' ONCE, then execute. + """ # noqa: E501 + if mode == ToolMode.GET_REQUEST_SCHEMA: + return { + "request_body_schema": REQUEST_BODY_SCHEMAS["UPDATEARTICLE"], + "instructions": ( + "Use the request_body_schema to construct a valid JSON object. " + "Once you have populated the object following the schema " + "structure and requirements, call this tool again with " + "mode='execute' and the stringified JSON as the " + "request_body parameter along with the required path parameters. " + "Do NOT call the schema mode again - you already have " + "the schema now." + ), + } + + # Mode is EXECUTE - validate parameters + # Validate required parameters + missing_params = [] + if not knowledge_base_id: + missing_params.append(("knowledge_base_id", "path")) + if not article_id: + missing_params.append(("article_id", "path")) + + if missing_params: + param_names = [p[0] for p in missing_params] + param_details = ", ".join([f"{p[0]} ({p[1]})" for p in missing_params]) + raise RetryableToolError( + message=f"Missing required parameters: {param_names}", + developer_message=(f"Required parameters validation failed: {param_details}"), + additional_prompt_content=( + f"The following required parameters are missing: " + f"{param_details}. Please call this tool again with all " + "required parameters." + ), + ) + + # Validate request body is provided (not None or empty string) + # Note: Empty objects like {} are allowed - schema validation will check if valid + if request_body is None or request_body.strip() == "": + raise RetryableToolError( + message="Request body is required when mode is 'execute'", + developer_message="The request_body parameter was null or empty string", + additional_prompt_content=( + "The request body is required to perform this operation. " + "Use the schema below to construct a valid JSON object, " + "then call this tool again in execute mode with the " + "stringified JSON as the request_body parameter.\n\n" + "Schema:\n\n```json\n" + REQUEST_BODY_SCHEMAS["UPDATEARTICLE"] + "\n```" + ), + ) + + # Parse JSON + try: + request_data = json.loads(request_body) + except json.JSONDecodeError as e: + raise RetryableToolError( + message=f"Invalid JSON in request body: {e!s}", + developer_message=f"JSON parsing failed: {e!s}", + additional_prompt_content=( + f"The request body contains invalid JSON. Error: {e!s}\n\n" + "Please provide a valid JSON string that matches the schema " + "below, then call this tool again in execute mode.\n\n" + "Schema:\n\n```json\n" + REQUEST_BODY_SCHEMAS["UPDATEARTICLE"] + "\n```" + ), + ) from e + + response = await make_request( + url="https://api.usepylon.com/knowledge-bases/{id}/articles/{article_id}".format( # noqa: UP032 + id=knowledge_base_id, article_id=article_id + ), + method="PATCH", + params=remove_none_values({}), + headers=remove_none_values({ + "Content-Type": "application/json", + "Authorization": "Bearer {authorization}".format( # noqa: UP032 + authorization=context.get_secret("PYLON_SECRET_TOKEN") + ), + }), + content=json.dumps(request_data), + ) + try: + return {"response_json": response.json()} + except Exception: + return {"response_text": response.text} + + +@tool(requires_secrets=["PYLON_SECRET_TOKEN"]) +async def list_collections_in_knowledge_base( + context: ToolContext, + knowledge_base_id: Annotated[str, "The ID of the knowledge base to list the collections from."], +) -> Annotated[dict[str, Any], "Response from the API endpoint 'GetCollections'."]: + """List all collections in a knowledge base. + + Use this tool to retrieve all collections within a specific knowledge base. Useful for accessing organized information in structured formats.""" # noqa: E501 + request_data: Any = {} + if isinstance(request_data, dict): + request_data = remove_none_values(request_data) + content = json.dumps(request_data) if request_data else None + response = await make_request( + url="https://api.usepylon.com/knowledge-bases/{id}/collections".format( # noqa: UP032 + id=knowledge_base_id + ), + method="GET", + params=remove_none_values({}), + headers=remove_none_values({ + "Authorization": "Bearer {authorization}".format( # noqa: UP032 + authorization=context.get_secret("PYLON_SECRET_TOKEN") + ) + }), + content=content, + ) + try: + return {"response_json": response.json()} + except Exception: + return {"response_text": response.text} + + +@tool(requires_secrets=["PYLON_SECRET_TOKEN"]) +async def create_new_collection( + context: ToolContext, + mode: Annotated[ + ToolMode, + "Operation mode: 'get_request_schema' returns the OpenAPI spec " + "for the request body, 'execute' performs the actual operation", + ], + knowledge_base_id: Annotated[ + str | None, + "The unique identifier for the knowledge base where the new collection will be created. Required when mode is 'execute', ignored when mode is 'get_request_schema'.", # noqa: E501 + ] = None, + request_body: Annotated[ + str | None, + "Stringified JSON representing the request body. Required when " + "mode is 'execute', ignored when mode is 'get_request_schema'", + ] = None, +) -> Annotated[dict[str, Any], "Response from the API endpoint 'CreateCollection'."]: + """Create a new collection in a knowledge base. + + This tool is used to create a new collection within a specified knowledge base by providing the knowledge base ID. + + Note: Understanding the request schema is necessary to properly create + the stringified JSON input object for execution.\n\nThis operation also requires path parameters. + + Modes: + - GET_REQUEST_SCHEMA: Returns the schema. Only call if you don't + already have it. Do NOT call repeatedly if you already received + the schema. + - EXECUTE: Performs the operation with the provided request body + JSON.\n Note: You must also provide the required path parameters when executing. + + If you need the schema, call with mode='get_request_schema' ONCE, then execute. + """ # noqa: E501 + if mode == ToolMode.GET_REQUEST_SCHEMA: + return { + "request_body_schema": REQUEST_BODY_SCHEMAS["CREATENEWCOLLECTION"], + "instructions": ( + "Use the request_body_schema to construct a valid JSON object. " + "Once you have populated the object following the schema " + "structure and requirements, call this tool again with " + "mode='execute' and the stringified JSON as the " + "request_body parameter along with the required path parameters. " + "Do NOT call the schema mode again - you already have " + "the schema now." + ), + } + + # Mode is EXECUTE - validate parameters + # Validate required parameters + missing_params = [] + if not knowledge_base_id: + missing_params.append(("knowledge_base_id", "path")) + + if missing_params: + param_names = [p[0] for p in missing_params] + param_details = ", ".join([f"{p[0]} ({p[1]})" for p in missing_params]) + raise RetryableToolError( + message=f"Missing required parameters: {param_names}", + developer_message=(f"Required parameters validation failed: {param_details}"), + additional_prompt_content=( + f"The following required parameters are missing: " + f"{param_details}. Please call this tool again with all " + "required parameters." + ), + ) + + # Validate request body is provided (not None or empty string) + # Note: Empty objects like {} are allowed - schema validation will check if valid + if request_body is None or request_body.strip() == "": + raise RetryableToolError( + message="Request body is required when mode is 'execute'", + developer_message="The request_body parameter was null or empty string", + additional_prompt_content=( + "The request body is required to perform this operation. " + "Use the schema below to construct a valid JSON object, " + "then call this tool again in execute mode with the " + "stringified JSON as the request_body parameter.\n\n" + "Schema:\n\n```json\n" + REQUEST_BODY_SCHEMAS["CREATENEWCOLLECTION"] + "\n```" + ), + ) + + # Parse JSON + try: + request_data = json.loads(request_body) + except json.JSONDecodeError as e: + raise RetryableToolError( + message=f"Invalid JSON in request body: {e!s}", + developer_message=f"JSON parsing failed: {e!s}", + additional_prompt_content=( + f"The request body contains invalid JSON. Error: {e!s}\n\n" + "Please provide a valid JSON string that matches the schema " + "below, then call this tool again in execute mode.\n\n" + "Schema:\n\n```json\n" + REQUEST_BODY_SCHEMAS["CREATENEWCOLLECTION"] + "\n```" + ), + ) from e + + response = await make_request_with_schema_validation( + url="https://api.usepylon.com/knowledge-bases/{id}/collections".format( # noqa: UP032 + id=knowledge_base_id + ), + method="POST", + request_data=request_data, + schema=REQUEST_BODY_SCHEMAS["CREATENEWCOLLECTION"], + params=remove_none_values({}), + headers=remove_none_values({ + "Content-Type": "application/json", + "Authorization": "Bearer {authorization}".format( # noqa: UP032 + authorization=context.get_secret("PYLON_SECRET_TOKEN") + ), + }), + ) + try: + return {"response_json": response.json()} + except Exception: + return {"response_text": response.text} + + +@tool(requires_secrets=["PYLON_SECRET_TOKEN"]) +async def get_collection_by_id( + context: ToolContext, + collection_id: Annotated[ + str, "The unique ID of the collection to be retrieved from the knowledge base." + ], + knowledge_base_id: Annotated[ + str, "The ID of the knowledge base to which the collection belongs." + ], +) -> Annotated[dict[str, Any], "Response from the API endpoint 'GetCollection'."]: + """Retrieve a specific collection using its ID. + + Use this tool to obtain detailed information about a particular collection by supplying the collection ID. The collection belongs to a specific knowledge base. Ideal for retrieving specific datasets or information collections within larger systems.""" # noqa: E501 + request_data: Any = {} + if isinstance(request_data, dict): + request_data = remove_none_values(request_data) + content = json.dumps(request_data) if request_data else None + response = await make_request( + url="https://api.usepylon.com/knowledge-bases/{id}/collections/{collection_id}".format( # noqa: UP032 + id=knowledge_base_id, collection_id=collection_id + ), + method="GET", + params=remove_none_values({}), + headers=remove_none_values({ + "Authorization": "Bearer {authorization}".format( # noqa: UP032 + authorization=context.get_secret("PYLON_SECRET_TOKEN") + ) + }), + content=content, + ) + try: + return {"response_json": response.json()} + except Exception: + return {"response_text": response.text} + + +@tool(requires_secrets=["PYLON_SECRET_TOKEN"]) +async def create_route_redirect( + context: ToolContext, + mode: Annotated[ + ToolMode, + "Operation mode: 'get_request_schema' returns the OpenAPI spec " + "for the request body, 'execute' performs the actual operation", + ], + knowledge_base_id: Annotated[ + str | None, + "The unique identifier for the knowledge base where the route redirect will be added. Required when mode is 'execute', ignored when mode is 'get_request_schema'.", # noqa: E501 + ] = None, + request_body: Annotated[ + str | None, + "Stringified JSON representing the request body. Required when " + "mode is 'execute', ignored when mode is 'get_request_schema'", + ] = None, +) -> Annotated[dict[str, Any], "Response from the API endpoint 'CreateRouteRedirect'."]: + """Create a new route redirect for a knowledge base. + + This tool is used to create a new route redirect within a specified knowledge base. It should be called when you need to add a redirect to manage or alter the routing within a knowledge base. + + Note: Understanding the request schema is necessary to properly create + the stringified JSON input object for execution.\n\nThis operation also requires path parameters. + + Modes: + - GET_REQUEST_SCHEMA: Returns the schema. Only call if you don't + already have it. Do NOT call repeatedly if you already received + the schema. + - EXECUTE: Performs the operation with the provided request body + JSON.\n Note: You must also provide the required path parameters when executing. + + If you need the schema, call with mode='get_request_schema' ONCE, then execute. + """ # noqa: E501 + if mode == ToolMode.GET_REQUEST_SCHEMA: + return { + "request_body_schema": REQUEST_BODY_SCHEMAS["CREATEROUTEREDIRECT"], + "instructions": ( + "Use the request_body_schema to construct a valid JSON object. " + "Once you have populated the object following the schema " + "structure and requirements, call this tool again with " + "mode='execute' and the stringified JSON as the " + "request_body parameter along with the required path parameters. " + "Do NOT call the schema mode again - you already have " + "the schema now." + ), + } + + # Mode is EXECUTE - validate parameters + # Validate required parameters + missing_params = [] + if not knowledge_base_id: + missing_params.append(("knowledge_base_id", "path")) + + if missing_params: + param_names = [p[0] for p in missing_params] + param_details = ", ".join([f"{p[0]} ({p[1]})" for p in missing_params]) + raise RetryableToolError( + message=f"Missing required parameters: {param_names}", + developer_message=(f"Required parameters validation failed: {param_details}"), + additional_prompt_content=( + f"The following required parameters are missing: " + f"{param_details}. Please call this tool again with all " + "required parameters." + ), + ) + + # Validate request body is provided (not None or empty string) + # Note: Empty objects like {} are allowed - schema validation will check if valid + if request_body is None or request_body.strip() == "": + raise RetryableToolError( + message="Request body is required when mode is 'execute'", + developer_message="The request_body parameter was null or empty string", + additional_prompt_content=( + "The request body is required to perform this operation. " + "Use the schema below to construct a valid JSON object, " + "then call this tool again in execute mode with the " + "stringified JSON as the request_body parameter.\n\n" + "Schema:\n\n```json\n" + REQUEST_BODY_SCHEMAS["CREATEROUTEREDIRECT"] + "\n```" + ), + ) + + # Parse JSON + try: + request_data = json.loads(request_body) + except json.JSONDecodeError as e: + raise RetryableToolError( + message=f"Invalid JSON in request body: {e!s}", + developer_message=f"JSON parsing failed: {e!s}", + additional_prompt_content=( + f"The request body contains invalid JSON. Error: {e!s}\n\n" + "Please provide a valid JSON string that matches the schema " + "below, then call this tool again in execute mode.\n\n" + "Schema:\n\n```json\n" + REQUEST_BODY_SCHEMAS["CREATEROUTEREDIRECT"] + "\n```" + ), + ) from e + + response = await make_request_with_schema_validation( + url="https://api.usepylon.com/knowledge-bases/{id}/route-redirects".format( # noqa: UP032 + id=knowledge_base_id + ), + method="POST", + request_data=request_data, + schema=REQUEST_BODY_SCHEMAS["CREATEROUTEREDIRECT"], + params=remove_none_values({}), + headers=remove_none_values({ + "Content-Type": "application/json", + "Authorization": "Bearer {authorization}".format( # noqa: UP032 + authorization=context.get_secret("PYLON_SECRET_TOKEN") + ), + }), + ) + try: + return {"response_json": response.json()} + except Exception: + return {"response_text": response.text} + + +@tool(requires_secrets=["PYLON_SECRET_TOKEN"]) +async def get_organization_details( + context: ToolContext, +) -> Annotated[dict[str, Any], "Response from the API endpoint 'GetMe'."]: + """Retrieve details of the current organization. + + Use this tool to get information about the organization linked to the given API token, like name, address, and other relevant details.""" # noqa: E501 + request_data: Any = {} + if isinstance(request_data, dict): + request_data = remove_none_values(request_data) + content = json.dumps(request_data) if request_data else None + response = await make_request( + url="https://api.usepylon.com/me", + method="GET", + params=remove_none_values({}), + headers=remove_none_values({ + "Authorization": "Bearer {authorization}".format( # noqa: UP032 + authorization=context.get_secret("PYLON_SECRET_TOKEN") + ) + }), + content=content, + ) + try: + return {"response_json": response.json()} + except Exception: + return {"response_text": response.text} + + +@tool(requires_secrets=["PYLON_SECRET_TOKEN"]) +async def create_milestone( + context: ToolContext, + milestone_name: Annotated[ + str, + "The name of the milestone to be created. This is the title that will be displayed for the milestone.", # noqa: E501 + ], + project_id_for_milestone: Annotated[ + str, + "The unique identifier for the project to which this milestone belongs. Required for associating the milestone with the correct project.", # noqa: E501 + ], + account_id_for_project: Annotated[ + str | None, + "Account ID for the project. This is needed to associate the milestone with the correct account.", # noqa: E501 + ] = None, + milestone_due_date: Annotated[ + str | None, "Due date for this milestone in RFC 3339 format (e.g., 2023-12-31T23:59:59Z)." + ] = None, +) -> Annotated[dict[str, Any], "Response from the API endpoint 'CreateMilestone'."]: + """Create a new milestone in a project management system. + + This tool is used to create a milestone within a project management application. It should be called when there's a need to add a new milestone to track progress or set goals in a project. The tool confirms the creation of the milestone.""" # noqa: E501 + request_data: Any = {} + if isinstance(request_data, dict): + request_data = remove_none_values(request_data) + content = json.dumps(request_data) if request_data else None + response = await make_request( + url="https://api.usepylon.com/milestones", + method="POST", + params=remove_none_values({ + "name": milestone_name, + "due_date": milestone_due_date, + "project_id": project_id_for_milestone, + "account_id": account_id_for_project, + }), + headers=remove_none_values({ + "Authorization": "Bearer {authorization}".format( # noqa: UP032 + authorization=context.get_secret("PYLON_SECRET_TOKEN") + ) + }), + content=content, + ) + try: + return {"response_json": response.json()} + except Exception: + return {"response_text": response.text} + + +@tool(requires_secrets=["PYLON_SECRET_TOKEN"]) +async def delete_milestone( + context: ToolContext, + milestone_id: Annotated[ + str, + "The unique ID of the milestone to be deleted. Ensure it is correct as this action is irreversible.", # noqa: E501 + ], +) -> Annotated[dict[str, Any], "Response from the API endpoint 'DeleteMilestone'."]: + """Delete a specific milestone using its ID. + + Use this tool to remove a milestone by providing its unique ID. This operation is irreversible and should be used when a milestone is no longer needed.""" # noqa: E501 + request_data: Any = {} + if isinstance(request_data, dict): + request_data = remove_none_values(request_data) + content = json.dumps(request_data) if request_data else None + response = await make_request( + url="https://api.usepylon.com/milestones/{id}".format(id=milestone_id), # noqa: UP032 + method="DELETE", + params=remove_none_values({}), + headers=remove_none_values({ + "Authorization": "Bearer {authorization}".format( # noqa: UP032 + authorization=context.get_secret("PYLON_SECRET_TOKEN") + ) + }), + content=content, + ) + try: + return {"response_json": response.json()} + except Exception: + return {"response_text": response.text} + + +@tool(requires_secrets=["PYLON_SECRET_TOKEN"]) +async def update_milestone( + context: ToolContext, + milestone_id: Annotated[str, "The unique ID of the milestone to update."], + milestone_due_date: Annotated[ + str | None, + "The due date for the milestone in RFC 3339 format (e.g., 2023-10-21T00:00:00Z).", + ] = None, + milestone_name: Annotated[ + str | None, "The new name for the milestone you want to update." + ] = None, +) -> Annotated[dict[str, Any], "Response from the API endpoint 'UpdateMilestone'."]: + """Updates the details of a specific milestone. + + This tool is used to update information for a specific milestone in a project, identified by its ID.""" # noqa: E501 + request_data: Any = {"due_date": milestone_due_date, "name": milestone_name} + if isinstance(request_data, dict): + request_data = remove_none_values(request_data) + content = json.dumps(request_data) if request_data else None + response = await make_request( + url="https://api.usepylon.com/milestones/{id}".format(id=milestone_id), # noqa: UP032 + method="PATCH", + params=remove_none_values({}), + headers=remove_none_values({ + "Content-Type": "application/json", + "Authorization": "Bearer {authorization}".format( # noqa: UP032 + authorization=context.get_secret("PYLON_SECRET_TOKEN") + ), + }), + content=content, + ) + try: + return {"response_json": response.json()} + except Exception: + return {"response_text": response.text} + + +@tool(requires_secrets=["PYLON_SECRET_TOKEN"]) +async def create_new_project( + context: ToolContext, + account_id_for_project: Annotated[ + str, + "Account ID associated with the project. This identifies the account under which the project will be created.", # noqa: E501 + ], + project_name: Annotated[ + str, + "The name for the new project. This should be a descriptive and unique name to easily identify the project.", # noqa: E501 + ], + customer_portal_visible: Annotated[ + bool | None, + "Boolean indicating if the project should be visible in the customer portal. True makes it visible.", # noqa: E501 + ] = False, + project_description_html: Annotated[ + str | None, + "HTML formatted description for the project, including any necessary tags and formatting.", + ] = None, + project_end_date: Annotated[ + str | None, + "End date for the project in RFC 3339 format. Indicates when the project is expected to be finished.", # noqa: E501 + ] = None, + project_owner_id: Annotated[ + str | None, + "The unique identifier for the owner of the project. This is a string that specifies who will be managing or leading the project.", # noqa: E501 + ] = None, + project_template_id: Annotated[ + str | None, + "The ID of the template to be used for creating this project. It should match an existing project template ID.", # noqa: E501 + ] = None, + start_date: Annotated[ + str | None, "Start date for the project in RFC 3339 format (e.g., 2023-03-10T14:00:00Z)." + ] = None, +) -> Annotated[dict[str, Any], "Response from the API endpoint 'CreateProject'."]: + """Create a new project seamlessly. + + This tool is used to create a new project. It should be called when a user wants to initialize or start a new project within a system.""" # noqa: E501 + request_data: Any = {} + if isinstance(request_data, dict): + request_data = remove_none_values(request_data) + content = json.dumps(request_data) if request_data else None + response = await make_request( + url="https://api.usepylon.com/projects", + method="POST", + params=remove_none_values({ + "name": project_name, + "description_html": project_description_html, + "customer_portal_visible": customer_portal_visible, + "start_date": start_date, + "end_date": project_end_date, + "account_id": account_id_for_project, + "owner_id": project_owner_id, + "project_template_id": project_template_id, + }), + headers=remove_none_values({ + "Authorization": "Bearer {authorization}".format( # noqa: UP032 + authorization=context.get_secret("PYLON_SECRET_TOKEN") + ) + }), + content=content, + ) + try: + return {"response_json": response.json()} + except Exception: + return {"response_text": response.text} + + +@tool(requires_secrets=["PYLON_SECRET_TOKEN"]) +async def delete_existing_project( + context: ToolContext, + project_id: Annotated[str, "The unique identifier of the project to be deleted."], +) -> Annotated[dict[str, Any], "Response from the API endpoint 'DeleteProject'."]: + """Delete an existing project using its ID. + + Use this tool to delete an existing project by providing the project ID. It allows you to manage and remove projects that are no longer needed.""" # noqa: E501 + request_data: Any = {} + if isinstance(request_data, dict): + request_data = remove_none_values(request_data) + content = json.dumps(request_data) if request_data else None + response = await make_request( + url="https://api.usepylon.com/projects/{id}".format(id=project_id), # noqa: UP032 + method="DELETE", + params=remove_none_values({}), + headers=remove_none_values({ + "Authorization": "Bearer {authorization}".format( # noqa: UP032 + authorization=context.get_secret("PYLON_SECRET_TOKEN") + ) + }), + content=content, + ) + try: + return {"response_json": response.json()} + except Exception: + return {"response_text": response.text} + + +@tool(requires_secrets=["PYLON_SECRET_TOKEN"]) +async def update_project( + context: ToolContext, + mode: Annotated[ + ToolMode, + "Operation mode: 'get_request_schema' returns the OpenAPI spec " + "for the request body, 'execute' performs the actual operation", + ], + project_id: Annotated[ + str | None, + "The unique identifier of the project to update. Required when mode is 'execute', ignored when mode is 'get_request_schema'.", # noqa: E501 + ] = None, + project_name: Annotated[ + str | None, + "The new name for this project. Provide a descriptive title to identify the project. Only used when mode is 'execute'.", # noqa: E501 + ] = None, + project_description_html: Annotated[ + str | None, "HTML formatted description for the project. Only used when mode is 'execute'." + ] = None, + start_date_rfc3339: Annotated[ + str | None, + "The start date for the project, formatted in RFC 3339. This specifies when the project begins. Only used when mode is 'execute'.", # noqa: E501 + ] = None, + project_end_date: Annotated[ + str | None, + "The end date for the project in RFC 3339 format. Only used when mode is 'execute'.", + ] = None, + project_owner_id: Annotated[ + str | None, + "The unique identifier of the owner of this project. Required to assign an owner when updating a project. Only used when mode is 'execute'.", # noqa: E501 + ] = None, + is_customer_portal_visible: Annotated[ + bool | None, + "Indicate if the project should be visible in the customer portal (true for visible, false for hidden). Only used when mode is 'execute'.", # noqa: E501 + ] = None, + is_project_archived: Annotated[ + bool | None, + "Set to True if the project is archived, False if it is active. Only used when mode is 'execute'.", # noqa: E501 + ] = None, + request_body: Annotated[ + str | None, + "Stringified JSON representing the request body. Required when " + "mode is 'execute', ignored when mode is 'get_request_schema'", + ] = None, +) -> Annotated[dict[str, Any], "Response from the API endpoint 'UpdateProject'."]: + """Update the details of an existing project. + + Use this tool to modify the information of an existing project by providing the project ID and necessary updates. + + Note: Understanding the request schema is necessary to properly create + the stringified JSON input object for execution.\n\nThis operation also requires path, query parameters. + + Modes: + - GET_REQUEST_SCHEMA: Returns the schema. Only call if you don't + already have it. Do NOT call repeatedly if you already received + the schema. + - EXECUTE: Performs the operation with the provided request body + JSON.\n Note: You must also provide the required path, query parameters when executing. + + If you need the schema, call with mode='get_request_schema' ONCE, then execute. + """ # noqa: E501 + if mode == ToolMode.GET_REQUEST_SCHEMA: + return { + "request_body_schema": REQUEST_BODY_SCHEMAS["UPDATEPROJECT"], + "instructions": ( + "Use the request_body_schema to construct a valid JSON object. " + "Once you have populated the object following the schema " + "structure and requirements, call this tool again with " + "mode='execute' and the stringified JSON as the " + "request_body parameter along with the required path, query parameters. " + "Do NOT call the schema mode again - you already have " + "the schema now." + ), + } + + # Mode is EXECUTE - validate parameters + # Validate required parameters + missing_params = [] + if not project_id: + missing_params.append(("project_id", "path")) + + if missing_params: + param_names = [p[0] for p in missing_params] + param_details = ", ".join([f"{p[0]} ({p[1]})" for p in missing_params]) + raise RetryableToolError( + message=f"Missing required parameters: {param_names}", + developer_message=(f"Required parameters validation failed: {param_details}"), + additional_prompt_content=( + f"The following required parameters are missing: " + f"{param_details}. Please call this tool again with all " + "required parameters." + ), + ) + + # Validate request body is provided (not None or empty string) + # Note: Empty objects like {} are allowed - schema validation will check if valid + if request_body is None or request_body.strip() == "": + raise RetryableToolError( + message="Request body is required when mode is 'execute'", + developer_message="The request_body parameter was null or empty string", + additional_prompt_content=( + "The request body is required to perform this operation. " + "Use the schema below to construct a valid JSON object, " + "then call this tool again in execute mode with the " + "stringified JSON as the request_body parameter.\n\n" + "Schema:\n\n```json\n" + REQUEST_BODY_SCHEMAS["UPDATEPROJECT"] + "\n```" + ), + ) + + # Parse JSON + try: + request_data = json.loads(request_body) + except json.JSONDecodeError as e: + raise RetryableToolError( + message=f"Invalid JSON in request body: {e!s}", + developer_message=f"JSON parsing failed: {e!s}", + additional_prompt_content=( + f"The request body contains invalid JSON. Error: {e!s}\n\n" + "Please provide a valid JSON string that matches the schema " + "below, then call this tool again in execute mode.\n\n" + "Schema:\n\n```json\n" + REQUEST_BODY_SCHEMAS["UPDATEPROJECT"] + "\n```" + ), + ) from e + + response = await make_request_with_schema_validation( + url="https://api.usepylon.com/projects/{id}".format(id=project_id), # noqa: UP032 + method="PATCH", + request_data=request_data, + schema=REQUEST_BODY_SCHEMAS["UPDATEPROJECT"], + params=remove_none_values({ + "name": project_name, + "description_html": project_description_html, + "customer_portal_visible": is_customer_portal_visible, + "start_date": start_date_rfc3339, + "end_date": project_end_date, + "owner_id": project_owner_id, + "is_archived": is_project_archived, + }), + headers=remove_none_values({ + "Content-Type": "application/json", + "Authorization": "Bearer {authorization}".format( # noqa: UP032 + authorization=context.get_secret("PYLON_SECRET_TOKEN") + ), + }), + ) + try: + return {"response_json": response.json()} + except Exception: + return {"response_text": response.text} + + +@tool(requires_secrets=["PYLON_SECRET_TOKEN"]) +async def fetch_all_tags( + context: ToolContext, +) -> Annotated[dict[str, Any], "Response from the API endpoint 'GetTags'."]: + """Retrieve all available tags. + + Use this tool to obtain a comprehensive list of all tags. It is ideal for scenarios where you need to display or manage tags.""" # noqa: E501 + request_data: Any = {} + if isinstance(request_data, dict): + request_data = remove_none_values(request_data) + content = json.dumps(request_data) if request_data else None + response = await make_request( + url="https://api.usepylon.com/tags", + method="GET", + params=remove_none_values({}), + headers=remove_none_values({ + "Authorization": "Bearer {authorization}".format( # noqa: UP032 + authorization=context.get_secret("PYLON_SECRET_TOKEN") + ) + }), + content=content, + ) + try: + return {"response_json": response.json()} + except Exception: + return {"response_text": response.text} + + +@tool(requires_secrets=["PYLON_SECRET_TOKEN"]) +async def create_new_tag( + context: ToolContext, + mode: Annotated[ + ToolMode, + "Operation mode: 'get_request_schema' returns the OpenAPI spec " + "for the request body, 'execute' performs the actual operation", + ], + request_body: Annotated[ + str | None, + "Stringified JSON representing the request body. Required when " + "mode is 'execute', ignored when mode is 'get_request_schema'", + ] = None, +) -> Annotated[dict[str, Any], "Response from the API endpoint 'CreateTag'."]: + """Create a new tag within the system. + + This tool is used to create a new tag by sending a POST request to the /tags endpoint. It should be called when a user wants to add a new tag to the system for organizational or categorization purposes. + + Note: Understanding the request schema is necessary to properly create + the stringified JSON input object for execution. + + Modes: + - GET_REQUEST_SCHEMA: Returns the schema. Only call if you don't + already have it. Do NOT call repeatedly if you already received + the schema. + - EXECUTE: Performs the operation with the provided request body + JSON. + + If you need the schema, call with mode='get_request_schema' ONCE, then execute. + """ # noqa: E501 + if mode == ToolMode.GET_REQUEST_SCHEMA: + return { + "request_body_schema": REQUEST_BODY_SCHEMAS["CREATENEWTAG"], + "instructions": ( + "Use the request_body_schema to construct a valid JSON object. " + "Once you have populated the object following the schema " + "structure and requirements, call this tool again with " + "mode='execute' and the stringified JSON as the " + "request_body parameter. " + "Do NOT call the schema mode again - you already have " + "the schema now." + ), + } + + # Mode is EXECUTE - validate parameters + + # Validate request body is provided (not None or empty string) + # Note: Empty objects like {} are allowed - schema validation will check if valid + if request_body is None or request_body.strip() == "": + raise RetryableToolError( + message="Request body is required when mode is 'execute'", + developer_message="The request_body parameter was null or empty string", + additional_prompt_content=( + "The request body is required to perform this operation. " + "Use the schema below to construct a valid JSON object, " + "then call this tool again in execute mode with the " + "stringified JSON as the request_body parameter.\n\n" + "Schema:\n\n```json\n" + REQUEST_BODY_SCHEMAS["CREATENEWTAG"] + "\n```" + ), + ) + + # Parse JSON + try: + request_data = json.loads(request_body) + except json.JSONDecodeError as e: + raise RetryableToolError( + message=f"Invalid JSON in request body: {e!s}", + developer_message=f"JSON parsing failed: {e!s}", + additional_prompt_content=( + f"The request body contains invalid JSON. Error: {e!s}\n\n" + "Please provide a valid JSON string that matches the schema " + "below, then call this tool again in execute mode.\n\n" + "Schema:\n\n```json\n" + REQUEST_BODY_SCHEMAS["CREATENEWTAG"] + "\n```" + ), + ) from e + + response = await make_request_with_schema_validation( + url="https://api.usepylon.com/tags", + method="POST", + request_data=request_data, + schema=REQUEST_BODY_SCHEMAS["CREATENEWTAG"], + params=remove_none_values({}), + headers=remove_none_values({ + "Content-Type": "application/json", + "Authorization": "Bearer {authorization}".format( # noqa: UP032 + authorization=context.get_secret("PYLON_SECRET_TOKEN") + ), + }), + ) + try: + return {"response_json": response.json()} + except Exception: + return {"response_text": response.text} + + +@tool(requires_secrets=["PYLON_SECRET_TOKEN"]) +async def delete_existing_tag( + context: ToolContext, + tag_id: Annotated[ + str, + "The unique identifier of the tag to delete. Provide this ID to specify which tag should be removed.", # noqa: E501 + ], +) -> Annotated[dict[str, Any], "Response from the API endpoint 'DeleteTag'."]: + """Delete an existing tag by ID. + + Use this tool to delete an existing tag by specifying its ID. It confirms whether the deletion was successful.""" # noqa: E501 + request_data: Any = {} + if isinstance(request_data, dict): + request_data = remove_none_values(request_data) + content = json.dumps(request_data) if request_data else None + response = await make_request( + url="https://api.usepylon.com/tags/{id}".format(id=tag_id), # noqa: UP032 + method="DELETE", + params=remove_none_values({}), + headers=remove_none_values({ + "Authorization": "Bearer {authorization}".format( # noqa: UP032 + authorization=context.get_secret("PYLON_SECRET_TOKEN") + ) + }), + content=content, + ) + try: + return {"response_json": response.json()} + except Exception: + return {"response_text": response.text} + + +@tool(requires_secrets=["PYLON_SECRET_TOKEN"]) +async def get_tag_by_id( + context: ToolContext, + tag_id: Annotated[str, "The unique identifier for the tag to retrieve details."], +) -> Annotated[dict[str, Any], "Response from the API endpoint 'GetTag'."]: + """Retrieve tag details using a specified ID.""" + request_data: Any = {} + if isinstance(request_data, dict): + request_data = remove_none_values(request_data) + content = json.dumps(request_data) if request_data else None + response = await make_request( + url="https://api.usepylon.com/tags/{id}".format(id=tag_id), # noqa: UP032 + method="GET", + params=remove_none_values({}), + headers=remove_none_values({ + "Authorization": "Bearer {authorization}".format( # noqa: UP032 + authorization=context.get_secret("PYLON_SECRET_TOKEN") + ) + }), + content=content, + ) + try: + return {"response_json": response.json()} + except Exception: + return {"response_text": response.text} + + +@tool(requires_secrets=["PYLON_SECRET_TOKEN"]) +async def update_existing_tag( + context: ToolContext, + tag_id: Annotated[str, "The unique identifier of the tag that needs to be updated."], + tag_hex_color: Annotated[ + str | None, + "The hex code representing the tag's color. Must be a valid six-digit hexadecimal value prefixed with '#'.", # noqa: E501 + ] = None, + tag_name: Annotated[str | None, "The new name for the tag to be updated."] = None, +) -> Annotated[dict[str, Any], "Response from the API endpoint 'UpdateTag'."]: + """Update an existing tag's information. + + Use this tool to modify the details of an already existing tag. It should be called when changes to tag attributes are needed.""" # noqa: E501 + request_data: Any = {"hex_color": tag_hex_color, "value": tag_name} + if isinstance(request_data, dict): + request_data = remove_none_values(request_data) + content = json.dumps(request_data) if request_data else None + response = await make_request( + url="https://api.usepylon.com/tags/{id}".format(id=tag_id), # noqa: UP032 + method="PATCH", + params=remove_none_values({}), + headers=remove_none_values({ + "Content-Type": "application/json", + "Authorization": "Bearer {authorization}".format( # noqa: UP032 + authorization=context.get_secret("PYLON_SECRET_TOKEN") + ), + }), + content=content, + ) + try: + return {"response_json": response.json()} + except Exception: + return {"response_text": response.text} + + +@tool(requires_secrets=["PYLON_SECRET_TOKEN"]) +async def create_task( + context: ToolContext, + task_title: Annotated[ + str, + "The title of the task to be created. It should summarize the task clearly and concisely.", + ], + account_id_for_task: Annotated[ + str | None, "Specify the Account ID associated with this task." + ] = None, + make_customer_portal_visible: Annotated[ + bool | None, + "Set to true to make the task visible on the customer portal, false to hide it.", + ] = False, + milestone_id: Annotated[ + str | None, "Unique identifier for the milestone associated with the task." + ] = None, + project_id: Annotated[ + str | None, "Unique identifier for the project to which this task belongs." + ] = None, + task_assignee_id: Annotated[ + str | None, + "The ID of the user to whom the task is assigned. It should be a valid user ID in the system.", # noqa: E501 + ] = None, + task_body_html: Annotated[ + str | None, + "HTML content for the task body. Provide detailed information or instructions here using HTML formatting.", # noqa: E501 + ] = None, + task_due_date: Annotated[ + str | None, + "Due date for the task, formatted in RFC 3339. Specify the date by which the task should be completed.", # noqa: E501 + ] = None, + task_status: Annotated[ + str | None, "Set the task's current status: 'not_started', 'in_progress', or 'completed'." + ] = None, +) -> Annotated[dict[str, Any], "Response from the API endpoint 'CreateTask'."]: + """Create a new task with specified parameters. + + Use this tool to create a task. It should be called when a new task needs to be added to the system, specifying necessary parameters.""" # noqa: E501 + request_data: Any = {} + if isinstance(request_data, dict): + request_data = remove_none_values(request_data) + content = json.dumps(request_data) if request_data else None + response = await make_request( + url="https://api.usepylon.com/tasks", + method="POST", + params=remove_none_values({ + "title": task_title, + "body_html": task_body_html, + "milestone_id": milestone_id, + "status": task_status, + "customer_portal_visible": make_customer_portal_visible, + "due_date": task_due_date, + "assignee_id": task_assignee_id, + "account_id": account_id_for_task, + "project_id": project_id, + }), + headers=remove_none_values({ + "Authorization": "Bearer {authorization}".format( # noqa: UP032 + authorization=context.get_secret("PYLON_SECRET_TOKEN") + ) + }), + content=content, + ) + try: + return {"response_json": response.json()} + except Exception: + return {"response_text": response.text} + + +@tool(requires_secrets=["PYLON_SECRET_TOKEN"]) +async def delete_task( + context: ToolContext, + task_id: Annotated[str, "The unique identifier of the task to be deleted."], +) -> Annotated[dict[str, Any], "Response from the API endpoint 'DeleteTask'."]: + """Delete an existing task by ID. + + Use this tool to delete a specific task by its ID. Call it when you need to remove a task permanently from the system.""" # noqa: E501 + request_data: Any = {} + if isinstance(request_data, dict): + request_data = remove_none_values(request_data) + content = json.dumps(request_data) if request_data else None + response = await make_request( + url="https://api.usepylon.com/tasks/{id}".format(id=task_id), # noqa: UP032 + method="DELETE", + params=remove_none_values({}), + headers=remove_none_values({ + "Authorization": "Bearer {authorization}".format( # noqa: UP032 + authorization=context.get_secret("PYLON_SECRET_TOKEN") + ) + }), + content=content, + ) + try: + return {"response_json": response.json()} + except Exception: + return {"response_text": response.text} + + +@tool(requires_secrets=["PYLON_SECRET_TOKEN"]) +async def update_task( + context: ToolContext, + task_id: Annotated[str, "The unique ID of the task you want to update."], + assignee_id: Annotated[ + str | None, + "The ID of the person assigned to this task. It should be a string representing a valid user ID within the system.", # noqa: E501 + ] = None, + customer_portal_visible: Annotated[ + bool | None, + "Set to true to make the task visible on the customer portal. Accepts a boolean.", + ] = None, + milestone_identifier: Annotated[ + str | None, "Specify the Milestone ID associated with the task to update its milestone." + ] = None, + project_id: Annotated[ + str | None, + "The unique identifier of the project associated with this task. Required to specify which project's task is being updated.", # noqa: E501 + ] = None, + task_body_html: Annotated[ + str | None, + "HTML content for the task's body. This defines the main description or details of the task.", # noqa: E501 + ] = None, + task_due_date: Annotated[ + str | None, "Due date for the task in RFC 3339 format, e.g., '2023-12-31T23:59:59Z'." + ] = None, + task_status: Annotated[ + str | None, "Specify the task status: `not_started`, `in_progress`, or `completed`." + ] = None, + task_title: Annotated[ + str | None, + "The new title for the task. Provide a clear and concise title for better understanding.", + ] = None, +) -> Annotated[dict[str, Any], "Response from the API endpoint 'UpdateTask'."]: + """Update the details of an existing task. + + Use this tool to modify the information of a specific task by providing its ID. Ideal for updating any details like status, description, or due date.""" # noqa: E501 + request_data: Any = { + "assignee_id": assignee_id, + "body_html": task_body_html, + "customer_portal_visible": customer_portal_visible, + "due_date": task_due_date, + "milestone_id": milestone_identifier, + "project_id": project_id, + "status": task_status, + "title": task_title, + } + if isinstance(request_data, dict): + request_data = remove_none_values(request_data) + content = json.dumps(request_data) if request_data else None + response = await make_request( + url="https://api.usepylon.com/tasks/{id}".format(id=task_id), # noqa: UP032 + method="PATCH", + params=remove_none_values({}), + headers=remove_none_values({ + "Content-Type": "application/json", + "Authorization": "Bearer {authorization}".format( # noqa: UP032 + authorization=context.get_secret("PYLON_SECRET_TOKEN") + ), + }), + content=content, + ) + try: + return {"response_json": response.json()} + except Exception: + return {"response_text": response.text} + + +@tool(requires_secrets=["PYLON_SECRET_TOKEN"]) +async def fetch_team_list( + context: ToolContext, +) -> Annotated[dict[str, Any], "Response from the API endpoint 'GetTeams'."]: + """Retrieve the list of available teams. + + Use this tool to get a list of all teams from the service. Useful for displaying team information or selecting a team from the list.""" # noqa: E501 + request_data: Any = {} + if isinstance(request_data, dict): + request_data = remove_none_values(request_data) + content = json.dumps(request_data) if request_data else None + response = await make_request( + url="https://api.usepylon.com/teams", + method="GET", + params=remove_none_values({}), + headers=remove_none_values({ + "Authorization": "Bearer {authorization}".format( # noqa: UP032 + authorization=context.get_secret("PYLON_SECRET_TOKEN") + ) + }), + content=content, + ) + try: + return {"response_json": response.json()} + except Exception: + return {"response_text": response.text} + + +@tool(requires_secrets=["PYLON_SECRET_TOKEN"]) +async def create_new_team( + context: ToolContext, + team_name: Annotated[str | None, "The name to assign to the newly created team."] = None, + user_ids_to_add: Annotated[ + list[str] | None, + "A list of user IDs to include in the new team. Each user ID should be a string.", + ] = None, +) -> Annotated[dict[str, Any], "Response from the API endpoint 'CreateTeam'."]: + """Create a new team for collaboration. + + Use this tool to create a new team on the platform, facilitating collaboration and organization. It returns details about the newly created team.""" # noqa: E501 + request_data: Any = {"name": team_name, "user_ids": user_ids_to_add} + if isinstance(request_data, dict): + request_data = remove_none_values(request_data) + content = json.dumps(request_data) if request_data else None + response = await make_request( + url="https://api.usepylon.com/teams", + method="POST", + params=remove_none_values({}), + headers=remove_none_values({ + "Content-Type": "application/json", + "Authorization": "Bearer {authorization}".format( # noqa: UP032 + authorization=context.get_secret("PYLON_SECRET_TOKEN") + ), + }), + content=content, + ) + try: + return {"response_json": response.json()} + except Exception: + return {"response_text": response.text} + + +@tool(requires_secrets=["PYLON_SECRET_TOKEN"]) +async def get_team_by_id( + context: ToolContext, + team_id: Annotated[str, "The unique ID of the team to retrieve details for."], +) -> Annotated[dict[str, Any], "Response from the API endpoint 'GetTeam'."]: + """Retrieve team details using the team's ID. + + Use this tool to get detailed information about a team by specifying its unique ID.""" + request_data: Any = {} + if isinstance(request_data, dict): + request_data = remove_none_values(request_data) + content = json.dumps(request_data) if request_data else None + response = await make_request( + url="https://api.usepylon.com/teams/{id}".format(id=team_id), # noqa: UP032 + method="GET", + params=remove_none_values({}), + headers=remove_none_values({ + "Authorization": "Bearer {authorization}".format( # noqa: UP032 + authorization=context.get_secret("PYLON_SECRET_TOKEN") + ) + }), + content=content, + ) + try: + return {"response_json": response.json()} + except Exception: + return {"response_text": response.text} + + +@tool(requires_secrets=["PYLON_SECRET_TOKEN"]) +async def update_existing_team( + context: ToolContext, + team_id: Annotated[str, "The ID of the team to update."], + team_member_user_ids: Annotated[ + list[str] | None, + "The list of user IDs to set as team members. This updates the team to include only these users.", # noqa: E501 + ] = None, + team_name: Annotated[str | None, "The new name for the team to be updated."] = None, +) -> Annotated[dict[str, Any], "Response from the API endpoint 'UpdateTeam'."]: + """Update details of an existing team. + + Use this tool to modify the information of an existing team. Ideal for updating team names, members, or other details.""" # noqa: E501 + request_data: Any = {"name": team_name, "user_ids": team_member_user_ids} + if isinstance(request_data, dict): + request_data = remove_none_values(request_data) + content = json.dumps(request_data) if request_data else None + response = await make_request( + url="https://api.usepylon.com/teams/{id}".format(id=team_id), # noqa: UP032 + method="PATCH", + params=remove_none_values({}), + headers=remove_none_values({ + "Content-Type": "application/json", + "Authorization": "Bearer {authorization}".format( # noqa: UP032 + authorization=context.get_secret("PYLON_SECRET_TOKEN") + ), + }), + content=content, + ) + try: + return {"response_json": response.json()} + except Exception: + return {"response_text": response.text} + + +@tool(requires_secrets=["PYLON_SECRET_TOKEN"]) +async def get_ticket_forms( + context: ToolContext, +) -> Annotated[dict[str, Any], "Response from the API endpoint 'GetTicketForms'."]: + """Retrieve a list of ticket forms available. + + This tool fetches a list of ticket forms, which can be used to understand the structure of available forms for managing tickets. It should be called when you need to review or select from ticket forms.""" # noqa: E501 + request_data: Any = {} + if isinstance(request_data, dict): + request_data = remove_none_values(request_data) + content = json.dumps(request_data) if request_data else None + response = await make_request( + url="https://api.usepylon.com/ticket-forms", + method="GET", + params=remove_none_values({}), + headers=remove_none_values({ + "Authorization": "Bearer {authorization}".format( # noqa: UP032 + authorization=context.get_secret("PYLON_SECRET_TOKEN") + ) + }), + content=content, + ) + try: + return {"response_json": response.json()} + except Exception: + return {"response_text": response.text} + + +@tool(requires_secrets=["PYLON_SECRET_TOKEN"]) +async def get_ticket_form( + context: ToolContext, + ticket_form_id: Annotated[str, "The unique ID of the ticket form to retrieve."], +) -> Annotated[dict[str, Any], "Response from the API endpoint 'GetTicketForm'."]: + """Retrieve detailed information about a ticket form. + + Call this tool to obtain detailed information for a specific ticket form by providing its ID.""" + request_data: Any = {} + if isinstance(request_data, dict): + request_data = remove_none_values(request_data) + content = json.dumps(request_data) if request_data else None + response = await make_request( + url="https://api.usepylon.com/ticket-forms/{id}".format(id=ticket_form_id), # noqa: UP032 + method="GET", + params=remove_none_values({}), + headers=remove_none_values({ + "Authorization": "Bearer {authorization}".format( # noqa: UP032 + authorization=context.get_secret("PYLON_SECRET_TOKEN") + ) + }), + content=content, + ) + try: + return {"response_json": response.json()} + except Exception: + return {"response_text": response.text} + + +@tool(requires_secrets=["PYLON_SECRET_TOKEN"]) +async def list_training_data( + context: ToolContext, +) -> Annotated[dict[str, Any], "Response from the API endpoint 'ListTrainingData'."]: + """Fetches all training data configurations for the organization. + + Use this tool to retrieve a comprehensive list of training data configurations associated with the organization. Ideal for managing or reviewing training datasets.""" # noqa: E501 + request_data: Any = {} + if isinstance(request_data, dict): + request_data = remove_none_values(request_data) + content = json.dumps(request_data) if request_data else None + response = await make_request( + url="https://api.usepylon.com/training-data", + method="GET", + params=remove_none_values({}), + headers=remove_none_values({ + "Authorization": "Bearer {authorization}".format( # noqa: UP032 + authorization=context.get_secret("PYLON_SECRET_TOKEN") + ) + }), + content=content, + ) + try: + return {"response_json": response.json()} + except Exception: + return {"response_text": response.text} + + +@tool(requires_secrets=["PYLON_SECRET_TOKEN"]) +async def create_training_data_config( + context: ToolContext, + training_data_name: Annotated[ + str | None, "The name of the training data container to be created." + ] = None, + training_data_visibility: Annotated[ + str | None, + 'Specifies who can access the training data. Valid options: "everyone", "user_only", "ai_agent_only". Defaults to "everyone".', # noqa: E501 + ] = None, +) -> Annotated[dict[str, Any], "Response from the API endpoint 'CreateTrainingData'."]: + """Create a new training data configuration. + + Call this tool to set up a new training data configuration for your application. It is used when you need to initialize or update your training data setup.""" # noqa: E501 + request_data: Any = { + "training_data_name": training_data_name, + "visibility": training_data_visibility, + } + if isinstance(request_data, dict): + request_data = remove_none_values(request_data) + content = json.dumps(request_data) if request_data else None + response = await make_request( + url="https://api.usepylon.com/training-data", + method="POST", + params=remove_none_values({}), + headers=remove_none_values({ + "Content-Type": "application/json", + "Authorization": "Bearer {authorization}".format( # noqa: UP032 + authorization=context.get_secret("PYLON_SECRET_TOKEN") + ), + }), + content=content, + ) + try: + return {"response_json": response.json()} + except Exception: + return {"response_text": response.text} + + +@tool(requires_secrets=["PYLON_SECRET_TOKEN"]) +async def retrieve_training_data_configuration( + context: ToolContext, + training_data_id: Annotated[ + str, "The unique ID of the training data to retrieve its configuration." + ], +) -> Annotated[dict[str, Any], "Response from the API endpoint 'GetTrainingData'."]: + """Retrieve a training data configuration by ID. + + This tool retrieves the details of a specific training data configuration using its unique ID. It should be called when you need to access the configuration settings or specifications for a particular training dataset.""" # noqa: E501 + request_data: Any = {} + if isinstance(request_data, dict): + request_data = remove_none_values(request_data) + content = json.dumps(request_data) if request_data else None + response = await make_request( + url="https://api.usepylon.com/training-data/{id}".format(id=training_data_id), # noqa: UP032 + method="GET", + params=remove_none_values({}), + headers=remove_none_values({ + "Authorization": "Bearer {authorization}".format( # noqa: UP032 + authorization=context.get_secret("PYLON_SECRET_TOKEN") + ) + }), + content=content, + ) + try: + return {"response_json": response.json()} + except Exception: + return {"response_text": response.text} + + +@tool(requires_secrets=["PYLON_SECRET_TOKEN"]) +async def delete_training_data_documents( + context: ToolContext, + training_data_id: Annotated[ + str, + "The ID of the training data from which documents will be deleted. Provide this to specify the exact dataset.", # noqa: E501 + ], + document_ids_to_delete: Annotated[ + list[str] | None, + "An array of document IDs that need to be deleted from the training data configuration.", + ] = None, + external_ids_to_delete: Annotated[ + list[str] | None, "A list of external IDs to delete from the training data configuration." + ] = None, +) -> Annotated[dict[str, Any], "Response from the API endpoint 'DeleteTrainingDataDocuments'."]: + """Deletes documents from a training data configuration. + + Use this tool to delete documents from a specific training data configuration by providing the relevant ID. This tool is helpful when managing or updating data sets for training purposes.""" # noqa: E501 + request_data: Any = {} + if isinstance(request_data, dict): + request_data = remove_none_values(request_data) + content = json.dumps(request_data) if request_data else None + response = await make_request( + url="https://api.usepylon.com/training-data/{id}/documents".format(id=training_data_id), # noqa: UP032 + method="DELETE", + params=remove_none_values({ + "document_ids": document_ids_to_delete, + "external_ids": external_ids_to_delete, + }), + headers=remove_none_values({ + "Authorization": "Bearer {authorization}".format( # noqa: UP032 + authorization=context.get_secret("PYLON_SECRET_TOKEN") + ) + }), + content=content, + ) + try: + return {"response_json": response.json()} + except Exception: + return {"response_text": response.text} + + +@tool(requires_secrets=["PYLON_SECRET_TOKEN"]) +async def get_user_roles( + context: ToolContext, +) -> Annotated[dict[str, Any], "Response from the API endpoint 'GetUserRoles'."]: + """Get a list of all user roles. + + Use this tool to retrieve a comprehensive list of all user roles. It is useful for managing and understanding user permissions.""" # noqa: E501 + request_data: Any = {} + if isinstance(request_data, dict): + request_data = remove_none_values(request_data) + content = json.dumps(request_data) if request_data else None + response = await make_request( + url="https://api.usepylon.com/user-roles", + method="GET", + params=remove_none_values({}), + headers=remove_none_values({ + "Authorization": "Bearer {authorization}".format( # noqa: UP032 + authorization=context.get_secret("PYLON_SECRET_TOKEN") + ) + }), + content=content, + ) + try: + return {"response_json": response.json()} + except Exception: + return {"response_text": response.text} + + +@tool(requires_secrets=["PYLON_SECRET_TOKEN"]) +async def list_users( + context: ToolContext, +) -> Annotated[dict[str, Any], "Response from the API endpoint 'GetUsers'."]: + """Fetches a list of users. + + Use this tool to retrieve a list of all users. It provides an overview of the users available in the system.""" # noqa: E501 + request_data: Any = {} + if isinstance(request_data, dict): + request_data = remove_none_values(request_data) + content = json.dumps(request_data) if request_data else None + response = await make_request( + url="https://api.usepylon.com/users", + method="GET", + params=remove_none_values({}), + headers=remove_none_values({ + "Authorization": "Bearer {authorization}".format( # noqa: UP032 + authorization=context.get_secret("PYLON_SECRET_TOKEN") + ) + }), + content=content, + ) + try: + return {"response_json": response.json()} + except Exception: + return {"response_text": response.text} + + +@tool(requires_secrets=["PYLON_SECRET_TOKEN"]) +async def search_users_by_email( + context: ToolContext, + mode: Annotated[ + ToolMode, + "Operation mode: 'get_request_schema' returns the OpenAPI spec " + "for the request body, 'execute' performs the actual operation", + ], + request_body: Annotated[ + str | None, + "Stringified JSON representing the request body. Required when " + "mode is 'execute', ignored when mode is 'get_request_schema'", + ] = None, +) -> Annotated[dict[str, Any], "Response from the API endpoint 'SearchUsers'."]: + """Search for users by email with filter options. + + Use this tool to find users by filtering their email with options such as 'equals', 'in', or 'not_in'. It should be called when there's a need to retrieve user information based on specific email criteria. + + Note: Understanding the request schema is necessary to properly create + the stringified JSON input object for execution. + + Modes: + - GET_REQUEST_SCHEMA: Returns the schema. Only call if you don't + already have it. Do NOT call repeatedly if you already received + the schema. + - EXECUTE: Performs the operation with the provided request body + JSON. + + If you need the schema, call with mode='get_request_schema' ONCE, then execute. + """ # noqa: E501 + if mode == ToolMode.GET_REQUEST_SCHEMA: + return { + "request_body_schema": REQUEST_BODY_SCHEMAS["SEARCHUSERSBYEMAIL"], + "instructions": ( + "Use the request_body_schema to construct a valid JSON object. " + "Once you have populated the object following the schema " + "structure and requirements, call this tool again with " + "mode='execute' and the stringified JSON as the " + "request_body parameter. " + "Do NOT call the schema mode again - you already have " + "the schema now." + ), + } + + # Mode is EXECUTE - validate parameters + + # Validate request body is provided (not None or empty string) + # Note: Empty objects like {} are allowed - schema validation will check if valid + if request_body is None or request_body.strip() == "": + raise RetryableToolError( + message="Request body is required when mode is 'execute'", + developer_message="The request_body parameter was null or empty string", + additional_prompt_content=( + "The request body is required to perform this operation. " + "Use the schema below to construct a valid JSON object, " + "then call this tool again in execute mode with the " + "stringified JSON as the request_body parameter.\n\n" + "Schema:\n\n```json\n" + REQUEST_BODY_SCHEMAS["SEARCHUSERSBYEMAIL"] + "\n```" + ), + ) + + # Parse JSON + try: + request_data = json.loads(request_body) + except json.JSONDecodeError as e: + raise RetryableToolError( + message=f"Invalid JSON in request body: {e!s}", + developer_message=f"JSON parsing failed: {e!s}", + additional_prompt_content=( + f"The request body contains invalid JSON. Error: {e!s}\n\n" + "Please provide a valid JSON string that matches the schema " + "below, then call this tool again in execute mode.\n\n" + "Schema:\n\n```json\n" + REQUEST_BODY_SCHEMAS["SEARCHUSERSBYEMAIL"] + "\n```" + ), + ) from e + + response = await make_request( + url="https://api.usepylon.com/users/search", + method="POST", + params=remove_none_values({}), + headers=remove_none_values({ + "Content-Type": "application/json", + "Authorization": "Bearer {authorization}".format( # noqa: UP032 + authorization=context.get_secret("PYLON_SECRET_TOKEN") + ), + }), + content=json.dumps(request_data), + ) + try: + return {"response_json": response.json()} + except Exception: + return {"response_text": response.text} + + +@tool(requires_secrets=["PYLON_SECRET_TOKEN"]) +async def get_user_by_id( + context: ToolContext, + user_id: Annotated[str, "The unique ID of the user to fetch details for."], +) -> Annotated[dict[str, Any], "Response from the API endpoint 'GetUser'."]: + """Retrieve user details using their unique ID. + + Use this tool to get detailed information about a user by providing their unique ID.""" + request_data: Any = {} + if isinstance(request_data, dict): + request_data = remove_none_values(request_data) + content = json.dumps(request_data) if request_data else None + response = await make_request( + url="https://api.usepylon.com/users/{id}".format(id=user_id), # noqa: UP032 + method="GET", + params=remove_none_values({}), + headers=remove_none_values({ + "Authorization": "Bearer {authorization}".format( # noqa: UP032 + authorization=context.get_secret("PYLON_SECRET_TOKEN") + ) + }), + content=content, + ) + try: + return {"response_json": response.json()} + except Exception: + return {"response_text": response.text} + + +@tool(requires_secrets=["PYLON_SECRET_TOKEN"]) +async def update_user_profile( + context: ToolContext, + user_id: Annotated[str, "The unique identifier of the user to be updated."], + user_role_id: Annotated[str | None, "The role ID to assign to the user."] = None, + user_status: Annotated[ + str | None, + "The updated status for the user. Options: `active`, `away`, or `out_of_office`.", + ] = None, +) -> Annotated[dict[str, Any], "Response from the API endpoint 'UpdateUser'."]: + """Update a user's profile information. + + This tool updates the information of a user identified by a specific ID. It should be called when changes to a user's profile are needed, such as updating personal details or contact information.""" # noqa: E501 + request_data: Any = {"role_id": user_role_id, "status": user_status} + if isinstance(request_data, dict): + request_data = remove_none_values(request_data) + content = json.dumps(request_data) if request_data else None + response = await make_request( + url="https://api.usepylon.com/users/{id}".format(id=user_id), # noqa: UP032 + method="PATCH", + params=remove_none_values({}), + headers=remove_none_values({ + "Content-Type": "application/json", + "Authorization": "Bearer {authorization}".format( # noqa: UP032 + authorization=context.get_secret("PYLON_SECRET_TOKEN") + ), + }), + content=content, + ) + try: + return {"response_json": response.json()} + except Exception: + return {"response_text": response.text} diff --git a/toolkits/pylon_api/pylon_api/tools/request_body_schemas.py b/toolkits/pylon_api/pylon_api/tools/request_body_schemas.py new file mode 100644 index 00000000..d73732d6 --- /dev/null +++ b/toolkits/pylon_api/pylon_api/tools/request_body_schemas.py @@ -0,0 +1,42 @@ +"""Request Body Schemas for API Tools + +DO NOT EDIT THIS MODULE DIRECTLY. + +THIS MODULE WAS AUTO-GENERATED AND CONTAINS OpenAPI REQUEST BODY SCHEMAS +FOR TOOLS WITH COMPLEX REQUEST BODIES. ANY CHANGES TO THIS MODULE WILL +BE OVERWRITTEN BY THE TRANSPILER. +""" + +from typing import Any + +REQUEST_BODY_SCHEMAS: dict[str, Any] = { + "UPDATEMULTIPLEACCOUNTS": '{"properties": {"account_ids": {"description": "The account IDs to update. The number of accounts to update must be between 1 and 100.", "items": {"type": "string"}, "type": "array", "x-go-name": "AccountIDs"}, "custom_fields": {"description": "An array of custom fields to be updated on the accounts.", "items": {"properties": {"slug": {"description": "The slug of the custom field.", "type": "string", "x-go-name": "Slug"}, "value": {"description": "The value of the custom field. Only to be used for single-valued custom fields. If unset, the custom field will be unset. If the custom field is a select field, the value must be the select option slug, which you can find from the GET /custom-fields endpoint.", "type": "string", "x-go-name": "Value"}, "values": {"description": "The values of the custom field. Only to be used for multi-valued custom fields (ex. multiselect). If unset, the custom field will be unset. If the custom field is a multiselect field, the values must be the select option slugs which you can find from the GET /custom-fields endpoint.", "items": {"type": "string"}, "type": "array", "x-go-name": "Values"}}, "type": "object", "x-go-package": "pylon/api/apiserver/apitypes"}, "type": "array", "x-go-name": "CustomFields"}, "owner_id": {"description": "The ID of the new owner. If empty string is passed in, the owner will be removed.", "type": "string", "x-go-name": "OwnerID"}, "tags": {"description": "An array of tags to be updated on the accounts.", "items": {"type": "string"}, "type": "array", "x-go-name": "Tags"}, "tags_apply_mode": {"description": "The mode for applying tags. Valid values: "append_only", "remove_only", "replace". Defaults to "replace".", "type": "string", "x-go-name": "TagsApplyMode"}}, "required": ["account_ids"], "type": "object", "x-go-package": "pylon/api/apiserver/endpoints"}', # noqa: E501 + "CREATENEWACCOUNT": '{"properties": {"channels": {"description": "An array of channels to be linked to this account.", "items": {"properties": {"channel_id": {"description": "The ID of the channel. If this is a Microsoft Teams channel, the ID must be in the format of `{team_id}|{channel_id}`.", "type": "string", "x-go-name": "ChannelID"}, "is_primary": {"description": "Whether this channel is the primary channel for the account.", "type": "boolean", "x-go-name": "IsPrimary"}, "mirror_to": {"properties": {"channel_id": {"description": "The ID of the channel. If this is a Microsoft Teams channel, the ID must be in the format of `{team_id}|{channel_id}`.", "type": "string", "x-go-name": "ChannelID"}, "source": {"description": "The source, which can be one of `["slack", "microsoft_teams", "discord"]`.", "type": "string", "x-go-name": "Source"}}, "type": "object", "x-go-package": "pylon/api/apiserver/apitypes"}, "source": {"description": "The source, which can be one of `["slack", "microsoft_teams", "discord"]`.", "type": "string", "x-go-name": "Source"}}, "type": "object", "x-go-package": "pylon/api/apiserver/apitypes"}, "type": "array", "x-go-name": "Channels"}, "custom_fields": {"description": "An array of custom fields to be used on this account.", "items": {"properties": {"slug": {"description": "The slug of the custom field.", "type": "string", "x-go-name": "Slug"}, "value": {"description": "The value of the custom field. Only to be used for single-valued custom fields. If unset, the custom field will be unset. If the custom field is a select field, the value must be the select option slug, which you can find from the GET /custom-fields endpoint.", "type": "string", "x-go-name": "Value"}, "values": {"description": "The values of the custom field. Only to be used for multi-valued custom fields (ex. multiselect). If unset, the custom field will be unset. If the custom field is a multiselect field, the values must be the select option slugs which you can find from the GET /custom-fields endpoint.", "items": {"type": "string"}, "type": "array", "x-go-name": "Values"}}, "type": "object", "x-go-package": "pylon/api/apiserver/apitypes"}, "type": "array", "x-go-name": "CustomFields"}, "domain": {"description": "Deprecated. Please use Domains and PrimaryDomain instead.", "type": "string", "x-go-name": "Domain"}, "domains": {"description": "The domains of the account, without any leading scheme, for example stripe.com. Must specify one domain as primary.", "items": {"type": "string"}, "type": "array", "x-go-name": "Domains"}, "external_ids": {"description": "An array of external IDs to be used on this account. If provided, the accounts external IDs will be updated to the given external IDs.", "items": {"properties": {"external_id": {"description": "The external ID. Must be unique per object type (ex. account).", "type": "string", "x-go-name": "ExternalID"}, "label": {"description": "The label of the external ID. Must be unique per object.", "type": "string", "x-go-name": "Label"}}, "type": "object", "x-go-package": "pylon/api/apiserver/apitypes"}, "type": "array", "x-go-name": "ExternalIDs"}, "logo_url": {"description": "The logo URL of the account. Must be a square .png, .jpg or .jpeg.", "type": "string", "x-go-name": "LogoURL"}, "name": {"description": "The name of the account.", "type": "string", "x-go-name": "Name"}, "owner_id": {"description": "The ID of the owner of the account.", "type": "string", "x-go-name": "OwnerID"}, "primary_domain": {"description": "Must be in the list of domains. If there are any domains, there must be exactly one primary domain.", "type": "string", "x-go-name": "PrimaryDomain"}, "tags": {"description": "An array of strings to use as tags on this account. If provided, the accounts tags will be updated to the given tags.", "items": {"type": "string"}, "type": "array", "x-go-name": "Tags"}}, "required": ["name"], "type": "object", "x-go-package": "pylon/api/apiserver/endpoints"}', # noqa: E501 + "SEARCHACCOUNTS": '{"properties": {"cursor": {"description": "The cursor to use for pagination.", "type": "string", "x-go-name": "Cursor"}, "filter": {"properties": {"field": {"description": "The field for this filter. For allowed fields, see the documentation for\n\nthe specific endpoint you are using.\n\nFor non-compound filters (any operators other than "and" or "or"),\n\nField must be set, along with either Value or Values, depending on the operator.", "type": "string", "x-go-name": "Field"}, "operator": {"description": "The operator for this filter.\n\n* equals FilterOperatorEquals Matches objects that are exactly equal to the value in the field.\n\n* not_equals FilterOperatorNotEquals Matches objects that are not exactly equal to the value in the field.\n\n* contains FilterOperatorContains For a multi-valued field, such as tags, this operator will match objects that contain any of the values in the field.\n\n* does_not_contain FilterOperatorDoesNotContain For a multi-valued field, such as tags, this operator will match objects that do not contain any of the values in the field.\n\n* in FilterOperatorIn Matches objects if the field is one of several possible values, as specified in the values array.\n\n* not_in FilterOperatorNotIn Matches objects if the field is none of several possible values, as specified in the values array.\n\n* and FilterOperatorAnd Matches objects only if all subfilters match.\n\n* or FilterOperatorOr Matches objects if any subfilter matches.\n\n* time_is_after FilterOperatorTimeIsAfter Matches objects if the field is after the given time.\n\n* time_is_before FilterOperatorTimeIsBefore Matches objects if the field is before the given time.\n\n* time_range FilterOperatorTimeRange Matches objects if the field is between the given times.\n\n* string_contains FilterOperatorStringContains Matches objects if the field contains the given string.\n\n* string_does_not_contain FilterOperatorStringDoesNotContain Matches objects if the field does not contain the given string.\n\n* is_set FilterOperatorIsSet FilterOperatorIsSet matches objects if the field is set.\n\n* is_unset FilterOperatorIsUnset FilterOperatorIsUnset matches objects if the field is unset.", "enum": ["equals", "not_equals", "contains", "does_not_contain", "in", "not_in", "and", "or", "time_is_after", "time_is_before", "time_range", "string_contains", "string_does_not_contain", "is_set", "is_unset"], "type": "string", "x-go-enum-desc": "equals FilterOperatorEquals Matches objects that are exactly equal to the value in the field.\nnot_equals FilterOperatorNotEquals Matches objects that are not exactly equal to the value in the field.\ncontains FilterOperatorContains For a multi-valued field, such as tags, this operator will match objects that contain any of the values in the field.\ndoes_not_contain FilterOperatorDoesNotContain For a multi-valued field, such as tags, this operator will match objects that do not contain any of the values in the field.\nin FilterOperatorIn Matches objects if the field is one of several possible values, as specified in the values array.\nnot_in FilterOperatorNotIn Matches objects if the field is none of several possible values, as specified in the values array.\nand FilterOperatorAnd Matches objects only if all subfilters match.\nor FilterOperatorOr Matches objects if any subfilter matches.\ntime_is_after FilterOperatorTimeIsAfter Matches objects if the field is after the given time.\ntime_is_before FilterOperatorTimeIsBefore Matches objects if the field is before the given time.\ntime_range FilterOperatorTimeRange Matches objects if the field is between the given times.\nstring_contains FilterOperatorStringContains Matches objects if the field contains the given string.\nstring_does_not_contain FilterOperatorStringDoesNotContain Matches objects if the field does not contain the given string.\nis_set FilterOperatorIsSet FilterOperatorIsSet matches objects if the field is set.\nis_unset FilterOperatorIsUnset FilterOperatorIsUnset matches objects if the field is unset.", "x-go-name": "Operator"}, "subfilters": {"description": "Sub-filters for this filter. Valid only when operator is "and" or "or".\n\nThe maximum allowed depth for a tree of filters is 3.", "items": {"$ref": "#/components/schemas/Filter", "has_circular_reference": true}, "type": "array", "x-go-name": "Subfilters"}, "value": {"description": "The value for this filter. Only used for single-valued operators\n\n("equals", "not_equals", "contains", "does_not_contain")", "type": "string", "x-go-name": "Value"}, "values": {"description": "The values for this filter. Only used for multi-valued operators ("in", "not_in").", "items": {"type": "string"}, "type": "array", "x-go-name": "Values"}}, "required": ["field", "operator"], "type": "object", "x-go-package": "pylon/api/apiserver/apitypes"}, "limit": {"description": "The number of accounts to fetch. Defaults to 100. Must be greater than 0 and less than 1000.", "format": "int64", "type": "integer", "x-go-name": "Limit"}}, "required": ["filter"], "type": "object", "x-go-package": "pylon/api/apiserver/endpoints"}', # noqa: E501 + "CREATEACCOUNTHIGHLIGHT": '{"properties": {"content_html": {"description": "The HTML content for this highlight.", "type": "string", "x-go-name": "ContentHTML"}, "expires_at": {"description": "Optional RFC3339 timestamp of when this highlight will expire.", "type": "string", "x-go-name": "ExpiresAt"}}, "required": ["content_html"], "type": "object", "x-go-package": "pylon/api/apiserver/endpoints"}', # noqa: E501 + "UPDATEACCOUNT": '{"properties": {"channels": {"description": "An array of channels to be linked to this account.", "items": {"properties": {"channel_id": {"description": "The ID of the channel. If this is a Microsoft Teams channel, the ID must be in the format of `{team_id}|{channel_id}`.", "type": "string", "x-go-name": "ChannelID"}, "is_primary": {"description": "Whether this channel is the primary channel for the account.", "type": "boolean", "x-go-name": "IsPrimary"}, "mirror_to": {"properties": {"channel_id": {"description": "The ID of the channel. If this is a Microsoft Teams channel, the ID must be in the format of `{team_id}|{channel_id}`.", "type": "string", "x-go-name": "ChannelID"}, "source": {"description": "The source, which can be one of `["slack", "microsoft_teams", "discord"]`.", "type": "string", "x-go-name": "Source"}}, "type": "object", "x-go-package": "pylon/api/apiserver/apitypes"}, "source": {"description": "The source, which can be one of `["slack", "microsoft_teams", "discord"]`.", "type": "string", "x-go-name": "Source"}}, "type": "object", "x-go-package": "pylon/api/apiserver/apitypes"}, "type": "array", "x-go-name": "Channels"}, "custom_fields": {"description": "An array of custom fields to be used on this account.", "items": {"properties": {"slug": {"description": "The slug of the custom field.", "type": "string", "x-go-name": "Slug"}, "value": {"description": "The value of the custom field. Only to be used for single-valued custom fields. If unset, the custom field will be unset. If the custom field is a select field, the value must be the select option slug, which you can find from the GET /custom-fields endpoint.", "type": "string", "x-go-name": "Value"}, "values": {"description": "The values of the custom field. Only to be used for multi-valued custom fields (ex. multiselect). If unset, the custom field will be unset. If the custom field is a multiselect field, the values must be the select option slugs which you can find from the GET /custom-fields endpoint.", "items": {"type": "string"}, "type": "array", "x-go-name": "Values"}}, "type": "object", "x-go-package": "pylon/api/apiserver/apitypes"}, "type": "array", "x-go-name": "CustomFields"}, "domains": {"description": "Domains of the account. Must specify one domain as primary.", "items": {"type": "string"}, "type": "array", "x-go-name": "Domains"}, "external_ids": {"description": "An array of external IDs to be used on this account. If provided, the accounts external IDs will be updated to the given external IDs.", "items": {"properties": {"external_id": {"description": "The external ID. Must be unique per object type (ex. account).", "type": "string", "x-go-name": "ExternalID"}, "label": {"description": "The label of the external ID. Must be unique per object.", "type": "string", "x-go-name": "Label"}}, "type": "object", "x-go-package": "pylon/api/apiserver/apitypes"}, "type": "array", "x-go-name": "ExternalIDs"}, "logo_url": {"description": "Logo URL of the account.", "type": "string", "x-go-name": "LogoURL"}, "name": {"description": "The name of the account.", "type": "string", "x-go-name": "Name"}, "owner_id": {"description": "The ID of the owner of the account.", "type": "string", "x-go-name": "OwnerID"}, "primary_domain": {"description": "Must be in the list of domains. If there are any domains, there must be exactly one primary domain.", "type": "string", "x-go-name": "PrimaryDomain"}, "tags": {"description": "An array of strings to use as tags on this account. If provided, the accounts tags will be updated to the given tags.", "items": {"type": "string"}, "type": "array", "x-go-name": "Tags"}}, "type": "object", "x-go-package": "pylon/api/apiserver/endpoints"}', # noqa: E501 + "CREATEACCOUNTACTIVITY": '{"properties": {"body_html": {"description": "Optional HTML content to display in the activity.", "type": "string", "x-go-name": "BodyHTML"}, "contact_id": {"description": "Optional contact ID of the actor of the activity.", "type": "string", "x-go-name": "ContactID"}, "happened_at": {"description": "Timestamp (RFC3339) of when the activity happened. Defaults to the current time if empty.", "type": "string", "x-go-name": "HappenedAt"}, "link": {"description": "Optional link to add to the activity.", "type": "string", "x-go-name": "Link"}, "link_text": {"description": "Optional link text to display on the activity. Defaults to "Open link" if not provided. Applies only if a link is provided.", "type": "string", "x-go-name": "LinkText"}, "slug": {"description": "The slug of the activity to create.", "type": "string", "x-go-name": "Slug"}, "user_id": {"description": "Optional user ID of the actor of the activity.", "type": "string", "x-go-name": "UserID"}}, "required": ["slug"], "type": "object", "x-go-package": "pylon/api/apiserver/endpoints"}', # noqa: E501 + "CREATENEWCONTACT": '{"properties": {"account_external_id": {"description": "The external ID of the account that this contact belongs to. Cannot be used together with account_id.", "type": "string", "x-go-name": "AccountExternalID"}, "account_id": {"description": "The account that this contact belongs to.", "type": "string", "x-go-name": "AccountID"}, "avatar_url": {"description": "The avatar URL of the contact. Must be a square .png, .jpg or .jpeg.", "type": "string", "x-go-name": "AvatarUrl"}, "custom_fields": {"description": "An array of custom fields to be applied to this contact.", "items": {"properties": {"slug": {"description": "The slug of the custom field.", "type": "string", "x-go-name": "Slug"}, "value": {"description": "The value of the custom field. Only to be used for single-valued custom fields. If unset, the custom field will be unset. If the custom field is a select field, the value must be the select option slug, which you can find from the GET /custom-fields endpoint.", "type": "string", "x-go-name": "Value"}, "values": {"description": "The values of the custom field. Only to be used for multi-valued custom fields (ex. multiselect). If unset, the custom field will be unset. If the custom field is a multiselect field, the values must be the select option slugs which you can find from the GET /custom-fields endpoint.", "items": {"type": "string"}, "type": "array", "x-go-name": "Values"}}, "type": "object", "x-go-package": "pylon/api/apiserver/apitypes"}, "type": "array", "x-go-name": "CustomFields"}, "email": {"description": "The email of the contact.", "type": "string", "x-go-name": "Email"}, "name": {"description": "The name of the contact.", "type": "string", "x-go-name": "Name"}, "portal_role": {"description": "The portal role to assign to the contact. If not provided uses the default portal role from the portal settings.\n\n* no_access PortalRoleNoAccess\n\n* member PortalRoleMember\n\n* admin PortalRoleAdmin", "enum": ["no_access", "member", "admin"], "type": "string", "x-go-enum-desc": "no_access PortalRoleNoAccess\nmember PortalRoleMember\nadmin PortalRoleAdmin", "x-go-name": "PortalRole"}}, "required": ["name"], "type": "object", "x-go-package": "pylon/api/apiserver/endpoints"}', # noqa: E501 + "SEARCHCONTACTS": '{"properties": {"cursor": {"description": "The cursor to use for pagination.", "type": "string", "x-go-name": "Cursor"}, "filter": {"properties": {"field": {"description": "The field for this filter. For allowed fields, see the documentation for\n\nthe specific endpoint you are using.\n\nFor non-compound filters (any operators other than "and" or "or"),\n\nField must be set, along with either Value or Values, depending on the operator.", "type": "string", "x-go-name": "Field"}, "operator": {"description": "The operator for this filter.\n\n* equals FilterOperatorEquals Matches objects that are exactly equal to the value in the field.\n\n* not_equals FilterOperatorNotEquals Matches objects that are not exactly equal to the value in the field.\n\n* contains FilterOperatorContains For a multi-valued field, such as tags, this operator will match objects that contain any of the values in the field.\n\n* does_not_contain FilterOperatorDoesNotContain For a multi-valued field, such as tags, this operator will match objects that do not contain any of the values in the field.\n\n* in FilterOperatorIn Matches objects if the field is one of several possible values, as specified in the values array.\n\n* not_in FilterOperatorNotIn Matches objects if the field is none of several possible values, as specified in the values array.\n\n* and FilterOperatorAnd Matches objects only if all subfilters match.\n\n* or FilterOperatorOr Matches objects if any subfilter matches.\n\n* time_is_after FilterOperatorTimeIsAfter Matches objects if the field is after the given time.\n\n* time_is_before FilterOperatorTimeIsBefore Matches objects if the field is before the given time.\n\n* time_range FilterOperatorTimeRange Matches objects if the field is between the given times.\n\n* string_contains FilterOperatorStringContains Matches objects if the field contains the given string.\n\n* string_does_not_contain FilterOperatorStringDoesNotContain Matches objects if the field does not contain the given string.\n\n* is_set FilterOperatorIsSet FilterOperatorIsSet matches objects if the field is set.\n\n* is_unset FilterOperatorIsUnset FilterOperatorIsUnset matches objects if the field is unset.", "enum": ["equals", "not_equals", "contains", "does_not_contain", "in", "not_in", "and", "or", "time_is_after", "time_is_before", "time_range", "string_contains", "string_does_not_contain", "is_set", "is_unset"], "type": "string", "x-go-enum-desc": "equals FilterOperatorEquals Matches objects that are exactly equal to the value in the field.\nnot_equals FilterOperatorNotEquals Matches objects that are not exactly equal to the value in the field.\ncontains FilterOperatorContains For a multi-valued field, such as tags, this operator will match objects that contain any of the values in the field.\ndoes_not_contain FilterOperatorDoesNotContain For a multi-valued field, such as tags, this operator will match objects that do not contain any of the values in the field.\nin FilterOperatorIn Matches objects if the field is one of several possible values, as specified in the values array.\nnot_in FilterOperatorNotIn Matches objects if the field is none of several possible values, as specified in the values array.\nand FilterOperatorAnd Matches objects only if all subfilters match.\nor FilterOperatorOr Matches objects if any subfilter matches.\ntime_is_after FilterOperatorTimeIsAfter Matches objects if the field is after the given time.\ntime_is_before FilterOperatorTimeIsBefore Matches objects if the field is before the given time.\ntime_range FilterOperatorTimeRange Matches objects if the field is between the given times.\nstring_contains FilterOperatorStringContains Matches objects if the field contains the given string.\nstring_does_not_contain FilterOperatorStringDoesNotContain Matches objects if the field does not contain the given string.\nis_set FilterOperatorIsSet FilterOperatorIsSet matches objects if the field is set.\nis_unset FilterOperatorIsUnset FilterOperatorIsUnset matches objects if the field is unset.", "x-go-name": "Operator"}, "subfilters": {"description": "Sub-filters for this filter. Valid only when operator is "and" or "or".\n\nThe maximum allowed depth for a tree of filters is 3.", "items": {"$ref": "#/components/schemas/Filter", "has_circular_reference": true}, "type": "array", "x-go-name": "Subfilters"}, "value": {"description": "The value for this filter. Only used for single-valued operators\n\n("equals", "not_equals", "contains", "does_not_contain")", "type": "string", "x-go-name": "Value"}, "values": {"description": "The values for this filter. Only used for multi-valued operators ("in", "not_in").", "items": {"type": "string"}, "type": "array", "x-go-name": "Values"}}, "required": ["field", "operator"], "type": "object", "x-go-package": "pylon/api/apiserver/apitypes"}, "limit": {"description": "The number of contacts to fetch. Defaults to 100. Must be greater than 0 and less than 1000.", "format": "int64", "type": "integer", "x-go-name": "Limit"}}, "required": ["filter"], "type": "object", "x-go-package": "pylon/api/apiserver/endpoints"}', # noqa: E501 + "UPDATECONTACTINFO": '{"properties": {"account_external_id": {"description": "The external ID of the account to move the contact to. Cannot be used together with account_id.", "type": "string", "x-go-name": "AccountExternalID"}, "account_id": {"description": "The account to move the contact to.", "type": "string", "x-go-name": "AccountID"}, "avatar_url": {"description": "The avatar URL of the contact. Must be a square .png, .jpg or .jpeg.", "type": "string", "x-go-name": "AvatarUrl"}, "custom_fields": {"description": "An array of custom fields to be applied to this contact.", "items": {"properties": {"slug": {"description": "The slug of the custom field.", "type": "string", "x-go-name": "Slug"}, "value": {"description": "The value of the custom field. Only to be used for single-valued custom fields. If unset, the custom field will be unset. If the custom field is a select field, the value must be the select option slug, which you can find from the GET /custom-fields endpoint.", "type": "string", "x-go-name": "Value"}, "values": {"description": "The values of the custom field. Only to be used for multi-valued custom fields (ex. multiselect). If unset, the custom field will be unset. If the custom field is a multiselect field, the values must be the select option slugs which you can find from the GET /custom-fields endpoint.", "items": {"type": "string"}, "type": "array", "x-go-name": "Values"}}, "type": "object", "x-go-package": "pylon/api/apiserver/apitypes"}, "type": "array", "x-go-name": "CustomFields"}, "email": {"description": "The email of the contact.", "type": "string", "x-go-name": "Email"}, "name": {"description": "in: body\n\nThe name of the contact.", "type": "string", "x-go-name": "Name"}, "portal_role": {"description": "The portal role to assign to the contact. Can be one of `no_access`, `member`, or `admin`.\n\n* no_access PortalRoleNoAccess\n\n* member PortalRoleMember\n\n* admin PortalRoleAdmin", "enum": ["no_access", "member", "admin"], "type": "string", "x-go-enum-desc": "no_access PortalRoleNoAccess\nmember PortalRoleMember\nadmin PortalRoleAdmin", "x-go-name": "PortalRole"}}, "type": "object", "x-go-package": "pylon/api/apiserver/endpoints"}', # noqa: E501 + "CREATECUSTOMFIELD": '{"properties": {"default_value": {"description": "The default value for single-valued custom fields.", "type": "string", "x-go-name": "DefaultValue"}, "default_values": {"description": "The default values for multi-valued custom fields.", "items": {"type": "string"}, "type": "array", "x-go-name": "DefaultValues"}, "description": {"description": "The description of the custom field.", "type": "string", "x-go-name": "Description"}, "label": {"description": "The label of the custom field.", "type": "string", "x-go-name": "Label"}, "object_type": {"description": "The object type of the custom field. Can be "account", "issue", or "contact"", "type": "string", "x-go-name": "ObjectType"}, "select_options": {"description": "The list options of the select custom field. This is only present for select and multiselect custom fields.", "items": {"properties": {"label": {"description": "The label of the option.", "type": "string", "x-go-name": "Label"}, "slug": {"description": "The slug of the option.", "type": "string", "x-go-name": "Slug"}}, "type": "object", "x-go-package": "pylon/api/apiserver/apitypes"}, "type": "array", "x-go-name": "SelectOptions"}, "slug": {"description": "The slug of the custom field.", "type": "string", "x-go-name": "Slug"}, "type": {"description": "The type of the custom field. Can be one of `text`, `number`, `decimal`, `boolean`, `date`, `datetime`, `user`, `url`, `select`, or `multiselect`.", "type": "string", "x-go-name": "Type"}}, "required": ["label", "object_type", "type"], "type": "object", "x-go-package": "pylon/api/apiserver/endpoints"}', # noqa: E501 + "UPDATECUSTOMFIELD": '{"properties": {"default_value": {"description": "The default value for single-valued custom fields.", "type": "string", "x-go-name": "DefaultValue"}, "default_values": {"description": "The default values for multi-valued custom fields.", "items": {"type": "string"}, "type": "array", "x-go-name": "DefaultValues"}, "description": {"description": "The description of the custom field.", "type": "string", "x-go-name": "Description"}, "label": {"description": "The label of the custom field.", "type": "string", "x-go-name": "Label"}, "select_options": {"description": "The list options of the select custom field. This is only present for select and multiselect custom fields.", "items": {"properties": {"label": {"description": "The label of the option.", "type": "string", "x-go-name": "Label"}, "slug": {"description": "The slug of the option.", "type": "string", "x-go-name": "Slug"}}, "type": "object", "x-go-package": "pylon/api/apiserver/apitypes"}, "type": "array", "x-go-name": "SelectOptions"}, "slug": {"description": "The slug of the custom field.", "type": "string", "x-go-name": "Slug"}}, "type": "object", "x-go-package": "pylon/api/apiserver/endpoints"}', # noqa: E501 + "IMPORTNEWCONTACT": '{"properties": {"account_id": {"description": "The account that this contact belongs to.", "type": "string", "x-go-name": "AccountID"}, "avatar_url": {"description": "The avatar URL of the contact. Must be a square .png, .jpg or .jpeg.", "type": "string", "x-go-name": "AvatarUrl"}, "custom_fields": {"description": "An array of custom fields to be applied to this contact.", "items": {"properties": {"slug": {"description": "The slug of the custom field.", "type": "string", "x-go-name": "Slug"}, "value": {"description": "The value of the custom field. Only to be used for single-valued custom fields. If unset, the custom field will be unset. If the custom field is a select field, the value must be the select option slug, which you can find from the GET /custom-fields endpoint.", "type": "string", "x-go-name": "Value"}, "values": {"description": "The values of the custom field. Only to be used for multi-valued custom fields (ex. multiselect). If unset, the custom field will be unset. If the custom field is a multiselect field, the values must be the select option slugs which you can find from the GET /custom-fields endpoint.", "items": {"type": "string"}, "type": "array", "x-go-name": "Values"}}, "type": "object", "x-go-package": "pylon/api/apiserver/apitypes"}, "type": "array", "x-go-name": "CustomFields"}, "email": {"description": "The email of the contact.", "type": "string", "x-go-name": "Email"}, "name": {"description": "The name of the contact.", "type": "string", "x-go-name": "Name"}, "portal_role": {"description": "The portal role to assign to the contact. If not provided uses the default portal role from the portal settings.\n\n* no_access PortalRoleNoAccess\n\n* member PortalRoleMember\n\n* admin PortalRoleAdmin", "enum": ["no_access", "member", "admin"], "type": "string", "x-go-enum-desc": "no_access PortalRoleNoAccess\nmember PortalRoleMember\nadmin PortalRoleAdmin", "x-go-name": "PortalRole"}}, "required": ["email", "name"], "type": "object", "x-go-package": "pylon/api/apiserver/endpoints"}', # noqa: E501 + "IMPORTISSUE": '{"properties": {"account_id": {"description": "AccountID that the issue should belong to.", "type": "string", "x-go-name": "AccountID"}, "assignee_id": {"description": "UserID that the issue should be assigned to.", "type": "string", "x-go-name": "AssigneeID"}, "attachment_urls": {"description": "An array of attachment URLs to attach to this issue.", "items": {"type": "string"}, "type": "array", "x-go-name": "AttachmentURLs"}, "created_at": {"description": "CreatedAt is the time the issue was created (RFC3339).", "type": "string", "x-go-name": "CreatedAt"}, "custom_fields": {"description": "An array of custom fields to be used on this issue.", "items": {"properties": {"slug": {"description": "The slug of the custom field.", "type": "string", "x-go-name": "Slug"}, "value": {"description": "The value of the custom field. Only to be used for single-valued custom fields. If unset, the custom field will be unset. If the custom field is a select field, the value must be the select option slug, which you can find from the GET /custom-fields endpoint.", "type": "string", "x-go-name": "Value"}, "values": {"description": "The values of the custom field. Only to be used for multi-valued custom fields (ex. multiselect). If unset, the custom field will be unset. If the custom field is a multiselect field, the values must be the select option slugs which you can find from the GET /custom-fields endpoint.", "items": {"type": "string"}, "type": "array", "x-go-name": "Values"}}, "type": "object", "x-go-package": "pylon/api/apiserver/apitypes"}, "type": "array", "x-go-name": "CustomFields"}, "external_issues": {"description": "External issues to link to this issue.", "items": {"properties": {"external_issue_id": {"description": "The ID of the external issue in the source system.", "type": "string", "x-go-name": "ExternalIssueID"}, "source": {"description": "The source system of the external issue (e.g., "linear", "asana", "jira", "github").", "type": "string", "x-go-name": "Source"}}, "required": ["external_issue_id", "source"], "type": "object", "x-go-package": "pylon/api/apiserver/endpoints"}, "type": "array", "x-go-name": "ExternalIssues"}, "external_refs": {"properties": {"intercom_conversation_id": {"description": "The Intercom conversation ID associated with this issue, if any.", "type": "string", "x-go-name": "IntercomConversationID"}, "zendesk_ticket_id": {"description": "The Zendesk ticket ID associated with this issue, if any.", "type": "string", "x-go-name": "ZendeskTicketID"}}, "type": "object", "x-go-package": "pylon/api/apiserver/endpoints"}, "first_response_time": {"description": "FirstResponseTime is the time the issue was first responded to (RFC3339).", "type": "string", "x-go-name": "FirstResponseTime"}, "messages": {"description": "Messages to be imported for this issue. At least one message is required.", "items": {"properties": {"attachment_urls": {"description": "An array of attachment URLs to attach to this message.", "items": {"type": "string"}, "type": "array", "x-go-name": "AttachmentURLs"}, "body_html": {"description": "The HTML content of the message.", "type": "string", "x-go-name": "BodyHTML"}, "contact_id": {"description": "The contact that sent the message. Only one of user_id or contact_id can be specified.", "type": "string", "x-go-name": "ContactID"}, "created_at": {"description": "CreatedAt is the time the message was created (RFC3339).", "type": "string", "x-go-name": "CreatedAt"}, "is_private": {"description": "Whether the message is private.", "type": "boolean", "x-go-name": "IsPrivate"}, "user_id": {"description": "The user that sent the message. Only one of user_id or contact_id can be specified.", "type": "string", "x-go-name": "UserID"}}, "required": ["body_html", "is_private"], "type": "object", "x-go-package": "pylon/api/apiserver/endpoints"}, "type": "array", "x-go-name": "Messages"}, "requester_id": {"description": "ContactID that the issue should be on behalf of.", "type": "string", "x-go-name": "RequesterID"}, "resolution_time": {"description": "ResolutionTime is the time the issue was resolved (RFC3339).", "type": "string", "x-go-name": "ResolutionTime"}, "state": {"description": "The state of the issue. Can be one of new, waiting_on_you, waiting_on_customer, on_hold, closed, or a custom status.", "type": "string", "x-go-name": "State"}, "tags": {"description": "An array of strings to use as tags on this issue.", "items": {"type": "string"}, "type": "array", "x-go-name": "Tags"}, "team_id": {"description": "TeamID that the issue should be assigned to.", "type": "string", "x-go-name": "TeamID"}, "title": {"description": "The title of the issue.", "type": "string", "x-go-name": "Title"}, "updated_at": {"description": "UpdatedAt is the time the issue was last updated (RFC3339).", "type": "string", "x-go-name": "UpdatedAt"}}, "required": ["messages", "state", "title"], "type": "object", "x-go-package": "pylon/api/apiserver/endpoints"}', # noqa: E501 + "IMPORTMESSAGESTOISSUE": '{"properties": {"messages": {"description": "Messages to be imported for this issue. At least one message is required.", "items": {"properties": {"attachment_urls": {"description": "An array of attachment URLs to attach to this message.", "items": {"type": "string"}, "type": "array", "x-go-name": "AttachmentURLs"}, "body_html": {"description": "The HTML content of the message.", "type": "string", "x-go-name": "BodyHTML"}, "contact_id": {"description": "The contact that sent the message. Only one of user_id or contact_id can be specified.", "type": "string", "x-go-name": "ContactID"}, "created_at": {"description": "CreatedAt is the time the message was created (RFC3339).", "type": "string", "x-go-name": "CreatedAt"}, "is_private": {"description": "Whether the message is private.", "type": "boolean", "x-go-name": "IsPrivate"}, "user_id": {"description": "The user that sent the message. Only one of user_id or contact_id can be specified.", "type": "string", "x-go-name": "UserID"}}, "required": ["body_html", "is_private"], "type": "object", "x-go-package": "pylon/api/apiserver/endpoints"}, "type": "array", "x-go-name": "Messages"}}, "required": ["messages"], "type": "object", "x-go-package": "pylon/api/apiserver/endpoints"}', # noqa: E501 + "CREATENEWISSUE": '{"properties": {"account_id": {"description": "The account that this issue belongs to.", "type": "string", "x-go-name": "AccountID"}, "assignee_id": {"description": "The user the issue should be assigned to.", "type": "string", "x-go-name": "AssigneeID"}, "attachment_urls": {"description": "An array of attachment URLs to attach to this issue.", "items": {"type": "string"}, "type": "array", "x-go-name": "AttachmentURLs"}, "body_html": {"description": "The HTML content of the body of the issue.", "type": "string", "x-go-name": "BodyHTML"}, "contact_id": {"description": "Optional contact ID to post the message as. Only one of user_id or contact_id can be provided.", "type": "string", "x-go-name": "ContactID"}, "created_at": {"description": "Timestamp of when the issue was created. If not specified, the current time will be used. (RFC3339)", "type": "string", "x-go-name": "CreatedAt"}, "custom_fields": {"description": "An array of custom fields to be used on this issue.", "items": {"properties": {"slug": {"description": "The slug of the custom field.", "type": "string", "x-go-name": "Slug"}, "value": {"description": "The value of the custom field. Only to be used for single-valued custom fields. If unset, the custom field will be unset. If the custom field is a select field, the value must be the select option slug, which you can find from the GET /custom-fields endpoint.", "type": "string", "x-go-name": "Value"}, "values": {"description": "The values of the custom field. Only to be used for multi-valued custom fields (ex. multiselect). If unset, the custom field will be unset. If the custom field is a multiselect field, the values must be the select option slugs which you can find from the GET /custom-fields endpoint.", "items": {"type": "string"}, "type": "array", "x-go-name": "Values"}}, "type": "object", "x-go-package": "pylon/api/apiserver/apitypes"}, "type": "array", "x-go-name": "CustomFields"}, "destination_metadata": {"description": "You can configure the issue to contact the requester via email, Slack, in-app chat, or not at all.\n\nIf a destination other than `internal` is specified, a message with the issue\'s BodyHTML will be delivered to the requester. If you don\'t wish to immediately contact the requester, you can specify the `internal` destination.", "properties": {"chat_widget_app_id": {"description": "The ID of the chat widget app to use for in-app chat.", "type": "string", "x-go-name": "ChatWidgetAppID"}, "destination": {"description": "The destination type of the issue. Can be "email", "slack", "in_app_chat", or "internal". Defaults to "internal".\n\n* slack APIIssueDestinationSlack Deliver to the issue\'s account\'s Slack channel.\n\n* email APIIssueDestinationEmail Deliver messages to the issue requester via email.\n\n* in_app_chat APIIssueDestinationChatWidget Deliver messages to the issue requester via in-app chat.\n\n* internal APIIssueDestinationInternal Keep the issue internal and don\'t contact the requester at all.", "enum": ["slack", "email", "in_app_chat", "internal"], "type": "string", "x-go-enum-desc": "slack APIIssueDestinationSlack Deliver to the issue\'s account\'s Slack channel.\nemail APIIssueDestinationEmail Deliver messages to the issue requester via email.\nin_app_chat APIIssueDestinationChatWidget Deliver messages to the issue requester via in-app chat.\ninternal APIIssueDestinationInternal Keep the issue internal and don\'t contact the requester at all.", "x-go-name": "Destination"}, "email": {"description": "The email that emails to the requester will be sent from. You must configure an email app in Pylon with this address.", "type": "string", "x-go-name": "Email"}, "email_bccs": {"description": "Emails that will be BCCed on emails to the requester.", "items": {"type": "string"}, "type": "array", "x-go-name": "EmailBCCs"}, "email_ccs": {"description": "Emails that will be CCed on emails to the requester.", "items": {"type": "string"}, "type": "array", "x-go-name": "EmailCCs"}}, "title": "DestinationMetadata specifies if/how communication will be delivered to the customer.", "type": "object", "x-go-package": "pylon/api/apiserver/apitypes"}, "priority": {"description": "The priority of the issue. Can be one of: urgent, high, medium, or low.", "type": "string", "x-go-name": "Priority"}, "requester_avatar_url": {"description": "The URL of an avatar of the requester.", "type": "string", "x-go-name": "RequesterAvatarUrl"}, "requester_email": {"description": "The email of the user that this issue is on behalf of. Include one of requester_id or requester_email to create an issue with a requester.", "type": "string", "x-go-name": "RequesterEmail"}, "requester_id": {"description": "The requester that this issue is on behalf of. Include one of requester_id or requester_email to create an issue with a requester.", "type": "string", "x-go-name": "RequesterID"}, "requester_name": {"description": "The full name of the user that this issue is on behalf of.", "type": "string", "x-go-name": "RequesterName"}, "tags": {"description": "An array of strings to use as tags on this issue. If provided, the issue tags will be updated to the given tags.", "items": {"type": "string"}, "type": "array", "x-go-name": "Tags"}, "team_id": {"description": "The ID of the team this issue should be assigned to.", "type": "string", "x-go-name": "TeamID"}, "title": {"description": "The title of the issue.", "type": "string", "x-go-name": "Title"}, "user_id": {"description": "Optional user ID to post the message as. Only one of user_id or contact_id can be provided.", "type": "string", "x-go-name": "UserID"}}, "required": ["body_html", "title"], "type": "object", "x-go-package": "pylon/api/apiserver/endpoints"}', # noqa: E501 + "SEARCHISSUESBYFILTERS": '{"properties": {"cursor": {"description": "The cursor to use for pagination.", "type": "string", "x-go-name": "Cursor"}, "filter": {"properties": {"field": {"description": "The field for this filter. For allowed fields, see the documentation for\n\nthe specific endpoint you are using.\n\nFor non-compound filters (any operators other than "and" or "or"),\n\nField must be set, along with either Value or Values, depending on the operator.", "type": "string", "x-go-name": "Field"}, "operator": {"description": "The operator for this filter.\n\n* equals FilterOperatorEquals Matches objects that are exactly equal to the value in the field.\n\n* not_equals FilterOperatorNotEquals Matches objects that are not exactly equal to the value in the field.\n\n* contains FilterOperatorContains For a multi-valued field, such as tags, this operator will match objects that contain any of the values in the field.\n\n* does_not_contain FilterOperatorDoesNotContain For a multi-valued field, such as tags, this operator will match objects that do not contain any of the values in the field.\n\n* in FilterOperatorIn Matches objects if the field is one of several possible values, as specified in the values array.\n\n* not_in FilterOperatorNotIn Matches objects if the field is none of several possible values, as specified in the values array.\n\n* and FilterOperatorAnd Matches objects only if all subfilters match.\n\n* or FilterOperatorOr Matches objects if any subfilter matches.\n\n* time_is_after FilterOperatorTimeIsAfter Matches objects if the field is after the given time.\n\n* time_is_before FilterOperatorTimeIsBefore Matches objects if the field is before the given time.\n\n* time_range FilterOperatorTimeRange Matches objects if the field is between the given times.\n\n* string_contains FilterOperatorStringContains Matches objects if the field contains the given string.\n\n* string_does_not_contain FilterOperatorStringDoesNotContain Matches objects if the field does not contain the given string.\n\n* is_set FilterOperatorIsSet FilterOperatorIsSet matches objects if the field is set.\n\n* is_unset FilterOperatorIsUnset FilterOperatorIsUnset matches objects if the field is unset.", "enum": ["equals", "not_equals", "contains", "does_not_contain", "in", "not_in", "and", "or", "time_is_after", "time_is_before", "time_range", "string_contains", "string_does_not_contain", "is_set", "is_unset"], "type": "string", "x-go-enum-desc": "equals FilterOperatorEquals Matches objects that are exactly equal to the value in the field.\nnot_equals FilterOperatorNotEquals Matches objects that are not exactly equal to the value in the field.\ncontains FilterOperatorContains For a multi-valued field, such as tags, this operator will match objects that contain any of the values in the field.\ndoes_not_contain FilterOperatorDoesNotContain For a multi-valued field, such as tags, this operator will match objects that do not contain any of the values in the field.\nin FilterOperatorIn Matches objects if the field is one of several possible values, as specified in the values array.\nnot_in FilterOperatorNotIn Matches objects if the field is none of several possible values, as specified in the values array.\nand FilterOperatorAnd Matches objects only if all subfilters match.\nor FilterOperatorOr Matches objects if any subfilter matches.\ntime_is_after FilterOperatorTimeIsAfter Matches objects if the field is after the given time.\ntime_is_before FilterOperatorTimeIsBefore Matches objects if the field is before the given time.\ntime_range FilterOperatorTimeRange Matches objects if the field is between the given times.\nstring_contains FilterOperatorStringContains Matches objects if the field contains the given string.\nstring_does_not_contain FilterOperatorStringDoesNotContain Matches objects if the field does not contain the given string.\nis_set FilterOperatorIsSet FilterOperatorIsSet matches objects if the field is set.\nis_unset FilterOperatorIsUnset FilterOperatorIsUnset matches objects if the field is unset.", "x-go-name": "Operator"}, "subfilters": {"description": "Sub-filters for this filter. Valid only when operator is "and" or "or".\n\nThe maximum allowed depth for a tree of filters is 3.", "items": {"$ref": "#/components/schemas/Filter", "has_circular_reference": true}, "type": "array", "x-go-name": "Subfilters"}, "value": {"description": "The value for this filter. Only used for single-valued operators\n\n("equals", "not_equals", "contains", "does_not_contain")", "type": "string", "x-go-name": "Value"}, "values": {"description": "The values for this filter. Only used for multi-valued operators ("in", "not_in").", "items": {"type": "string"}, "type": "array", "x-go-name": "Values"}}, "required": ["field", "operator"], "type": "object", "x-go-package": "pylon/api/apiserver/apitypes"}, "limit": {"description": "The number of issues to fetch. Defaults to 100. Must be greater than 0 and less than 1000.", "format": "int64", "type": "integer", "x-go-name": "Limit"}}, "required": ["filter"], "type": "object", "x-go-package": "pylon/api/apiserver/endpoints"}', # noqa: E501 + "UPDATEISSUE": '{"properties": {"account_id": {"description": "The ID of the account that this issue belongs to. Only supported on issues with source: ["manual", "form", "email"].", "type": "string", "x-go-name": "AccountID"}, "assignee_id": {"description": "The ID of the user who should be assigned to this issue. If empty string is passed in, the issue assignee will be removed.", "type": "string", "x-go-name": "AssigneeID"}, "custom_fields": {"description": "An array of custom fields to be used on this issue. Only passed in fields will be modified.", "items": {"properties": {"slug": {"description": "The slug of the custom field.", "type": "string", "x-go-name": "Slug"}, "value": {"description": "The value of the custom field. Only to be used for single-valued custom fields. If unset, the custom field will be unset. If the custom field is a select field, the value must be the select option slug, which you can find from the GET /custom-fields endpoint.", "type": "string", "x-go-name": "Value"}, "values": {"description": "The values of the custom field. Only to be used for multi-valued custom fields (ex. multiselect). If unset, the custom field will be unset. If the custom field is a multiselect field, the values must be the select option slugs which you can find from the GET /custom-fields endpoint.", "items": {"type": "string"}, "type": "array", "x-go-name": "Values"}}, "type": "object", "x-go-package": "pylon/api/apiserver/apitypes"}, "type": "array", "x-go-name": "CustomFields"}, "customer_portal_visible": {"description": "Whether the issue should be visible in the customer portal.", "type": "boolean", "x-go-name": "CustomerPortalVisible"}, "requester_id": {"description": "The ID of the requester that this issue is on behalf of.", "type": "string", "x-go-name": "RequesterID"}, "requestor_id": {"description": "Deprecated: Use requester_id instead.", "type": "string", "x-go-name": "RequestorID"}, "state": {"description": "The state this issue should be moved to. Can be one of new, waiting_on_you, waiting_on_customer, on_hold, closed, or a custom status.", "type": "string", "x-go-name": "State"}, "tags": {"description": "An array of strings to use as tags on this issue. If provided, the issue tags will be updated to be exactly the given tags.", "items": {"type": "string"}, "type": "array", "x-go-name": "Tags"}, "team_id": {"description": "The ID of the team this issue should be assigned to. If empty string is passed in, any assigned team will be removed.", "type": "string", "x-go-name": "TeamID"}}, "type": "object", "x-go-package": "pylon/api/apiserver/endpoints"}', # noqa: E501 + "CREATEAIRESPONSEFORISSUE": '{"properties": {"ai_agent_id": {"description": "The ID of the AI agent to use to create the AI response.", "type": "string", "x-go-name": "AIAgentID"}, "post_as_internal_note": {"description": "Whether to post the AI response as an internal note on the issue.", "type": "boolean", "x-go-name": "PostAsInternalNote"}}, "required": ["ai_agent_id"], "type": "object", "x-go-package": "pylon/api/apiserver/endpoints"}', # noqa: E501 + "LINKEXTERNALISSUE": '{"properties": {"external_issue_id": {"description": "The ID of the external issue in the source system.", "type": "string", "x-go-name": "ExternalIssueID"}, "operation": {"description": "Operation to perform. Use "link" to link issues (default) or "unlink" to unlink issues.", "type": "string", "x-go-name": "Operation"}, "source": {"description": "The source system of the external issue (e.g., "linear", "asana", "jira", "github").", "type": "string", "x-go-name": "Source"}}, "required": ["external_issue_id", "source"], "type": "object", "x-go-package": "pylon/api/apiserver/endpoints"}', # noqa: E501 + "CREATEISSUENOTE": '{"properties": {"attachment_urls": {"description": "An array of attachment URLs to attach to this issue.", "items": {"type": "string"}, "type": "array", "x-go-name": "AttachmentURLs"}, "body_html": {"description": "The body of the message in HTML.", "type": "string", "x-go-name": "BodyHTML"}, "message_id": {"description": "The ID of the message to reply to. This message must be an internal note. You can find this from the GET /issues/{id}/messages endpoint. Either this or thread_id must be provided.", "type": "string", "x-go-name": "MessageID"}, "thread_id": {"description": "The ID of the thread to post the note to. You can find this from the GET /issues/{id}/threads endpoint. Either this or message_id must be provided.", "type": "string", "x-go-name": "ThreadID"}, "user_id": {"description": "Optional user ID to post the message as. If not provided, the API token user will be used.", "type": "string", "x-go-name": "UserID"}}, "required": ["body_html"], "type": "object", "x-go-package": "pylon/api/apiserver/endpoints"}', # noqa: E501 + "CREATEISSUEREPLY": '{"properties": {"attachment_urls": {"description": "An array of attachment URLs to attach to this issue.", "items": {"type": "string"}, "type": "array", "x-go-name": "AttachmentURLs"}, "body_html": {"description": "The body of the message in HTML.", "type": "string", "x-go-name": "BodyHTML"}, "contact_id": {"description": "Optional contact ID to post the message as. Only one of user_id or contact_id can be provided.", "type": "string", "x-go-name": "ContactID"}, "email_info": {"properties": {"bcc_emails": {"items": {"type": "string"}, "type": "array", "x-go-name": "BccEmails"}, "cc_emails": {"items": {"type": "string"}, "type": "array", "x-go-name": "CcEmails"}, "to_emails": {"items": {"type": "string"}, "type": "array", "x-go-name": "ToEmails"}}, "type": "object", "x-go-package": "pylon/api/apiserver/endpoints"}, "message_id": {"description": "The ID of the message to reply to.", "type": "string", "x-go-name": "MessageID"}, "user_id": {"description": "Optional user ID to post the message as. Only one of user_id or contact_id can be provided.", "type": "string", "x-go-name": "UserID"}}, "required": ["body_html", "message_id"], "type": "object", "x-go-package": "pylon/api/apiserver/endpoints"}', # noqa: E501 + "SNOOZEISSUE": '{"properties": {"snooze_until": {"description": "The date and time to snooze the issue until. (RFC3339)", "type": "string", "x-go-name": "SnoozeUntil"}}, "required": ["snooze_until"], "type": "object", "x-go-package": "pylon/api/apiserver/endpoints"}', # noqa: E501 + "CREATEKNOWLEDGEBASEARTICLE": '{"properties": {"author_user_id": {"description": "The ID of the user attributed as the author of the article.", "type": "string", "x-go-name": "AuthorUserId"}, "body_html": {"description": "The HTML body of the article.", "type": "string", "x-go-name": "BodyHTML"}, "collection_id": {"description": "The id of the collection associated to the article", "type": "string", "x-go-name": "CollectionID"}, "is_published": {"description": "Whether the article should be published. Defaults to false.", "type": "boolean", "x-go-name": "IsPublished"}, "is_unlisted": {"description": "Whether the article can only be accessible only via direct link. Defaults to false.", "type": "boolean", "x-go-name": "IsUnlisted"}, "slug": {"description": "The slug of the article. Defaults to a slug based on the title.", "type": "string", "x-go-name": "Slug"}, "title": {"description": "The title of the article.", "type": "string", "x-go-name": "Title"}, "translations": {"description": "Translations of the article content in different languages", "items": {"properties": {"body_html": {"description": "The translated HTML body of the article.", "type": "string", "x-go-name": "BodyHTML"}, "language": {"description": "The language code of the translation. Supported language codes can be found in https://docs.usepylon.com/pylon-docs/knowledge-base/translation#supported-language-codes.", "type": "string", "x-go-name": "Language"}, "title": {"description": "The translated title of the article.", "type": "string", "x-go-name": "Title"}}, "required": ["body_html", "language", "title"], "type": "object", "x-go-package": "pylon/api/apiserver/endpoints"}, "type": "array", "x-go-name": "Translations"}, "visibility_config": {"properties": {"ai_agent_access": {"description": "AI agent access control for the article. Defaults to inherit from the parent scope when omitted.\n\n* inherit KnowledgeBaseArticleAIAgentAccessInherit Defers the access check to the parent object (Collection or KnowledgeBase).\n\n* none KnowledgeBaseArticleAIAgentAccessNone No AI agents have access to this article.\n\n* specific_agents KnowledgeBaseArticleAIAgentAccessSpecificAgents Only specific AI agents enumerated in the allowlist have access.", "enum": ["inherit", "none", "specific_agents"], "type": "string", "x-go-enum-desc": "inherit KnowledgeBaseArticleAIAgentAccessInherit Defers the access check to the parent object (Collection or KnowledgeBase).\nnone KnowledgeBaseArticleAIAgentAccessNone No AI agents have access to this article.\nspecific_agents KnowledgeBaseArticleAIAgentAccessSpecificAgents Only specific AI agents enumerated in the allowlist have access.", "x-go-name": "AiAgentAccess"}, "allowed_agent_ids": {"description": "List of AI agent IDs that may access this article when ai_agent_access is set to "specific_agents".", "items": {"type": "string"}, "type": "array", "x-go-name": "AllowedAgentIDs"}, "customer_visibility_condition": {"properties": {"field": {"description": "The field for this filter. For allowed fields, see the documentation for\n\nthe specific endpoint you are using.\n\nFor non-compound filters (any operators other than "and" or "or"),\n\nField must be set, along with either Value or Values, depending on the operator.", "type": "string", "x-go-name": "Field"}, "operator": {"description": "The operator for this filter.\n\n* equals FilterOperatorEquals Matches objects that are exactly equal to the value in the field.\n\n* not_equals FilterOperatorNotEquals Matches objects that are not exactly equal to the value in the field.\n\n* contains FilterOperatorContains For a multi-valued field, such as tags, this operator will match objects that contain any of the values in the field.\n\n* does_not_contain FilterOperatorDoesNotContain For a multi-valued field, such as tags, this operator will match objects that do not contain any of the values in the field.\n\n* in FilterOperatorIn Matches objects if the field is one of several possible values, as specified in the values array.\n\n* not_in FilterOperatorNotIn Matches objects if the field is none of several possible values, as specified in the values array.\n\n* and FilterOperatorAnd Matches objects only if all subfilters match.\n\n* or FilterOperatorOr Matches objects if any subfilter matches.\n\n* time_is_after FilterOperatorTimeIsAfter Matches objects if the field is after the given time.\n\n* time_is_before FilterOperatorTimeIsBefore Matches objects if the field is before the given time.\n\n* time_range FilterOperatorTimeRange Matches objects if the field is between the given times.\n\n* string_contains FilterOperatorStringContains Matches objects if the field contains the given string.\n\n* string_does_not_contain FilterOperatorStringDoesNotContain Matches objects if the field does not contain the given string.\n\n* is_set FilterOperatorIsSet FilterOperatorIsSet matches objects if the field is set.\n\n* is_unset FilterOperatorIsUnset FilterOperatorIsUnset matches objects if the field is unset.", "enum": ["equals", "not_equals", "contains", "does_not_contain", "in", "not_in", "and", "or", "time_is_after", "time_is_before", "time_range", "string_contains", "string_does_not_contain", "is_set", "is_unset"], "type": "string", "x-go-enum-desc": "equals FilterOperatorEquals Matches objects that are exactly equal to the value in the field.\nnot_equals FilterOperatorNotEquals Matches objects that are not exactly equal to the value in the field.\ncontains FilterOperatorContains For a multi-valued field, such as tags, this operator will match objects that contain any of the values in the field.\ndoes_not_contain FilterOperatorDoesNotContain For a multi-valued field, such as tags, this operator will match objects that do not contain any of the values in the field.\nin FilterOperatorIn Matches objects if the field is one of several possible values, as specified in the values array.\nnot_in FilterOperatorNotIn Matches objects if the field is none of several possible values, as specified in the values array.\nand FilterOperatorAnd Matches objects only if all subfilters match.\nor FilterOperatorOr Matches objects if any subfilter matches.\ntime_is_after FilterOperatorTimeIsAfter Matches objects if the field is after the given time.\ntime_is_before FilterOperatorTimeIsBefore Matches objects if the field is before the given time.\ntime_range FilterOperatorTimeRange Matches objects if the field is between the given times.\nstring_contains FilterOperatorStringContains Matches objects if the field contains the given string.\nstring_does_not_contain FilterOperatorStringDoesNotContain Matches objects if the field does not contain the given string.\nis_set FilterOperatorIsSet FilterOperatorIsSet matches objects if the field is set.\nis_unset FilterOperatorIsUnset FilterOperatorIsUnset matches objects if the field is unset.", "x-go-name": "Operator"}, "subfilters": {"description": "Sub-filters for this filter. Valid only when operator is "and" or "or".\n\nThe maximum allowed depth for a tree of filters is 3.", "items": {"$ref": "#/components/schemas/Filter", "has_circular_reference": true}, "type": "array", "x-go-name": "Subfilters"}, "value": {"description": "The value for this filter. Only used for single-valued operators\n\n("equals", "not_equals", "contains", "does_not_contain")", "type": "string", "x-go-name": "Value"}, "values": {"description": "The values for this filter. Only used for multi-valued operators ("in", "not_in").", "items": {"type": "string"}, "type": "array", "x-go-name": "Values"}}, "required": ["field", "operator"], "type": "object", "x-go-package": "pylon/api/apiserver/apitypes"}, "visibility": {"description": "The visibility setting of the article.\n\n* public KnowledgeBaseArticleVisibilityPublic\n\n* customer KnowledgeBaseArticleVisibilityCustomer\n\n* internal_only KnowledgeBaseArticleVisibilityInternalOnly", "enum": ["public", "customer", "internal_only"], "type": "string", "x-go-enum-desc": "public KnowledgeBaseArticleVisibilityPublic\ncustomer KnowledgeBaseArticleVisibilityCustomer\ninternal_only KnowledgeBaseArticleVisibilityInternalOnly", "x-go-name": "Visibility"}}, "type": "object", "x-go-package": "pylon/api/apiserver/apitypes"}}, "required": ["author_user_id", "body_html", "title"], "type": "object", "x-go-package": "pylon/api/apiserver/endpoints"}', # noqa: E501 + "UPDATEARTICLE": '{"properties": {"body_html": {"description": "The HTML body of the article.", "type": "string", "x-go-name": "BodyHTML"}, "language": {"description": "The language code of the translation to update. If not provided, the default language (original article) will be updated.", "type": "string", "x-go-name": "Language"}, "publish_updated_body_html": {"description": "Whether the changes to the article should be published. Defaults to false.", "type": "boolean", "x-go-name": "PublishUpdatedBodyHTML"}, "title": {"description": "The title of the article.", "type": "string", "x-go-name": "Title"}, "visibility_config": {"properties": {"ai_agent_access": {"description": "AI agent access control for the article. Defaults to inherit from the parent scope when omitted.\n\n* inherit KnowledgeBaseArticleAIAgentAccessInherit Defers the access check to the parent object (Collection or KnowledgeBase).\n\n* none KnowledgeBaseArticleAIAgentAccessNone No AI agents have access to this article.\n\n* specific_agents KnowledgeBaseArticleAIAgentAccessSpecificAgents Only specific AI agents enumerated in the allowlist have access.", "enum": ["inherit", "none", "specific_agents"], "type": "string", "x-go-enum-desc": "inherit KnowledgeBaseArticleAIAgentAccessInherit Defers the access check to the parent object (Collection or KnowledgeBase).\nnone KnowledgeBaseArticleAIAgentAccessNone No AI agents have access to this article.\nspecific_agents KnowledgeBaseArticleAIAgentAccessSpecificAgents Only specific AI agents enumerated in the allowlist have access.", "x-go-name": "AiAgentAccess"}, "allowed_agent_ids": {"description": "List of AI agent IDs that may access this article when ai_agent_access is set to "specific_agents".", "items": {"type": "string"}, "type": "array", "x-go-name": "AllowedAgentIDs"}, "customer_visibility_condition": {"properties": {"field": {"description": "The field for this filter. For allowed fields, see the documentation for\n\nthe specific endpoint you are using.\n\nFor non-compound filters (any operators other than "and" or "or"),\n\nField must be set, along with either Value or Values, depending on the operator.", "type": "string", "x-go-name": "Field"}, "operator": {"description": "The operator for this filter.\n\n* equals FilterOperatorEquals Matches objects that are exactly equal to the value in the field.\n\n* not_equals FilterOperatorNotEquals Matches objects that are not exactly equal to the value in the field.\n\n* contains FilterOperatorContains For a multi-valued field, such as tags, this operator will match objects that contain any of the values in the field.\n\n* does_not_contain FilterOperatorDoesNotContain For a multi-valued field, such as tags, this operator will match objects that do not contain any of the values in the field.\n\n* in FilterOperatorIn Matches objects if the field is one of several possible values, as specified in the values array.\n\n* not_in FilterOperatorNotIn Matches objects if the field is none of several possible values, as specified in the values array.\n\n* and FilterOperatorAnd Matches objects only if all subfilters match.\n\n* or FilterOperatorOr Matches objects if any subfilter matches.\n\n* time_is_after FilterOperatorTimeIsAfter Matches objects if the field is after the given time.\n\n* time_is_before FilterOperatorTimeIsBefore Matches objects if the field is before the given time.\n\n* time_range FilterOperatorTimeRange Matches objects if the field is between the given times.\n\n* string_contains FilterOperatorStringContains Matches objects if the field contains the given string.\n\n* string_does_not_contain FilterOperatorStringDoesNotContain Matches objects if the field does not contain the given string.\n\n* is_set FilterOperatorIsSet FilterOperatorIsSet matches objects if the field is set.\n\n* is_unset FilterOperatorIsUnset FilterOperatorIsUnset matches objects if the field is unset.", "enum": ["equals", "not_equals", "contains", "does_not_contain", "in", "not_in", "and", "or", "time_is_after", "time_is_before", "time_range", "string_contains", "string_does_not_contain", "is_set", "is_unset"], "type": "string", "x-go-enum-desc": "equals FilterOperatorEquals Matches objects that are exactly equal to the value in the field.\nnot_equals FilterOperatorNotEquals Matches objects that are not exactly equal to the value in the field.\ncontains FilterOperatorContains For a multi-valued field, such as tags, this operator will match objects that contain any of the values in the field.\ndoes_not_contain FilterOperatorDoesNotContain For a multi-valued field, such as tags, this operator will match objects that do not contain any of the values in the field.\nin FilterOperatorIn Matches objects if the field is one of several possible values, as specified in the values array.\nnot_in FilterOperatorNotIn Matches objects if the field is none of several possible values, as specified in the values array.\nand FilterOperatorAnd Matches objects only if all subfilters match.\nor FilterOperatorOr Matches objects if any subfilter matches.\ntime_is_after FilterOperatorTimeIsAfter Matches objects if the field is after the given time.\ntime_is_before FilterOperatorTimeIsBefore Matches objects if the field is before the given time.\ntime_range FilterOperatorTimeRange Matches objects if the field is between the given times.\nstring_contains FilterOperatorStringContains Matches objects if the field contains the given string.\nstring_does_not_contain FilterOperatorStringDoesNotContain Matches objects if the field does not contain the given string.\nis_set FilterOperatorIsSet FilterOperatorIsSet matches objects if the field is set.\nis_unset FilterOperatorIsUnset FilterOperatorIsUnset matches objects if the field is unset.", "x-go-name": "Operator"}, "subfilters": {"description": "Sub-filters for this filter. Valid only when operator is "and" or "or".\n\nThe maximum allowed depth for a tree of filters is 3.", "items": {"$ref": "#/components/schemas/Filter", "has_circular_reference": true}, "type": "array", "x-go-name": "Subfilters"}, "value": {"description": "The value for this filter. Only used for single-valued operators\n\n("equals", "not_equals", "contains", "does_not_contain")", "type": "string", "x-go-name": "Value"}, "values": {"description": "The values for this filter. Only used for multi-valued operators ("in", "not_in").", "items": {"type": "string"}, "type": "array", "x-go-name": "Values"}}, "required": ["field", "operator"], "type": "object", "x-go-package": "pylon/api/apiserver/apitypes"}, "visibility": {"description": "The visibility setting of the article.\n\n* public KnowledgeBaseArticleVisibilityPublic\n\n* customer KnowledgeBaseArticleVisibilityCustomer\n\n* internal_only KnowledgeBaseArticleVisibilityInternalOnly", "enum": ["public", "customer", "internal_only"], "type": "string", "x-go-enum-desc": "public KnowledgeBaseArticleVisibilityPublic\ncustomer KnowledgeBaseArticleVisibilityCustomer\ninternal_only KnowledgeBaseArticleVisibilityInternalOnly", "x-go-name": "Visibility"}}, "type": "object", "x-go-package": "pylon/api/apiserver/apitypes"}}, "type": "object", "x-go-package": "pylon/api/apiserver/endpoints"}', # noqa: E501 + "CREATENEWCOLLECTION": '{"properties": {"description": {"description": "Description of the collection.", "type": "string", "x-go-name": "Description"}, "parent_collection_id": {"description": "The id of the collection associated to the article", "type": "string", "x-go-name": "ParentCollectionID"}, "slug": {"description": "The slug of the collection. Defaults to a slug based on the title.", "type": "string", "x-go-name": "Slug"}, "title": {"description": "The title of the collection.", "type": "string", "x-go-name": "Title"}}, "required": ["title"], "type": "object", "x-go-package": "pylon/api/apiserver/endpoints"}', # noqa: E501 + "CREATEROUTEREDIRECT": '{"properties": {"from_path": {"description": "The path to redirect from.", "type": "string", "x-go-name": "FromPath"}, "language": {"description": "Language of the object to redirect to. If not specified, the default language of the knowledge base will be used.", "type": "string", "x-go-name": "Language"}, "object_id": {"description": "The ID of the object to redirect to.", "type": "string", "x-go-name": "ObjectID"}, "object_type": {"description": "The type of the object to redirect to. This must be "article".", "type": "string", "x-go-name": "ObjectType"}}, "required": ["from_path", "object_id", "object_type"], "type": "object", "x-go-package": "pylon/api/apiserver/endpoints"}', # noqa: E501 + "UPDATEPROJECT": '{"properties": {"customer_portal_visible": {"description": "Customer portal visible for this project", "type": "boolean", "x-go-name": "CustomerPortalVisible"}, "description_html": {"description": "Description HTML for this project", "type": "string", "x-go-name": "DescriptionHTML"}, "end_date": {"description": "End date for this project, in RFC 3339 format", "type": "string", "x-go-name": "EndDate"}, "is_archived": {"description": "Whether the project is archived", "type": "boolean", "x-go-name": "IsArchived"}, "name": {"description": "Name for this project", "type": "string", "x-go-name": "Name"}, "owner_id": {"description": "Owner ID for this project", "type": "string", "x-go-name": "OwnerID"}, "start_date": {"description": "Start date for this project, in RFC 3339 format", "type": "string", "x-go-name": "StartDate"}}, "type": "object", "x-go-package": "pylon/api/apiserver/endpoints"}', # noqa: E501 + "CREATENEWTAG": '{"properties": {"hex_color": {"description": "The hex code of the tag\'s color.", "type": "string", "x-go-name": "HexColor"}, "object_type": {"description": "The object type of the associated object. Can be "account", "issue", or "contact".", "type": "string", "x-go-name": "ObjectType"}, "value": {"description": "The tag value.", "type": "string", "x-go-name": "Value"}}, "required": ["object_type", "value"], "type": "object", "x-go-package": "pylon/api/apiserver/endpoints"}', # noqa: E501 + "SEARCHUSERSBYEMAIL": '{"properties": {"cursor": {"description": "The cursor to use for pagination.", "type": "string", "x-go-name": "Cursor"}, "filter": {"properties": {"field": {"description": "The field for this filter. For allowed fields, see the documentation for\n\nthe specific endpoint you are using.\n\nFor non-compound filters (any operators other than "and" or "or"),\n\nField must be set, along with either Value or Values, depending on the operator.", "type": "string", "x-go-name": "Field"}, "operator": {"description": "The operator for this filter.\n\n* equals FilterOperatorEquals Matches objects that are exactly equal to the value in the field.\n\n* not_equals FilterOperatorNotEquals Matches objects that are not exactly equal to the value in the field.\n\n* contains FilterOperatorContains For a multi-valued field, such as tags, this operator will match objects that contain any of the values in the field.\n\n* does_not_contain FilterOperatorDoesNotContain For a multi-valued field, such as tags, this operator will match objects that do not contain any of the values in the field.\n\n* in FilterOperatorIn Matches objects if the field is one of several possible values, as specified in the values array.\n\n* not_in FilterOperatorNotIn Matches objects if the field is none of several possible values, as specified in the values array.\n\n* and FilterOperatorAnd Matches objects only if all subfilters match.\n\n* or FilterOperatorOr Matches objects if any subfilter matches.\n\n* time_is_after FilterOperatorTimeIsAfter Matches objects if the field is after the given time.\n\n* time_is_before FilterOperatorTimeIsBefore Matches objects if the field is before the given time.\n\n* time_range FilterOperatorTimeRange Matches objects if the field is between the given times.\n\n* string_contains FilterOperatorStringContains Matches objects if the field contains the given string.\n\n* string_does_not_contain FilterOperatorStringDoesNotContain Matches objects if the field does not contain the given string.\n\n* is_set FilterOperatorIsSet FilterOperatorIsSet matches objects if the field is set.\n\n* is_unset FilterOperatorIsUnset FilterOperatorIsUnset matches objects if the field is unset.", "enum": ["equals", "not_equals", "contains", "does_not_contain", "in", "not_in", "and", "or", "time_is_after", "time_is_before", "time_range", "string_contains", "string_does_not_contain", "is_set", "is_unset"], "type": "string", "x-go-enum-desc": "equals FilterOperatorEquals Matches objects that are exactly equal to the value in the field.\nnot_equals FilterOperatorNotEquals Matches objects that are not exactly equal to the value in the field.\ncontains FilterOperatorContains For a multi-valued field, such as tags, this operator will match objects that contain any of the values in the field.\ndoes_not_contain FilterOperatorDoesNotContain For a multi-valued field, such as tags, this operator will match objects that do not contain any of the values in the field.\nin FilterOperatorIn Matches objects if the field is one of several possible values, as specified in the values array.\nnot_in FilterOperatorNotIn Matches objects if the field is none of several possible values, as specified in the values array.\nand FilterOperatorAnd Matches objects only if all subfilters match.\nor FilterOperatorOr Matches objects if any subfilter matches.\ntime_is_after FilterOperatorTimeIsAfter Matches objects if the field is after the given time.\ntime_is_before FilterOperatorTimeIsBefore Matches objects if the field is before the given time.\ntime_range FilterOperatorTimeRange Matches objects if the field is between the given times.\nstring_contains FilterOperatorStringContains Matches objects if the field contains the given string.\nstring_does_not_contain FilterOperatorStringDoesNotContain Matches objects if the field does not contain the given string.\nis_set FilterOperatorIsSet FilterOperatorIsSet matches objects if the field is set.\nis_unset FilterOperatorIsUnset FilterOperatorIsUnset matches objects if the field is unset.", "x-go-name": "Operator"}, "subfilters": {"description": "Sub-filters for this filter. Valid only when operator is "and" or "or".\n\nThe maximum allowed depth for a tree of filters is 3.", "items": {"$ref": "#/components/schemas/Filter", "has_circular_reference": true}, "type": "array", "x-go-name": "Subfilters"}, "value": {"description": "The value for this filter. Only used for single-valued operators\n\n("equals", "not_equals", "contains", "does_not_contain")", "type": "string", "x-go-name": "Value"}, "values": {"description": "The values for this filter. Only used for multi-valued operators ("in", "not_in").", "items": {"type": "string"}, "type": "array", "x-go-name": "Values"}}, "required": ["field", "operator"], "type": "object", "x-go-package": "pylon/api/apiserver/apitypes"}, "limit": {"description": "The number of users to fetch. Defaults to 100. Must be greater than 0 and less than 1000.", "format": "int64", "type": "integer", "x-go-name": "Limit"}}, "required": ["filter"], "type": "object", "x-go-package": "pylon/api/apiserver/endpoints"}', # noqa: E501 +} diff --git a/toolkits/pylon_api/pylon_api/wrapper_tools/CreateAccountActivity.json b/toolkits/pylon_api/pylon_api/wrapper_tools/CreateAccountActivity.json new file mode 100644 index 00000000..4fc91623 --- /dev/null +++ b/toolkits/pylon_api/pylon_api/wrapper_tools/CreateAccountActivity.json @@ -0,0 +1,251 @@ +{ + "name": "CreateAccountActivity", + "fully_qualified_name": "PylonApi.CreateAccountActivity@0.1.0", + "description": "Creates a new activity for a specified account.\n\nUse this tool to add a new activity to an account by providing the account's internal or external ID. It will confirm the creation of the activity.", + "toolkit": { + "name": "PylonApi", + "description": null, + "version": "0.1.0" + }, + "input": { + "parameters": [ + { + "name": "account_id_for_activity", + "required": true, + "description": "The internal or external ID of the account to create the activity for. Accepts a UUID or any string format.", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The ID or external ID of the account to create the activity for." + }, + "inferrable": true, + "http_endpoint_parameter_name": "id" + }, + { + "name": "activity_details", + "required": false, + "description": "JSON object containing details about the activity, including optional fields like body_html, contact_id, happened_at, link, link_text, slug, and user_id.", + "value_schema": { + "val_type": "json", + "inner_val_type": null, + "enum": null, + "properties": { + "body_html": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "Optional HTML content to display in the activity." + }, + "contact_id": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "Optional contact ID of the actor of the activity." + }, + "happened_at": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "Timestamp (RFC3339) of when the activity happened. Defaults to the current time if empty." + }, + "link": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "Optional link to add to the activity." + }, + "link_text": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "Optional link text to display on the activity. Defaults to \"Open link\" if not provided. Applies only if a link is provided." + }, + "slug": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The slug of the activity to create." + }, + "user_id": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "Optional user ID of the actor of the activity." + } + }, + "inner_properties": null, + "description": "" + }, + "inferrable": true, + "http_endpoint_parameter_name": "requestBody" + } + ] + }, + "output": { + "description": "Response from the API endpoint 'CreateActivity'.", + "available_modes": [ + "value", + "error", + "null" + ], + "value_schema": { + "val_type": "json", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": null + } + }, + "requirements": { + "authorization": null, + "secrets": [ + { + "key": "PYLON_SECRET_TOKEN" + } + ], + "metadata": null + }, + "deprecation_message": null, + "metadata": { + "object_type": "api_wrapper_tool", + "version": "1.1.0", + "description": "Tools that enable LLMs to interact directly with the pylon API." + }, + "http_endpoint": { + "metadata": { + "object_type": "http_endpoint", + "version": "1.2.0", + "description": "" + }, + "url": "https://api.usepylon.com/accounts/{id}/activities", + "http_method": "POST", + "headers": {}, + "parameters": [ + { + "name": "id", + "tool_parameter_name": "account_id_for_activity", + "description": "The ID or external ID of the account to create the activity for.", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The ID or external ID of the account to create the activity for." + }, + "accepted_as": "path", + "required": true, + "deprecated": false, + "default": null, + "documentation_urls": [] + }, + { + "name": "requestBody", + "tool_parameter_name": "activity_details", + "description": "", + "value_schema": { + "val_type": "json", + "inner_val_type": null, + "enum": null, + "properties": { + "body_html": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "Optional HTML content to display in the activity." + }, + "contact_id": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "Optional contact ID of the actor of the activity." + }, + "happened_at": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "Timestamp (RFC3339) of when the activity happened. Defaults to the current time if empty." + }, + "link": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "Optional link to add to the activity." + }, + "link_text": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "Optional link text to display on the activity. Defaults to \"Open link\" if not provided. Applies only if a link is provided." + }, + "slug": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The slug of the activity to create." + }, + "user_id": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "Optional user ID of the actor of the activity." + } + }, + "inner_properties": null, + "description": "" + }, + "accepted_as": "body", + "required": false, + "deprecated": false, + "default": null, + "documentation_urls": [] + } + ], + "documentation_urls": [], + "secrets": [ + { + "arcade_key": "PYLON_SECRET_TOKEN", + "parameter_name": "Authorization", + "accepted_as": "header", + "formatted_value": "Bearer {authorization}", + "description": "", + "is_auth_token": false + } + ], + "request_body_spec": "{\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"properties\": {\n \"body_html\": {\n \"description\": \"Optional HTML content to display in the activity.\",\n \"type\": \"string\",\n \"x-go-name\": \"BodyHTML\"\n },\n \"contact_id\": {\n \"description\": \"Optional contact ID of the actor of the activity.\",\n \"type\": \"string\",\n \"x-go-name\": \"ContactID\"\n },\n \"happened_at\": {\n \"description\": \"Timestamp (RFC3339) of when the activity happened. Defaults to the current time if empty.\",\n \"type\": \"string\",\n \"x-go-name\": \"HappenedAt\"\n },\n \"link\": {\n \"description\": \"Optional link to add to the activity.\",\n \"type\": \"string\",\n \"x-go-name\": \"Link\"\n },\n \"link_text\": {\n \"description\": \"Optional link text to display on the activity. Defaults to \\\"Open link\\\" if not provided. Applies only if a link is provided.\",\n \"type\": \"string\",\n \"x-go-name\": \"LinkText\"\n },\n \"slug\": {\n \"description\": \"The slug of the activity to create.\",\n \"type\": \"string\",\n \"x-go-name\": \"Slug\"\n },\n \"user_id\": {\n \"description\": \"Optional user ID of the actor of the activity.\",\n \"type\": \"string\",\n \"x-go-name\": \"UserID\"\n }\n },\n \"required\": [\n \"slug\"\n ],\n \"type\": \"object\",\n \"x-go-package\": \"pylon/api/apiserver/endpoints\"\n }\n }\n },\n \"required\": false\n}", + "use_request_body_schema_mode": true, + "validate_request_body_schema": true + } +} diff --git a/toolkits/pylon_api/pylon_api/wrapper_tools/CreateAccountHighlight.json b/toolkits/pylon_api/pylon_api/wrapper_tools/CreateAccountHighlight.json new file mode 100644 index 00000000..55dca87b --- /dev/null +++ b/toolkits/pylon_api/pylon_api/wrapper_tools/CreateAccountHighlight.json @@ -0,0 +1,171 @@ +{ + "name": "CreateAccountHighlight", + "fully_qualified_name": "PylonApi.CreateAccountHighlight@0.1.0", + "description": "Create a highlight for a specified account.\n\nThis tool is used to create a highlight for an account, using either an internal account ID in UUID format or an external ID in string format. It should be called when there is a need to add or update a highlight for an account.", + "toolkit": { + "name": "PylonApi", + "description": null, + "version": "0.1.0" + }, + "input": { + "parameters": [ + { + "name": "account_identifier", + "required": true, + "description": "The ID (UUID) or external ID (string) of the account for the highlight.", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The ID or external ID of the account that the highlight belongs to." + }, + "inferrable": true, + "http_endpoint_parameter_name": "account_id" + }, + { + "name": "highlight_details", + "required": false, + "description": "A JSON object containing 'content_html' for the highlight's HTML content, and 'expires_at' for the expiration timestamp (optional, RFC3339 format).", + "value_schema": { + "val_type": "json", + "inner_val_type": null, + "enum": null, + "properties": { + "content_html": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The HTML content for this highlight." + }, + "expires_at": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "Optional RFC3339 timestamp of when this highlight will expire." + } + }, + "inner_properties": null, + "description": "" + }, + "inferrable": true, + "http_endpoint_parameter_name": "requestBody" + } + ] + }, + "output": { + "description": "Response from the API endpoint 'CreateAccountHighlight'.", + "available_modes": [ + "value", + "error", + "null" + ], + "value_schema": { + "val_type": "json", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": null + } + }, + "requirements": { + "authorization": null, + "secrets": [ + { + "key": "PYLON_SECRET_TOKEN" + } + ], + "metadata": null + }, + "deprecation_message": null, + "metadata": { + "object_type": "api_wrapper_tool", + "version": "1.1.0", + "description": "Tools that enable LLMs to interact directly with the pylon API." + }, + "http_endpoint": { + "metadata": { + "object_type": "http_endpoint", + "version": "1.2.0", + "description": "" + }, + "url": "https://api.usepylon.com/accounts/{account_id}/highlights", + "http_method": "POST", + "headers": {}, + "parameters": [ + { + "name": "account_id", + "tool_parameter_name": "account_identifier", + "description": "The ID or external ID of the account that the highlight belongs to.", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The ID or external ID of the account that the highlight belongs to." + }, + "accepted_as": "path", + "required": true, + "deprecated": false, + "default": null, + "documentation_urls": [] + }, + { + "name": "requestBody", + "tool_parameter_name": "highlight_details", + "description": "", + "value_schema": { + "val_type": "json", + "inner_val_type": null, + "enum": null, + "properties": { + "content_html": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The HTML content for this highlight." + }, + "expires_at": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "Optional RFC3339 timestamp of when this highlight will expire." + } + }, + "inner_properties": null, + "description": "" + }, + "accepted_as": "body", + "required": false, + "deprecated": false, + "default": null, + "documentation_urls": [] + } + ], + "documentation_urls": [], + "secrets": [ + { + "arcade_key": "PYLON_SECRET_TOKEN", + "parameter_name": "Authorization", + "accepted_as": "header", + "formatted_value": "Bearer {authorization}", + "description": "", + "is_auth_token": false + } + ], + "request_body_spec": "{\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"properties\": {\n \"content_html\": {\n \"description\": \"The HTML content for this highlight.\",\n \"type\": \"string\",\n \"x-go-name\": \"ContentHTML\"\n },\n \"expires_at\": {\n \"description\": \"Optional RFC3339 timestamp of when this highlight will expire.\",\n \"type\": \"string\",\n \"x-go-name\": \"ExpiresAt\"\n }\n },\n \"required\": [\n \"content_html\"\n ],\n \"type\": \"object\",\n \"x-go-package\": \"pylon/api/apiserver/endpoints\"\n }\n }\n },\n \"required\": false\n}", + "use_request_body_schema_mode": true, + "validate_request_body_schema": true + } +} diff --git a/toolkits/pylon_api/pylon_api/wrapper_tools/CreateAiResponseForIssue.json b/toolkits/pylon_api/pylon_api/wrapper_tools/CreateAiResponseForIssue.json new file mode 100644 index 00000000..bd99352c --- /dev/null +++ b/toolkits/pylon_api/pylon_api/wrapper_tools/CreateAiResponseForIssue.json @@ -0,0 +1,171 @@ +{ + "name": "CreateAiResponseForIssue", + "fully_qualified_name": "PylonApi.CreateAiResponseForIssue@0.1.0", + "description": "Generate an AI response for a specific issue.\n\nThis tool creates an AI-generated response for a given issue by specifying the issue ID. It should be called when an automated response is required for issue resolution or documentation.", + "toolkit": { + "name": "PylonApi", + "description": null, + "version": "0.1.0" + }, + "input": { + "parameters": [ + { + "name": "issue_id", + "required": true, + "description": "The unique ID or number of the issue for which an AI response is required.", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The ID or number of the issue to create an AI response for." + }, + "inferrable": true, + "http_endpoint_parameter_name": "id" + }, + { + "name": "ai_response_request_body", + "required": false, + "description": "JSON object containing the AI agent ID and a flag to post the response as an internal note. Includes `ai_agent_id` (string) and `post_as_internal_note` (boolean).", + "value_schema": { + "val_type": "json", + "inner_val_type": null, + "enum": null, + "properties": { + "ai_agent_id": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The ID of the AI agent to use to create the AI response." + }, + "post_as_internal_note": { + "val_type": "boolean", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "Whether to post the AI response as an internal note on the issue." + } + }, + "inner_properties": null, + "description": "" + }, + "inferrable": true, + "http_endpoint_parameter_name": "requestBody" + } + ] + }, + "output": { + "description": "Response from the API endpoint 'CreateIssueAIResponse'.", + "available_modes": [ + "value", + "error", + "null" + ], + "value_schema": { + "val_type": "json", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": null + } + }, + "requirements": { + "authorization": null, + "secrets": [ + { + "key": "PYLON_SECRET_TOKEN" + } + ], + "metadata": null + }, + "deprecation_message": null, + "metadata": { + "object_type": "api_wrapper_tool", + "version": "1.1.0", + "description": "Tools that enable LLMs to interact directly with the pylon API." + }, + "http_endpoint": { + "metadata": { + "object_type": "http_endpoint", + "version": "1.2.0", + "description": "" + }, + "url": "https://api.usepylon.com/issues/{id}/ai-response", + "http_method": "POST", + "headers": {}, + "parameters": [ + { + "name": "id", + "tool_parameter_name": "issue_id", + "description": "The ID or number of the issue to create an AI response for.", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The ID or number of the issue to create an AI response for." + }, + "accepted_as": "path", + "required": true, + "deprecated": false, + "default": null, + "documentation_urls": [] + }, + { + "name": "requestBody", + "tool_parameter_name": "ai_response_request_body", + "description": "", + "value_schema": { + "val_type": "json", + "inner_val_type": null, + "enum": null, + "properties": { + "ai_agent_id": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The ID of the AI agent to use to create the AI response." + }, + "post_as_internal_note": { + "val_type": "boolean", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "Whether to post the AI response as an internal note on the issue." + } + }, + "inner_properties": null, + "description": "" + }, + "accepted_as": "body", + "required": false, + "deprecated": false, + "default": null, + "documentation_urls": [] + } + ], + "documentation_urls": [], + "secrets": [ + { + "arcade_key": "PYLON_SECRET_TOKEN", + "parameter_name": "Authorization", + "accepted_as": "header", + "formatted_value": "Bearer {authorization}", + "description": "", + "is_auth_token": false + } + ], + "request_body_spec": "{\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"properties\": {\n \"ai_agent_id\": {\n \"description\": \"The ID of the AI agent to use to create the AI response.\",\n \"type\": \"string\",\n \"x-go-name\": \"AIAgentID\"\n },\n \"post_as_internal_note\": {\n \"description\": \"Whether to post the AI response as an internal note on the issue.\",\n \"type\": \"boolean\",\n \"x-go-name\": \"PostAsInternalNote\"\n }\n },\n \"required\": [\n \"ai_agent_id\"\n ],\n \"type\": \"object\",\n \"x-go-package\": \"pylon/api/apiserver/endpoints\"\n }\n }\n },\n \"required\": false\n}", + "use_request_body_schema_mode": true, + "validate_request_body_schema": true + } +} diff --git a/toolkits/pylon_api/pylon_api/wrapper_tools/CreateCustomField.json b/toolkits/pylon_api/pylon_api/wrapper_tools/CreateCustomField.json new file mode 100644 index 00000000..d31777de --- /dev/null +++ b/toolkits/pylon_api/pylon_api/wrapper_tools/CreateCustomField.json @@ -0,0 +1,268 @@ +{ + "name": "CreateCustomField", + "fully_qualified_name": "PylonApi.CreateCustomField@0.1.0", + "description": "Create a new custom field in the system.\n\nUse this tool to add a custom field to your database or application configuration. It allows for extending the available data fields to include additional, personalized information.", + "toolkit": { + "name": "PylonApi", + "description": null, + "version": "0.1.0" + }, + "input": { + "parameters": [ + { + "name": "custom_field_details", + "required": false, + "description": "JSON object containing details such as label, type, object type, default values, and selection options for the custom field.", + "value_schema": { + "val_type": "json", + "inner_val_type": null, + "enum": null, + "properties": { + "default_value": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The default value for single-valued custom fields." + }, + "default_values": { + "val_type": "array", + "inner_val_type": "string", + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The default values for multi-valued custom fields." + }, + "description": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The description of the custom field." + }, + "label": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The label of the custom field." + }, + "object_type": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The object type of the custom field. Can be \"account\", \"issue\", or \"contact\"" + }, + "select_options": { + "val_type": "array", + "inner_val_type": "json", + "enum": null, + "properties": null, + "inner_properties": { + "label": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The label of the option." + }, + "slug": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The slug of the option." + } + }, + "description": "The list options of the select custom field. This is only present for select and multiselect custom fields." + }, + "slug": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The slug of the custom field." + }, + "type": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The type of the custom field. Can be one of `text`, `number`, `decimal`, `boolean`, `date`, `datetime`, `user`, `url`, `select`, or `multiselect`." + } + }, + "inner_properties": null, + "description": "" + }, + "inferrable": true, + "http_endpoint_parameter_name": "requestBody" + } + ] + }, + "output": { + "description": "Response from the API endpoint 'CreateCustomField'.", + "available_modes": [ + "value", + "error", + "null" + ], + "value_schema": { + "val_type": "json", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": null + } + }, + "requirements": { + "authorization": null, + "secrets": [ + { + "key": "PYLON_SECRET_TOKEN" + } + ], + "metadata": null + }, + "deprecation_message": null, + "metadata": { + "object_type": "api_wrapper_tool", + "version": "1.1.0", + "description": "Tools that enable LLMs to interact directly with the pylon API." + }, + "http_endpoint": { + "metadata": { + "object_type": "http_endpoint", + "version": "1.2.0", + "description": "" + }, + "url": "https://api.usepylon.com/custom-fields", + "http_method": "POST", + "headers": {}, + "parameters": [ + { + "name": "requestBody", + "tool_parameter_name": "custom_field_details", + "description": "", + "value_schema": { + "val_type": "json", + "inner_val_type": null, + "enum": null, + "properties": { + "default_value": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The default value for single-valued custom fields." + }, + "default_values": { + "val_type": "array", + "inner_val_type": "string", + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The default values for multi-valued custom fields." + }, + "description": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The description of the custom field." + }, + "label": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The label of the custom field." + }, + "object_type": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The object type of the custom field. Can be \"account\", \"issue\", or \"contact\"" + }, + "select_options": { + "val_type": "array", + "inner_val_type": "json", + "enum": null, + "properties": null, + "inner_properties": { + "label": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The label of the option." + }, + "slug": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The slug of the option." + } + }, + "description": "The list options of the select custom field. This is only present for select and multiselect custom fields." + }, + "slug": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The slug of the custom field." + }, + "type": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The type of the custom field. Can be one of `text`, `number`, `decimal`, `boolean`, `date`, `datetime`, `user`, `url`, `select`, or `multiselect`." + } + }, + "inner_properties": null, + "description": "" + }, + "accepted_as": "body", + "required": false, + "deprecated": false, + "default": null, + "documentation_urls": [] + } + ], + "documentation_urls": [], + "secrets": [ + { + "arcade_key": "PYLON_SECRET_TOKEN", + "parameter_name": "Authorization", + "accepted_as": "header", + "formatted_value": "Bearer {authorization}", + "description": "", + "is_auth_token": false + } + ], + "request_body_spec": "{\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"properties\": {\n \"default_value\": {\n \"description\": \"The default value for single-valued custom fields.\",\n \"type\": \"string\",\n \"x-go-name\": \"DefaultValue\"\n },\n \"default_values\": {\n \"description\": \"The default values for multi-valued custom fields.\",\n \"items\": {\n \"type\": \"string\"\n },\n \"type\": \"array\",\n \"x-go-name\": \"DefaultValues\"\n },\n \"description\": {\n \"description\": \"The description of the custom field.\",\n \"type\": \"string\",\n \"x-go-name\": \"Description\"\n },\n \"label\": {\n \"description\": \"The label of the custom field.\",\n \"type\": \"string\",\n \"x-go-name\": \"Label\"\n },\n \"object_type\": {\n \"description\": \"The object type of the custom field. Can be \\\"account\\\", \\\"issue\\\", or \\\"contact\\\"\",\n \"type\": \"string\",\n \"x-go-name\": \"ObjectType\"\n },\n \"select_options\": {\n \"description\": \"The list options of the select custom field. This is only present for select and multiselect custom fields.\",\n \"items\": {\n \"properties\": {\n \"label\": {\n \"description\": \"The label of the option.\",\n \"type\": \"string\",\n \"x-go-name\": \"Label\"\n },\n \"slug\": {\n \"description\": \"The slug of the option.\",\n \"type\": \"string\",\n \"x-go-name\": \"Slug\"\n }\n },\n \"type\": \"object\",\n \"x-go-package\": \"pylon/api/apiserver/apitypes\"\n },\n \"type\": \"array\",\n \"x-go-name\": \"SelectOptions\"\n },\n \"slug\": {\n \"description\": \"The slug of the custom field.\",\n \"type\": \"string\",\n \"x-go-name\": \"Slug\"\n },\n \"type\": {\n \"description\": \"The type of the custom field. Can be one of `text`, `number`, `decimal`, `boolean`, `date`, `datetime`, `user`, `url`, `select`, or `multiselect`.\",\n \"type\": \"string\",\n \"x-go-name\": \"Type\"\n }\n },\n \"required\": [\n \"label\",\n \"object_type\",\n \"type\"\n ],\n \"type\": \"object\",\n \"x-go-package\": \"pylon/api/apiserver/endpoints\"\n }\n }\n },\n \"required\": false\n}", + "use_request_body_schema_mode": true, + "validate_request_body_schema": true + } +} diff --git a/toolkits/pylon_api/pylon_api/wrapper_tools/CreateIssueNote.json b/toolkits/pylon_api/pylon_api/wrapper_tools/CreateIssueNote.json new file mode 100644 index 00000000..9fd79f3d --- /dev/null +++ b/toolkits/pylon_api/pylon_api/wrapper_tools/CreateIssueNote.json @@ -0,0 +1,219 @@ +{ + "name": "CreateIssueNote", + "fully_qualified_name": "PylonApi.CreateIssueNote@0.1.0", + "description": "Creates a note on an issue to track additional details.\n\nThis tool should be called when there's a need to add a note or comment to an existing issue to provide further information or updates.", + "toolkit": { + "name": "PylonApi", + "description": null, + "version": "0.1.0" + }, + "input": { + "parameters": [ + { + "name": "issue_id", + "required": true, + "description": "The unique identifier of the issue to which the note will be added.", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The ID of the issue." + }, + "inferrable": true, + "http_endpoint_parameter_name": "id" + }, + { + "name": "note_details_json", + "required": false, + "description": "The JSON object containing note details like body_html, attachment_urls, message_id, thread_id, and user_id.", + "value_schema": { + "val_type": "json", + "inner_val_type": null, + "enum": null, + "properties": { + "attachment_urls": { + "val_type": "array", + "inner_val_type": "string", + "enum": null, + "properties": null, + "inner_properties": null, + "description": "An array of attachment URLs to attach to this issue." + }, + "body_html": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The body of the message in HTML." + }, + "message_id": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The ID of the message to reply to. This message must be an internal note. You can find this from the GET /issues/{id}/messages endpoint. Either this or thread_id must be provided." + }, + "thread_id": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The ID of the thread to post the note to. You can find this from the GET /issues/{id}/threads endpoint. Either this or message_id must be provided." + }, + "user_id": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "Optional user ID to post the message as. If not provided, the API token user will be used." + } + }, + "inner_properties": null, + "description": "" + }, + "inferrable": true, + "http_endpoint_parameter_name": "requestBody" + } + ] + }, + "output": { + "description": "Response from the API endpoint 'CreateIssueNote'.", + "available_modes": [ + "value", + "error", + "null" + ], + "value_schema": { + "val_type": "json", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": null + } + }, + "requirements": { + "authorization": null, + "secrets": [ + { + "key": "PYLON_SECRET_TOKEN" + } + ], + "metadata": null + }, + "deprecation_message": null, + "metadata": { + "object_type": "api_wrapper_tool", + "version": "1.1.0", + "description": "Tools that enable LLMs to interact directly with the pylon API." + }, + "http_endpoint": { + "metadata": { + "object_type": "http_endpoint", + "version": "1.2.0", + "description": "" + }, + "url": "https://api.usepylon.com/issues/{id}/note", + "http_method": "POST", + "headers": {}, + "parameters": [ + { + "name": "id", + "tool_parameter_name": "issue_id", + "description": "The ID of the issue.", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The ID of the issue." + }, + "accepted_as": "path", + "required": true, + "deprecated": false, + "default": null, + "documentation_urls": [] + }, + { + "name": "requestBody", + "tool_parameter_name": "note_details_json", + "description": "", + "value_schema": { + "val_type": "json", + "inner_val_type": null, + "enum": null, + "properties": { + "attachment_urls": { + "val_type": "array", + "inner_val_type": "string", + "enum": null, + "properties": null, + "inner_properties": null, + "description": "An array of attachment URLs to attach to this issue." + }, + "body_html": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The body of the message in HTML." + }, + "message_id": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The ID of the message to reply to. This message must be an internal note. You can find this from the GET /issues/{id}/messages endpoint. Either this or thread_id must be provided." + }, + "thread_id": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The ID of the thread to post the note to. You can find this from the GET /issues/{id}/threads endpoint. Either this or message_id must be provided." + }, + "user_id": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "Optional user ID to post the message as. If not provided, the API token user will be used." + } + }, + "inner_properties": null, + "description": "" + }, + "accepted_as": "body", + "required": false, + "deprecated": false, + "default": null, + "documentation_urls": [] + } + ], + "documentation_urls": [], + "secrets": [ + { + "arcade_key": "PYLON_SECRET_TOKEN", + "parameter_name": "Authorization", + "accepted_as": "header", + "formatted_value": "Bearer {authorization}", + "description": "", + "is_auth_token": false + } + ], + "request_body_spec": "{\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"properties\": {\n \"attachment_urls\": {\n \"description\": \"An array of attachment URLs to attach to this issue.\",\n \"items\": {\n \"type\": \"string\"\n },\n \"type\": \"array\",\n \"x-go-name\": \"AttachmentURLs\"\n },\n \"body_html\": {\n \"description\": \"The body of the message in HTML.\",\n \"type\": \"string\",\n \"x-go-name\": \"BodyHTML\"\n },\n \"message_id\": {\n \"description\": \"The ID of the message to reply to. This message must be an internal note. You can find this from the GET /issues/{id}/messages endpoint. Either this or thread_id must be provided.\",\n \"type\": \"string\",\n \"x-go-name\": \"MessageID\"\n },\n \"thread_id\": {\n \"description\": \"The ID of the thread to post the note to. You can find this from the GET /issues/{id}/threads endpoint. Either this or message_id must be provided.\",\n \"type\": \"string\",\n \"x-go-name\": \"ThreadID\"\n },\n \"user_id\": {\n \"description\": \"Optional user ID to post the message as. If not provided, the API token user will be used.\",\n \"type\": \"string\",\n \"x-go-name\": \"UserID\"\n }\n },\n \"required\": [\n \"body_html\"\n ],\n \"type\": \"object\",\n \"x-go-package\": \"pylon/api/apiserver/endpoints\"\n }\n }\n },\n \"required\": false\n}", + "use_request_body_schema_mode": true, + "validate_request_body_schema": true + } +} diff --git a/toolkits/pylon_api/pylon_api/wrapper_tools/CreateIssueReply.json b/toolkits/pylon_api/pylon_api/wrapper_tools/CreateIssueReply.json new file mode 100644 index 00000000..45662b0c --- /dev/null +++ b/toolkits/pylon_api/pylon_api/wrapper_tools/CreateIssueReply.json @@ -0,0 +1,285 @@ +{ + "name": "CreateIssueReply", + "fully_qualified_name": "PylonApi.CreateIssueReply@0.1.0", + "description": "Create a reply to an existing issue.\n\nUse this tool to add a comment or response to an existing issue when interaction or follow-up is required.", + "toolkit": { + "name": "PylonApi", + "description": null, + "version": "0.1.0" + }, + "input": { + "parameters": [ + { + "name": "issue_id", + "required": true, + "description": "The unique identifier of the issue to which you want to reply.", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The ID of the issue." + }, + "inferrable": true, + "http_endpoint_parameter_name": "id" + }, + { + "name": "issue_reply_details", + "required": false, + "description": "JSON object containing details like body_html, attachment URLs, and optional user or contact IDs for posting the reply. Also includes email information for cc, bcc, and to fields.", + "value_schema": { + "val_type": "json", + "inner_val_type": null, + "enum": null, + "properties": { + "attachment_urls": { + "val_type": "array", + "inner_val_type": "string", + "enum": null, + "properties": null, + "inner_properties": null, + "description": "An array of attachment URLs to attach to this issue." + }, + "body_html": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The body of the message in HTML." + }, + "contact_id": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "Optional contact ID to post the message as. Only one of user_id or contact_id can be provided." + }, + "email_info": { + "val_type": "json", + "inner_val_type": null, + "enum": null, + "properties": { + "bcc_emails": { + "val_type": "array", + "inner_val_type": "string", + "enum": null, + "properties": null, + "inner_properties": null, + "description": null + }, + "cc_emails": { + "val_type": "array", + "inner_val_type": "string", + "enum": null, + "properties": null, + "inner_properties": null, + "description": null + }, + "to_emails": { + "val_type": "array", + "inner_val_type": "string", + "enum": null, + "properties": null, + "inner_properties": null, + "description": null + } + }, + "inner_properties": null, + "description": null + }, + "message_id": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The ID of the message to reply to." + }, + "user_id": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "Optional user ID to post the message as. Only one of user_id or contact_id can be provided." + } + }, + "inner_properties": null, + "description": "" + }, + "inferrable": true, + "http_endpoint_parameter_name": "requestBody" + } + ] + }, + "output": { + "description": "Response from the API endpoint 'CreateIssueReply'.", + "available_modes": [ + "value", + "error", + "null" + ], + "value_schema": { + "val_type": "json", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": null + } + }, + "requirements": { + "authorization": null, + "secrets": [ + { + "key": "PYLON_SECRET_TOKEN" + } + ], + "metadata": null + }, + "deprecation_message": null, + "metadata": { + "object_type": "api_wrapper_tool", + "version": "1.1.0", + "description": "Tools that enable LLMs to interact directly with the pylon API." + }, + "http_endpoint": { + "metadata": { + "object_type": "http_endpoint", + "version": "1.2.0", + "description": "" + }, + "url": "https://api.usepylon.com/issues/{id}/reply", + "http_method": "POST", + "headers": {}, + "parameters": [ + { + "name": "id", + "tool_parameter_name": "issue_id", + "description": "The ID of the issue.", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The ID of the issue." + }, + "accepted_as": "path", + "required": true, + "deprecated": false, + "default": null, + "documentation_urls": [] + }, + { + "name": "requestBody", + "tool_parameter_name": "issue_reply_details", + "description": "", + "value_schema": { + "val_type": "json", + "inner_val_type": null, + "enum": null, + "properties": { + "attachment_urls": { + "val_type": "array", + "inner_val_type": "string", + "enum": null, + "properties": null, + "inner_properties": null, + "description": "An array of attachment URLs to attach to this issue." + }, + "body_html": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The body of the message in HTML." + }, + "contact_id": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "Optional contact ID to post the message as. Only one of user_id or contact_id can be provided." + }, + "email_info": { + "val_type": "json", + "inner_val_type": null, + "enum": null, + "properties": { + "bcc_emails": { + "val_type": "array", + "inner_val_type": "string", + "enum": null, + "properties": null, + "inner_properties": null, + "description": null + }, + "cc_emails": { + "val_type": "array", + "inner_val_type": "string", + "enum": null, + "properties": null, + "inner_properties": null, + "description": null + }, + "to_emails": { + "val_type": "array", + "inner_val_type": "string", + "enum": null, + "properties": null, + "inner_properties": null, + "description": null + } + }, + "inner_properties": null, + "description": null + }, + "message_id": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The ID of the message to reply to." + }, + "user_id": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "Optional user ID to post the message as. Only one of user_id or contact_id can be provided." + } + }, + "inner_properties": null, + "description": "" + }, + "accepted_as": "body", + "required": false, + "deprecated": false, + "default": null, + "documentation_urls": [] + } + ], + "documentation_urls": [], + "secrets": [ + { + "arcade_key": "PYLON_SECRET_TOKEN", + "parameter_name": "Authorization", + "accepted_as": "header", + "formatted_value": "Bearer {authorization}", + "description": "", + "is_auth_token": false + } + ], + "request_body_spec": "{\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"properties\": {\n \"attachment_urls\": {\n \"description\": \"An array of attachment URLs to attach to this issue.\",\n \"items\": {\n \"type\": \"string\"\n },\n \"type\": \"array\",\n \"x-go-name\": \"AttachmentURLs\"\n },\n \"body_html\": {\n \"description\": \"The body of the message in HTML.\",\n \"type\": \"string\",\n \"x-go-name\": \"BodyHTML\"\n },\n \"contact_id\": {\n \"description\": \"Optional contact ID to post the message as. Only one of user_id or contact_id can be provided.\",\n \"type\": \"string\",\n \"x-go-name\": \"ContactID\"\n },\n \"email_info\": {\n \"properties\": {\n \"bcc_emails\": {\n \"items\": {\n \"type\": \"string\"\n },\n \"type\": \"array\",\n \"x-go-name\": \"BccEmails\"\n },\n \"cc_emails\": {\n \"items\": {\n \"type\": \"string\"\n },\n \"type\": \"array\",\n \"x-go-name\": \"CcEmails\"\n },\n \"to_emails\": {\n \"items\": {\n \"type\": \"string\"\n },\n \"type\": \"array\",\n \"x-go-name\": \"ToEmails\"\n }\n },\n \"type\": \"object\",\n \"x-go-package\": \"pylon/api/apiserver/endpoints\"\n },\n \"message_id\": {\n \"description\": \"The ID of the message to reply to.\",\n \"type\": \"string\",\n \"x-go-name\": \"MessageID\"\n },\n \"user_id\": {\n \"description\": \"Optional user ID to post the message as. Only one of user_id or contact_id can be provided.\",\n \"type\": \"string\",\n \"x-go-name\": \"UserID\"\n }\n },\n \"required\": [\n \"body_html\",\n \"message_id\"\n ],\n \"type\": \"object\",\n \"x-go-package\": \"pylon/api/apiserver/endpoints\"\n }\n }\n },\n \"required\": false\n}", + "use_request_body_schema_mode": true, + "validate_request_body_schema": true + } +} diff --git a/toolkits/pylon_api/pylon_api/wrapper_tools/CreateIssueThread.json b/toolkits/pylon_api/pylon_api/wrapper_tools/CreateIssueThread.json new file mode 100644 index 00000000..87a34302 --- /dev/null +++ b/toolkits/pylon_api/pylon_api/wrapper_tools/CreateIssueThread.json @@ -0,0 +1,137 @@ +{ + "name": "CreateIssueThread", + "fully_qualified_name": "PylonApi.CreateIssueThread@0.1.0", + "description": "Create an issue thread for an existing issue.\n\nUse this tool to initiate a discussion thread related to a specific issue by providing the issue ID. This helps in organizing conversations around particular issues efficiently.", + "toolkit": { + "name": "PylonApi", + "description": null, + "version": "0.1.0" + }, + "input": { + "parameters": [ + { + "name": "issue_id", + "required": true, + "description": "The ID for the issue you want to create a thread for. Required to link the thread to the correct issue.", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The ID of the issue to create a thread for." + }, + "inferrable": true, + "http_endpoint_parameter_name": "id" + }, + { + "name": "thread_name", + "required": false, + "description": "The title or name of the thread to be created. This should be descriptive of the discussion purpose.", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The name of the thread." + }, + "inferrable": true, + "http_endpoint_parameter_name": "name" + } + ] + }, + "output": { + "description": "Response from the API endpoint 'CreateIssueThread'.", + "available_modes": [ + "value", + "error", + "null" + ], + "value_schema": { + "val_type": "json", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": null + } + }, + "requirements": { + "authorization": null, + "secrets": [ + { + "key": "PYLON_SECRET_TOKEN" + } + ], + "metadata": null + }, + "deprecation_message": null, + "metadata": { + "object_type": "api_wrapper_tool", + "version": "1.1.0", + "description": "Tools that enable LLMs to interact directly with the pylon API." + }, + "http_endpoint": { + "metadata": { + "object_type": "http_endpoint", + "version": "1.2.0", + "description": "" + }, + "url": "https://api.usepylon.com/issues/{id}/threads", + "http_method": "POST", + "headers": {}, + "parameters": [ + { + "name": "id", + "tool_parameter_name": "issue_id", + "description": "The ID of the issue to create a thread for.", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The ID of the issue to create a thread for." + }, + "accepted_as": "path", + "required": true, + "deprecated": false, + "default": null, + "documentation_urls": [] + }, + { + "name": "name", + "tool_parameter_name": "thread_name", + "description": "The name of the thread.", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The name of the thread." + }, + "accepted_as": "body", + "required": false, + "deprecated": false, + "default": null, + "documentation_urls": [] + } + ], + "documentation_urls": [], + "secrets": [ + { + "arcade_key": "PYLON_SECRET_TOKEN", + "parameter_name": "Authorization", + "accepted_as": "header", + "formatted_value": "Bearer {authorization}", + "description": "", + "is_auth_token": false + } + ], + "request_body_spec": "{\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"properties\": {\n \"name\": {\n \"description\": \"The name of the thread.\",\n \"type\": \"string\",\n \"x-go-name\": \"Name\"\n }\n },\n \"type\": \"object\",\n \"x-go-package\": \"pylon/api/apiserver/endpoints\"\n }\n }\n },\n \"required\": false\n}", + "use_request_body_schema_mode": false, + "validate_request_body_schema": false + } +} diff --git a/toolkits/pylon_api/pylon_api/wrapper_tools/CreateKnowledgeBaseArticle.json b/toolkits/pylon_api/pylon_api/wrapper_tools/CreateKnowledgeBaseArticle.json new file mode 100644 index 00000000..08c4743e --- /dev/null +++ b/toolkits/pylon_api/pylon_api/wrapper_tools/CreateKnowledgeBaseArticle.json @@ -0,0 +1,529 @@ +{ + "name": "CreateKnowledgeBaseArticle", + "fully_qualified_name": "PylonApi.CreateKnowledgeBaseArticle@0.1.0", + "description": "Create and publish an article in a knowledge base.\n\nThis tool allows the creation of a new article in a specified knowledge base, including optional translations. If the article is set to publish, translations will also be published.", + "toolkit": { + "name": "PylonApi", + "description": null, + "version": "0.1.0" + }, + "input": { + "parameters": [ + { + "name": "knowledge_base_id", + "required": true, + "description": "The unique identifier for the knowledge base where the article will be added.", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The ID of the knowledge base the article is being added to." + }, + "inferrable": true, + "http_endpoint_parameter_name": "id" + }, + { + "name": "article_details", + "required": false, + "description": "JSON object containing details of the article such as author ID, HTML body, title, and any translations. Includes configuration for publication, visibility, and access.", + "value_schema": { + "val_type": "json", + "inner_val_type": null, + "enum": null, + "properties": { + "author_user_id": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The ID of the user attributed as the author of the article." + }, + "body_html": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The HTML body of the article." + }, + "collection_id": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The id of the collection associated to the article" + }, + "is_published": { + "val_type": "boolean", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "Whether the article should be published. Defaults to false." + }, + "is_unlisted": { + "val_type": "boolean", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "Whether the article can only be accessible only via direct link. Defaults to false." + }, + "slug": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The slug of the article. Defaults to a slug based on the title." + }, + "title": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The title of the article." + }, + "translations": { + "val_type": "array", + "inner_val_type": "json", + "enum": null, + "properties": null, + "inner_properties": { + "body_html": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The translated HTML body of the article." + }, + "language": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The language code of the translation. Supported language codes can be found in https://docs.usepylon.com/pylon-docs/knowledge-base/translation#supported-language-codes." + }, + "title": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The translated title of the article." + } + }, + "description": "Translations of the article content in different languages" + }, + "visibility_config": { + "val_type": "json", + "inner_val_type": null, + "enum": null, + "properties": { + "ai_agent_access": { + "val_type": "string", + "inner_val_type": null, + "enum": [ + "inherit", + "none", + "specific_agents" + ], + "properties": null, + "inner_properties": null, + "description": "AI agent access control for the article. Defaults to inherit from the parent scope when omitted.\n\n* inherit KnowledgeBaseArticleAIAgentAccessInherit Defers the access check to the parent object (Collection or KnowledgeBase).\n\n* none KnowledgeBaseArticleAIAgentAccessNone No AI agents have access to this article.\n\n* specific_agents KnowledgeBaseArticleAIAgentAccessSpecificAgents Only specific AI agents enumerated in the allowlist have access." + }, + "allowed_agent_ids": { + "val_type": "array", + "inner_val_type": "string", + "enum": null, + "properties": null, + "inner_properties": null, + "description": "List of AI agent IDs that may access this article when ai_agent_access is set to \"specific_agents\"." + }, + "customer_visibility_condition": { + "val_type": "json", + "inner_val_type": null, + "enum": null, + "properties": { + "field": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The field for this filter. For allowed fields, see the documentation for\n\nthe specific endpoint you are using.\n\nFor non-compound filters (any operators other than \"and\" or \"or\"),\n\nField must be set, along with either Value or Values, depending on the operator." + }, + "operator": { + "val_type": "string", + "inner_val_type": null, + "enum": [ + "equals", + "not_equals", + "contains", + "does_not_contain", + "in", + "not_in", + "and", + "or", + "time_is_after", + "time_is_before", + "time_range", + "string_contains", + "string_does_not_contain", + "is_set", + "is_unset" + ], + "properties": null, + "inner_properties": null, + "description": "The operator for this filter.\n\n* equals FilterOperatorEquals Matches objects that are exactly equal to the value in the field.\n\n* not_equals FilterOperatorNotEquals Matches objects that are not exactly equal to the value in the field.\n\n* contains FilterOperatorContains For a multi-valued field, such as tags, this operator will match objects that contain any of the values in the field.\n\n* does_not_contain FilterOperatorDoesNotContain For a multi-valued field, such as tags, this operator will match objects that do not contain any of the values in the field.\n\n* in FilterOperatorIn Matches objects if the field is one of several possible values, as specified in the values array.\n\n* not_in FilterOperatorNotIn Matches objects if the field is none of several possible values, as specified in the values array.\n\n* and FilterOperatorAnd Matches objects only if all subfilters match.\n\n* or FilterOperatorOr Matches objects if any subfilter matches.\n\n* time_is_after FilterOperatorTimeIsAfter Matches objects if the field is after the given time.\n\n* time_is_before FilterOperatorTimeIsBefore Matches objects if the field is before the given time.\n\n* time_range FilterOperatorTimeRange Matches objects if the field is between the given times.\n\n* string_contains FilterOperatorStringContains Matches objects if the field contains the given string.\n\n* string_does_not_contain FilterOperatorStringDoesNotContain Matches objects if the field does not contain the given string.\n\n* is_set FilterOperatorIsSet FilterOperatorIsSet matches objects if the field is set.\n\n* is_unset FilterOperatorIsUnset FilterOperatorIsUnset matches objects if the field is unset." + }, + "subfilters": { + "val_type": "array", + "inner_val_type": "json", + "enum": null, + "properties": null, + "inner_properties": {}, + "description": "Sub-filters for this filter. Valid only when operator is \"and\" or \"or\".\n\nThe maximum allowed depth for a tree of filters is 3." + }, + "value": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The value for this filter. Only used for single-valued operators\n\n(\"equals\", \"not_equals\", \"contains\", \"does_not_contain\")" + }, + "values": { + "val_type": "array", + "inner_val_type": "string", + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The values for this filter. Only used for multi-valued operators (\"in\", \"not_in\")." + } + }, + "inner_properties": null, + "description": null + }, + "visibility": { + "val_type": "string", + "inner_val_type": null, + "enum": [ + "public", + "customer", + "internal_only" + ], + "properties": null, + "inner_properties": null, + "description": "The visibility setting of the article.\n\n* public KnowledgeBaseArticleVisibilityPublic\n\n* customer KnowledgeBaseArticleVisibilityCustomer\n\n* internal_only KnowledgeBaseArticleVisibilityInternalOnly" + } + }, + "inner_properties": null, + "description": null + } + }, + "inner_properties": null, + "description": "" + }, + "inferrable": true, + "http_endpoint_parameter_name": "requestBody" + } + ] + }, + "output": { + "description": "Response from the API endpoint 'CreateArticle'.", + "available_modes": [ + "value", + "error", + "null" + ], + "value_schema": { + "val_type": "json", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": null + } + }, + "requirements": { + "authorization": null, + "secrets": [ + { + "key": "PYLON_SECRET_TOKEN" + } + ], + "metadata": null + }, + "deprecation_message": null, + "metadata": { + "object_type": "api_wrapper_tool", + "version": "1.1.0", + "description": "Tools that enable LLMs to interact directly with the pylon API." + }, + "http_endpoint": { + "metadata": { + "object_type": "http_endpoint", + "version": "1.2.0", + "description": "" + }, + "url": "https://api.usepylon.com/knowledge-bases/{id}/articles", + "http_method": "POST", + "headers": {}, + "parameters": [ + { + "name": "id", + "tool_parameter_name": "knowledge_base_id", + "description": "The ID of the knowledge base the article is being added to.", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The ID of the knowledge base the article is being added to." + }, + "accepted_as": "path", + "required": true, + "deprecated": false, + "default": null, + "documentation_urls": [] + }, + { + "name": "requestBody", + "tool_parameter_name": "article_details", + "description": "", + "value_schema": { + "val_type": "json", + "inner_val_type": null, + "enum": null, + "properties": { + "author_user_id": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The ID of the user attributed as the author of the article." + }, + "body_html": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The HTML body of the article." + }, + "collection_id": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The id of the collection associated to the article" + }, + "is_published": { + "val_type": "boolean", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "Whether the article should be published. Defaults to false." + }, + "is_unlisted": { + "val_type": "boolean", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "Whether the article can only be accessible only via direct link. Defaults to false." + }, + "slug": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The slug of the article. Defaults to a slug based on the title." + }, + "title": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The title of the article." + }, + "translations": { + "val_type": "array", + "inner_val_type": "json", + "enum": null, + "properties": null, + "inner_properties": { + "body_html": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The translated HTML body of the article." + }, + "language": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The language code of the translation. Supported language codes can be found in https://docs.usepylon.com/pylon-docs/knowledge-base/translation#supported-language-codes." + }, + "title": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The translated title of the article." + } + }, + "description": "Translations of the article content in different languages" + }, + "visibility_config": { + "val_type": "json", + "inner_val_type": null, + "enum": null, + "properties": { + "ai_agent_access": { + "val_type": "string", + "inner_val_type": null, + "enum": [ + "inherit", + "none", + "specific_agents" + ], + "properties": null, + "inner_properties": null, + "description": "AI agent access control for the article. Defaults to inherit from the parent scope when omitted.\n\n* inherit KnowledgeBaseArticleAIAgentAccessInherit Defers the access check to the parent object (Collection or KnowledgeBase).\n\n* none KnowledgeBaseArticleAIAgentAccessNone No AI agents have access to this article.\n\n* specific_agents KnowledgeBaseArticleAIAgentAccessSpecificAgents Only specific AI agents enumerated in the allowlist have access." + }, + "allowed_agent_ids": { + "val_type": "array", + "inner_val_type": "string", + "enum": null, + "properties": null, + "inner_properties": null, + "description": "List of AI agent IDs that may access this article when ai_agent_access is set to \"specific_agents\"." + }, + "customer_visibility_condition": { + "val_type": "json", + "inner_val_type": null, + "enum": null, + "properties": { + "field": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The field for this filter. For allowed fields, see the documentation for\n\nthe specific endpoint you are using.\n\nFor non-compound filters (any operators other than \"and\" or \"or\"),\n\nField must be set, along with either Value or Values, depending on the operator." + }, + "operator": { + "val_type": "string", + "inner_val_type": null, + "enum": [ + "equals", + "not_equals", + "contains", + "does_not_contain", + "in", + "not_in", + "and", + "or", + "time_is_after", + "time_is_before", + "time_range", + "string_contains", + "string_does_not_contain", + "is_set", + "is_unset" + ], + "properties": null, + "inner_properties": null, + "description": "The operator for this filter.\n\n* equals FilterOperatorEquals Matches objects that are exactly equal to the value in the field.\n\n* not_equals FilterOperatorNotEquals Matches objects that are not exactly equal to the value in the field.\n\n* contains FilterOperatorContains For a multi-valued field, such as tags, this operator will match objects that contain any of the values in the field.\n\n* does_not_contain FilterOperatorDoesNotContain For a multi-valued field, such as tags, this operator will match objects that do not contain any of the values in the field.\n\n* in FilterOperatorIn Matches objects if the field is one of several possible values, as specified in the values array.\n\n* not_in FilterOperatorNotIn Matches objects if the field is none of several possible values, as specified in the values array.\n\n* and FilterOperatorAnd Matches objects only if all subfilters match.\n\n* or FilterOperatorOr Matches objects if any subfilter matches.\n\n* time_is_after FilterOperatorTimeIsAfter Matches objects if the field is after the given time.\n\n* time_is_before FilterOperatorTimeIsBefore Matches objects if the field is before the given time.\n\n* time_range FilterOperatorTimeRange Matches objects if the field is between the given times.\n\n* string_contains FilterOperatorStringContains Matches objects if the field contains the given string.\n\n* string_does_not_contain FilterOperatorStringDoesNotContain Matches objects if the field does not contain the given string.\n\n* is_set FilterOperatorIsSet FilterOperatorIsSet matches objects if the field is set.\n\n* is_unset FilterOperatorIsUnset FilterOperatorIsUnset matches objects if the field is unset." + }, + "subfilters": { + "val_type": "array", + "inner_val_type": "json", + "enum": null, + "properties": null, + "inner_properties": {}, + "description": "Sub-filters for this filter. Valid only when operator is \"and\" or \"or\".\n\nThe maximum allowed depth for a tree of filters is 3." + }, + "value": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The value for this filter. Only used for single-valued operators\n\n(\"equals\", \"not_equals\", \"contains\", \"does_not_contain\")" + }, + "values": { + "val_type": "array", + "inner_val_type": "string", + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The values for this filter. Only used for multi-valued operators (\"in\", \"not_in\")." + } + }, + "inner_properties": null, + "description": null + }, + "visibility": { + "val_type": "string", + "inner_val_type": null, + "enum": [ + "public", + "customer", + "internal_only" + ], + "properties": null, + "inner_properties": null, + "description": "The visibility setting of the article.\n\n* public KnowledgeBaseArticleVisibilityPublic\n\n* customer KnowledgeBaseArticleVisibilityCustomer\n\n* internal_only KnowledgeBaseArticleVisibilityInternalOnly" + } + }, + "inner_properties": null, + "description": null + } + }, + "inner_properties": null, + "description": "" + }, + "accepted_as": "body", + "required": false, + "deprecated": false, + "default": null, + "documentation_urls": [] + } + ], + "documentation_urls": [], + "secrets": [ + { + "arcade_key": "PYLON_SECRET_TOKEN", + "parameter_name": "Authorization", + "accepted_as": "header", + "formatted_value": "Bearer {authorization}", + "description": "", + "is_auth_token": false + } + ], + "request_body_spec": "{\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"properties\": {\n \"author_user_id\": {\n \"description\": \"The ID of the user attributed as the author of the article.\",\n \"type\": \"string\",\n \"x-go-name\": \"AuthorUserId\"\n },\n \"body_html\": {\n \"description\": \"The HTML body of the article.\",\n \"type\": \"string\",\n \"x-go-name\": \"BodyHTML\"\n },\n \"collection_id\": {\n \"description\": \"The id of the collection associated to the article\",\n \"type\": \"string\",\n \"x-go-name\": \"CollectionID\"\n },\n \"is_published\": {\n \"description\": \"Whether the article should be published. Defaults to false.\",\n \"type\": \"boolean\",\n \"x-go-name\": \"IsPublished\"\n },\n \"is_unlisted\": {\n \"description\": \"Whether the article can only be accessible only via direct link. Defaults to false.\",\n \"type\": \"boolean\",\n \"x-go-name\": \"IsUnlisted\"\n },\n \"slug\": {\n \"description\": \"The slug of the article. Defaults to a slug based on the title.\",\n \"type\": \"string\",\n \"x-go-name\": \"Slug\"\n },\n \"title\": {\n \"description\": \"The title of the article.\",\n \"type\": \"string\",\n \"x-go-name\": \"Title\"\n },\n \"translations\": {\n \"description\": \"Translations of the article content in different languages\",\n \"items\": {\n \"properties\": {\n \"body_html\": {\n \"description\": \"The translated HTML body of the article.\",\n \"type\": \"string\",\n \"x-go-name\": \"BodyHTML\"\n },\n \"language\": {\n \"description\": \"The language code of the translation. Supported language codes can be found in https://docs.usepylon.com/pylon-docs/knowledge-base/translation#supported-language-codes.\",\n \"type\": \"string\",\n \"x-go-name\": \"Language\"\n },\n \"title\": {\n \"description\": \"The translated title of the article.\",\n \"type\": \"string\",\n \"x-go-name\": \"Title\"\n }\n },\n \"required\": [\n \"body_html\",\n \"language\",\n \"title\"\n ],\n \"type\": \"object\",\n \"x-go-package\": \"pylon/api/apiserver/endpoints\"\n },\n \"type\": \"array\",\n \"x-go-name\": \"Translations\"\n },\n \"visibility_config\": {\n \"properties\": {\n \"ai_agent_access\": {\n \"description\": \"AI agent access control for the article. Defaults to inherit from the parent scope when omitted.\\n\\n* inherit KnowledgeBaseArticleAIAgentAccessInherit Defers the access check to the parent object (Collection or KnowledgeBase).\\n\\n* none KnowledgeBaseArticleAIAgentAccessNone No AI agents have access to this article.\\n\\n* specific_agents KnowledgeBaseArticleAIAgentAccessSpecificAgents Only specific AI agents enumerated in the allowlist have access.\",\n \"enum\": [\n \"inherit\",\n \"none\",\n \"specific_agents\"\n ],\n \"type\": \"string\",\n \"x-go-enum-desc\": \"inherit KnowledgeBaseArticleAIAgentAccessInherit Defers the access check to the parent object (Collection or KnowledgeBase).\\nnone KnowledgeBaseArticleAIAgentAccessNone No AI agents have access to this article.\\nspecific_agents KnowledgeBaseArticleAIAgentAccessSpecificAgents Only specific AI agents enumerated in the allowlist have access.\",\n \"x-go-name\": \"AiAgentAccess\"\n },\n \"allowed_agent_ids\": {\n \"description\": \"List of AI agent IDs that may access this article when ai_agent_access is set to \\\"specific_agents\\\".\",\n \"items\": {\n \"type\": \"string\"\n },\n \"type\": \"array\",\n \"x-go-name\": \"AllowedAgentIDs\"\n },\n \"customer_visibility_condition\": {\n \"properties\": {\n \"field\": {\n \"description\": \"The field for this filter. For allowed fields, see the documentation for\\n\\nthe specific endpoint you are using.\\n\\nFor non-compound filters (any operators other than \\\"and\\\" or \\\"or\\\"),\\n\\nField must be set, along with either Value or Values, depending on the operator.\",\n \"type\": \"string\",\n \"x-go-name\": \"Field\"\n },\n \"operator\": {\n \"description\": \"The operator for this filter.\\n\\n* equals FilterOperatorEquals Matches objects that are exactly equal to the value in the field.\\n\\n* not_equals FilterOperatorNotEquals Matches objects that are not exactly equal to the value in the field.\\n\\n* contains FilterOperatorContains For a multi-valued field, such as tags, this operator will match objects that contain any of the values in the field.\\n\\n* does_not_contain FilterOperatorDoesNotContain For a multi-valued field, such as tags, this operator will match objects that do not contain any of the values in the field.\\n\\n* in FilterOperatorIn Matches objects if the field is one of several possible values, as specified in the values array.\\n\\n* not_in FilterOperatorNotIn Matches objects if the field is none of several possible values, as specified in the values array.\\n\\n* and FilterOperatorAnd Matches objects only if all subfilters match.\\n\\n* or FilterOperatorOr Matches objects if any subfilter matches.\\n\\n* time_is_after FilterOperatorTimeIsAfter Matches objects if the field is after the given time.\\n\\n* time_is_before FilterOperatorTimeIsBefore Matches objects if the field is before the given time.\\n\\n* time_range FilterOperatorTimeRange Matches objects if the field is between the given times.\\n\\n* string_contains FilterOperatorStringContains Matches objects if the field contains the given string.\\n\\n* string_does_not_contain FilterOperatorStringDoesNotContain Matches objects if the field does not contain the given string.\\n\\n* is_set FilterOperatorIsSet FilterOperatorIsSet matches objects if the field is set.\\n\\n* is_unset FilterOperatorIsUnset FilterOperatorIsUnset matches objects if the field is unset.\",\n \"enum\": [\n \"equals\",\n \"not_equals\",\n \"contains\",\n \"does_not_contain\",\n \"in\",\n \"not_in\",\n \"and\",\n \"or\",\n \"time_is_after\",\n \"time_is_before\",\n \"time_range\",\n \"string_contains\",\n \"string_does_not_contain\",\n \"is_set\",\n \"is_unset\"\n ],\n \"type\": \"string\",\n \"x-go-enum-desc\": \"equals FilterOperatorEquals Matches objects that are exactly equal to the value in the field.\\nnot_equals FilterOperatorNotEquals Matches objects that are not exactly equal to the value in the field.\\ncontains FilterOperatorContains For a multi-valued field, such as tags, this operator will match objects that contain any of the values in the field.\\ndoes_not_contain FilterOperatorDoesNotContain For a multi-valued field, such as tags, this operator will match objects that do not contain any of the values in the field.\\nin FilterOperatorIn Matches objects if the field is one of several possible values, as specified in the values array.\\nnot_in FilterOperatorNotIn Matches objects if the field is none of several possible values, as specified in the values array.\\nand FilterOperatorAnd Matches objects only if all subfilters match.\\nor FilterOperatorOr Matches objects if any subfilter matches.\\ntime_is_after FilterOperatorTimeIsAfter Matches objects if the field is after the given time.\\ntime_is_before FilterOperatorTimeIsBefore Matches objects if the field is before the given time.\\ntime_range FilterOperatorTimeRange Matches objects if the field is between the given times.\\nstring_contains FilterOperatorStringContains Matches objects if the field contains the given string.\\nstring_does_not_contain FilterOperatorStringDoesNotContain Matches objects if the field does not contain the given string.\\nis_set FilterOperatorIsSet FilterOperatorIsSet matches objects if the field is set.\\nis_unset FilterOperatorIsUnset FilterOperatorIsUnset matches objects if the field is unset.\",\n \"x-go-name\": \"Operator\"\n },\n \"subfilters\": {\n \"description\": \"Sub-filters for this filter. Valid only when operator is \\\"and\\\" or \\\"or\\\".\\n\\nThe maximum allowed depth for a tree of filters is 3.\",\n \"items\": {\n \"$ref\": \"#/components/schemas/Filter\",\n \"has_circular_reference\": true\n },\n \"type\": \"array\",\n \"x-go-name\": \"Subfilters\"\n },\n \"value\": {\n \"description\": \"The value for this filter. Only used for single-valued operators\\n\\n(\\\"equals\\\", \\\"not_equals\\\", \\\"contains\\\", \\\"does_not_contain\\\")\",\n \"type\": \"string\",\n \"x-go-name\": \"Value\"\n },\n \"values\": {\n \"description\": \"The values for this filter. Only used for multi-valued operators (\\\"in\\\", \\\"not_in\\\").\",\n \"items\": {\n \"type\": \"string\"\n },\n \"type\": \"array\",\n \"x-go-name\": \"Values\"\n }\n },\n \"required\": [\n \"field\",\n \"operator\"\n ],\n \"type\": \"object\",\n \"x-go-package\": \"pylon/api/apiserver/apitypes\"\n },\n \"visibility\": {\n \"description\": \"The visibility setting of the article.\\n\\n* public KnowledgeBaseArticleVisibilityPublic\\n\\n* customer KnowledgeBaseArticleVisibilityCustomer\\n\\n* internal_only KnowledgeBaseArticleVisibilityInternalOnly\",\n \"enum\": [\n \"public\",\n \"customer\",\n \"internal_only\"\n ],\n \"type\": \"string\",\n \"x-go-enum-desc\": \"public KnowledgeBaseArticleVisibilityPublic\\ncustomer KnowledgeBaseArticleVisibilityCustomer\\ninternal_only KnowledgeBaseArticleVisibilityInternalOnly\",\n \"x-go-name\": \"Visibility\"\n }\n },\n \"type\": \"object\",\n \"x-go-package\": \"pylon/api/apiserver/apitypes\"\n }\n },\n \"required\": [\n \"author_user_id\",\n \"body_html\",\n \"title\"\n ],\n \"type\": \"object\",\n \"x-go-package\": \"pylon/api/apiserver/endpoints\"\n }\n }\n },\n \"required\": false\n}", + "use_request_body_schema_mode": true, + "validate_request_body_schema": false + } +} diff --git a/toolkits/pylon_api/pylon_api/wrapper_tools/CreateMilestone.json b/toolkits/pylon_api/pylon_api/wrapper_tools/CreateMilestone.json new file mode 100644 index 00000000..4957f254 --- /dev/null +++ b/toolkits/pylon_api/pylon_api/wrapper_tools/CreateMilestone.json @@ -0,0 +1,203 @@ +{ + "name": "CreateMilestone", + "fully_qualified_name": "PylonApi.CreateMilestone@0.1.0", + "description": "Create a new milestone in a project management system.\n\nThis tool is used to create a milestone within a project management application. It should be called when there's a need to add a new milestone to track progress or set goals in a project. The tool confirms the creation of the milestone.", + "toolkit": { + "name": "PylonApi", + "description": null, + "version": "0.1.0" + }, + "input": { + "parameters": [ + { + "name": "milestone_name", + "required": true, + "description": "The name of the milestone to be created. This is the title that will be displayed for the milestone.", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "Name for this milestone" + }, + "inferrable": true, + "http_endpoint_parameter_name": "name" + }, + { + "name": "project_id_for_milestone", + "required": true, + "description": "The unique identifier for the project to which this milestone belongs. Required for associating the milestone with the correct project.", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "Project ID for this milestone" + }, + "inferrable": true, + "http_endpoint_parameter_name": "project_id" + }, + { + "name": "milestone_due_date", + "required": false, + "description": "Due date for this milestone in RFC 3339 format (e.g., 2023-12-31T23:59:59Z).", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "Due date for this milestone, in RFC 3339 format" + }, + "inferrable": true, + "http_endpoint_parameter_name": "due_date" + }, + { + "name": "account_id_for_project", + "required": false, + "description": "Account ID for the project. This is needed to associate the milestone with the correct account.", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "Account ID for this project" + }, + "inferrable": true, + "http_endpoint_parameter_name": "account_id" + } + ] + }, + "output": { + "description": "Response from the API endpoint 'CreateMilestone'.", + "available_modes": [ + "value", + "error", + "null" + ], + "value_schema": { + "val_type": "json", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": null + } + }, + "requirements": { + "authorization": null, + "secrets": [ + { + "key": "PYLON_SECRET_TOKEN" + } + ], + "metadata": null + }, + "deprecation_message": null, + "metadata": { + "object_type": "api_wrapper_tool", + "version": "1.1.0", + "description": "Tools that enable LLMs to interact directly with the pylon API." + }, + "http_endpoint": { + "metadata": { + "object_type": "http_endpoint", + "version": "1.2.0", + "description": "" + }, + "url": "https://api.usepylon.com/milestones", + "http_method": "POST", + "headers": {}, + "parameters": [ + { + "name": "name", + "tool_parameter_name": "milestone_name", + "description": "Name for this milestone", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "Name for this milestone" + }, + "accepted_as": "query", + "required": true, + "deprecated": false, + "default": null, + "documentation_urls": [] + }, + { + "name": "due_date", + "tool_parameter_name": "milestone_due_date", + "description": "Due date for this milestone, in RFC 3339 format", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "Due date for this milestone, in RFC 3339 format" + }, + "accepted_as": "query", + "required": false, + "deprecated": false, + "default": null, + "documentation_urls": [] + }, + { + "name": "project_id", + "tool_parameter_name": "project_id_for_milestone", + "description": "Project ID for this milestone", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "Project ID for this milestone" + }, + "accepted_as": "query", + "required": true, + "deprecated": false, + "default": null, + "documentation_urls": [] + }, + { + "name": "account_id", + "tool_parameter_name": "account_id_for_project", + "description": "Account ID for this project", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "Account ID for this project" + }, + "accepted_as": "query", + "required": false, + "deprecated": false, + "default": null, + "documentation_urls": [] + } + ], + "documentation_urls": [], + "secrets": [ + { + "arcade_key": "PYLON_SECRET_TOKEN", + "parameter_name": "Authorization", + "accepted_as": "header", + "formatted_value": "Bearer {authorization}", + "description": "", + "is_auth_token": false + } + ], + "request_body_spec": null, + "use_request_body_schema_mode": false, + "validate_request_body_schema": false + } +} diff --git a/toolkits/pylon_api/pylon_api/wrapper_tools/CreateNewAccount.json b/toolkits/pylon_api/pylon_api/wrapper_tools/CreateNewAccount.json new file mode 100644 index 00000000..3f898b37 --- /dev/null +++ b/toolkits/pylon_api/pylon_api/wrapper_tools/CreateNewAccount.json @@ -0,0 +1,450 @@ +{ + "name": "CreateNewAccount", + "fully_qualified_name": "PylonApi.CreateNewAccount@0.1.0", + "description": "Creates a new user account.\n\nThis tool should be called to create a new user account when registration or account opening is requested.", + "toolkit": { + "name": "PylonApi", + "description": null, + "version": "0.1.0" + }, + "input": { + "parameters": [ + { + "name": "account_details", + "required": false, + "description": "JSON object containing account details like channels, custom fields, domains, external IDs, etc. for the new account.", + "value_schema": { + "val_type": "json", + "inner_val_type": null, + "enum": null, + "properties": { + "channels": { + "val_type": "array", + "inner_val_type": "json", + "enum": null, + "properties": null, + "inner_properties": { + "channel_id": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The ID of the channel. If this is a Microsoft Teams channel, the ID must be in the format of `{team_id}|{channel_id}`." + }, + "is_primary": { + "val_type": "boolean", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "Whether this channel is the primary channel for the account." + }, + "mirror_to": { + "val_type": "json", + "inner_val_type": null, + "enum": null, + "properties": { + "channel_id": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The ID of the channel. If this is a Microsoft Teams channel, the ID must be in the format of `{team_id}|{channel_id}`." + }, + "source": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The source, which can be one of `[\"slack\", \"microsoft_teams\", \"discord\"]`." + } + }, + "inner_properties": null, + "description": null + }, + "source": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The source, which can be one of `[\"slack\", \"microsoft_teams\", \"discord\"]`." + } + }, + "description": "An array of channels to be linked to this account." + }, + "custom_fields": { + "val_type": "array", + "inner_val_type": "json", + "enum": null, + "properties": null, + "inner_properties": { + "slug": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The slug of the custom field." + }, + "value": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The value of the custom field. Only to be used for single-valued custom fields. If unset, the custom field will be unset. If the custom field is a select field, the value must be the select option slug, which you can find from the GET /custom-fields endpoint." + }, + "values": { + "val_type": "array", + "inner_val_type": "string", + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The values of the custom field. Only to be used for multi-valued custom fields (ex. multiselect). If unset, the custom field will be unset. If the custom field is a multiselect field, the values must be the select option slugs which you can find from the GET /custom-fields endpoint." + } + }, + "description": "An array of custom fields to be used on this account." + }, + "domain": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "Deprecated. Please use Domains and PrimaryDomain instead." + }, + "domains": { + "val_type": "array", + "inner_val_type": "string", + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The domains of the account, without any leading scheme, for example stripe.com. Must specify one domain as primary." + }, + "external_ids": { + "val_type": "array", + "inner_val_type": "json", + "enum": null, + "properties": null, + "inner_properties": { + "external_id": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The external ID. Must be unique per object type (ex. account)." + }, + "label": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The label of the external ID. Must be unique per object." + } + }, + "description": "An array of external IDs to be used on this account. If provided, the accounts external IDs will be updated to the given external IDs." + }, + "logo_url": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The logo URL of the account. Must be a square .png, .jpg or .jpeg." + }, + "name": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The name of the account." + }, + "owner_id": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The ID of the owner of the account." + }, + "primary_domain": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "Must be in the list of domains. If there are any domains, there must be exactly one primary domain." + }, + "tags": { + "val_type": "array", + "inner_val_type": "string", + "enum": null, + "properties": null, + "inner_properties": null, + "description": "An array of strings to use as tags on this account. If provided, the accounts tags will be updated to the given tags." + } + }, + "inner_properties": null, + "description": "" + }, + "inferrable": true, + "http_endpoint_parameter_name": "requestBody" + } + ] + }, + "output": { + "description": "Response from the API endpoint 'CreateAccount'.", + "available_modes": [ + "value", + "error", + "null" + ], + "value_schema": { + "val_type": "json", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": null + } + }, + "requirements": { + "authorization": null, + "secrets": [ + { + "key": "PYLON_SECRET_TOKEN" + } + ], + "metadata": null + }, + "deprecation_message": null, + "metadata": { + "object_type": "api_wrapper_tool", + "version": "1.1.0", + "description": "Tools that enable LLMs to interact directly with the pylon API." + }, + "http_endpoint": { + "metadata": { + "object_type": "http_endpoint", + "version": "1.2.0", + "description": "" + }, + "url": "https://api.usepylon.com/accounts", + "http_method": "POST", + "headers": {}, + "parameters": [ + { + "name": "requestBody", + "tool_parameter_name": "account_details", + "description": "", + "value_schema": { + "val_type": "json", + "inner_val_type": null, + "enum": null, + "properties": { + "channels": { + "val_type": "array", + "inner_val_type": "json", + "enum": null, + "properties": null, + "inner_properties": { + "channel_id": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The ID of the channel. If this is a Microsoft Teams channel, the ID must be in the format of `{team_id}|{channel_id}`." + }, + "is_primary": { + "val_type": "boolean", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "Whether this channel is the primary channel for the account." + }, + "mirror_to": { + "val_type": "json", + "inner_val_type": null, + "enum": null, + "properties": { + "channel_id": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The ID of the channel. If this is a Microsoft Teams channel, the ID must be in the format of `{team_id}|{channel_id}`." + }, + "source": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The source, which can be one of `[\"slack\", \"microsoft_teams\", \"discord\"]`." + } + }, + "inner_properties": null, + "description": null + }, + "source": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The source, which can be one of `[\"slack\", \"microsoft_teams\", \"discord\"]`." + } + }, + "description": "An array of channels to be linked to this account." + }, + "custom_fields": { + "val_type": "array", + "inner_val_type": "json", + "enum": null, + "properties": null, + "inner_properties": { + "slug": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The slug of the custom field." + }, + "value": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The value of the custom field. Only to be used for single-valued custom fields. If unset, the custom field will be unset. If the custom field is a select field, the value must be the select option slug, which you can find from the GET /custom-fields endpoint." + }, + "values": { + "val_type": "array", + "inner_val_type": "string", + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The values of the custom field. Only to be used for multi-valued custom fields (ex. multiselect). If unset, the custom field will be unset. If the custom field is a multiselect field, the values must be the select option slugs which you can find from the GET /custom-fields endpoint." + } + }, + "description": "An array of custom fields to be used on this account." + }, + "domain": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "Deprecated. Please use Domains and PrimaryDomain instead." + }, + "domains": { + "val_type": "array", + "inner_val_type": "string", + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The domains of the account, without any leading scheme, for example stripe.com. Must specify one domain as primary." + }, + "external_ids": { + "val_type": "array", + "inner_val_type": "json", + "enum": null, + "properties": null, + "inner_properties": { + "external_id": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The external ID. Must be unique per object type (ex. account)." + }, + "label": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The label of the external ID. Must be unique per object." + } + }, + "description": "An array of external IDs to be used on this account. If provided, the accounts external IDs will be updated to the given external IDs." + }, + "logo_url": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The logo URL of the account. Must be a square .png, .jpg or .jpeg." + }, + "name": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The name of the account." + }, + "owner_id": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The ID of the owner of the account." + }, + "primary_domain": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "Must be in the list of domains. If there are any domains, there must be exactly one primary domain." + }, + "tags": { + "val_type": "array", + "inner_val_type": "string", + "enum": null, + "properties": null, + "inner_properties": null, + "description": "An array of strings to use as tags on this account. If provided, the accounts tags will be updated to the given tags." + } + }, + "inner_properties": null, + "description": "" + }, + "accepted_as": "body", + "required": false, + "deprecated": false, + "default": null, + "documentation_urls": [] + } + ], + "documentation_urls": [], + "secrets": [ + { + "arcade_key": "PYLON_SECRET_TOKEN", + "parameter_name": "Authorization", + "accepted_as": "header", + "formatted_value": "Bearer {authorization}", + "description": "", + "is_auth_token": false + } + ], + "request_body_spec": "{\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"properties\": {\n \"channels\": {\n \"description\": \"An array of channels to be linked to this account.\",\n \"items\": {\n \"properties\": {\n \"channel_id\": {\n \"description\": \"The ID of the channel. If this is a Microsoft Teams channel, the ID must be in the format of `{team_id}|{channel_id}`.\",\n \"type\": \"string\",\n \"x-go-name\": \"ChannelID\"\n },\n \"is_primary\": {\n \"description\": \"Whether this channel is the primary channel for the account.\",\n \"type\": \"boolean\",\n \"x-go-name\": \"IsPrimary\"\n },\n \"mirror_to\": {\n \"properties\": {\n \"channel_id\": {\n \"description\": \"The ID of the channel. If this is a Microsoft Teams channel, the ID must be in the format of `{team_id}|{channel_id}`.\",\n \"type\": \"string\",\n \"x-go-name\": \"ChannelID\"\n },\n \"source\": {\n \"description\": \"The source, which can be one of `[\\\"slack\\\", \\\"microsoft_teams\\\", \\\"discord\\\"]`.\",\n \"type\": \"string\",\n \"x-go-name\": \"Source\"\n }\n },\n \"type\": \"object\",\n \"x-go-package\": \"pylon/api/apiserver/apitypes\"\n },\n \"source\": {\n \"description\": \"The source, which can be one of `[\\\"slack\\\", \\\"microsoft_teams\\\", \\\"discord\\\"]`.\",\n \"type\": \"string\",\n \"x-go-name\": \"Source\"\n }\n },\n \"type\": \"object\",\n \"x-go-package\": \"pylon/api/apiserver/apitypes\"\n },\n \"type\": \"array\",\n \"x-go-name\": \"Channels\"\n },\n \"custom_fields\": {\n \"description\": \"An array of custom fields to be used on this account.\",\n \"items\": {\n \"properties\": {\n \"slug\": {\n \"description\": \"The slug of the custom field.\",\n \"type\": \"string\",\n \"x-go-name\": \"Slug\"\n },\n \"value\": {\n \"description\": \"The value of the custom field. Only to be used for single-valued custom fields. If unset, the custom field will be unset. If the custom field is a select field, the value must be the select option slug, which you can find from the GET /custom-fields endpoint.\",\n \"type\": \"string\",\n \"x-go-name\": \"Value\"\n },\n \"values\": {\n \"description\": \"The values of the custom field. Only to be used for multi-valued custom fields (ex. multiselect). If unset, the custom field will be unset. If the custom field is a multiselect field, the values must be the select option slugs which you can find from the GET /custom-fields endpoint.\",\n \"items\": {\n \"type\": \"string\"\n },\n \"type\": \"array\",\n \"x-go-name\": \"Values\"\n }\n },\n \"type\": \"object\",\n \"x-go-package\": \"pylon/api/apiserver/apitypes\"\n },\n \"type\": \"array\",\n \"x-go-name\": \"CustomFields\"\n },\n \"domain\": {\n \"description\": \"Deprecated. Please use Domains and PrimaryDomain instead.\",\n \"type\": \"string\",\n \"x-go-name\": \"Domain\"\n },\n \"domains\": {\n \"description\": \"The domains of the account, without any leading scheme, for example stripe.com. Must specify one domain as primary.\",\n \"items\": {\n \"type\": \"string\"\n },\n \"type\": \"array\",\n \"x-go-name\": \"Domains\"\n },\n \"external_ids\": {\n \"description\": \"An array of external IDs to be used on this account. If provided, the accounts external IDs will be updated to the given external IDs.\",\n \"items\": {\n \"properties\": {\n \"external_id\": {\n \"description\": \"The external ID. Must be unique per object type (ex. account).\",\n \"type\": \"string\",\n \"x-go-name\": \"ExternalID\"\n },\n \"label\": {\n \"description\": \"The label of the external ID. Must be unique per object.\",\n \"type\": \"string\",\n \"x-go-name\": \"Label\"\n }\n },\n \"type\": \"object\",\n \"x-go-package\": \"pylon/api/apiserver/apitypes\"\n },\n \"type\": \"array\",\n \"x-go-name\": \"ExternalIDs\"\n },\n \"logo_url\": {\n \"description\": \"The logo URL of the account. Must be a square .png, .jpg or .jpeg.\",\n \"type\": \"string\",\n \"x-go-name\": \"LogoURL\"\n },\n \"name\": {\n \"description\": \"The name of the account.\",\n \"type\": \"string\",\n \"x-go-name\": \"Name\"\n },\n \"owner_id\": {\n \"description\": \"The ID of the owner of the account.\",\n \"type\": \"string\",\n \"x-go-name\": \"OwnerID\"\n },\n \"primary_domain\": {\n \"description\": \"Must be in the list of domains. If there are any domains, there must be exactly one primary domain.\",\n \"type\": \"string\",\n \"x-go-name\": \"PrimaryDomain\"\n },\n \"tags\": {\n \"description\": \"An array of strings to use as tags on this account. If provided, the accounts tags will be updated to the given tags.\",\n \"items\": {\n \"type\": \"string\"\n },\n \"type\": \"array\",\n \"x-go-name\": \"Tags\"\n }\n },\n \"required\": [\n \"name\"\n ],\n \"type\": \"object\",\n \"x-go-package\": \"pylon/api/apiserver/endpoints\"\n }\n }\n },\n \"required\": false\n}", + "use_request_body_schema_mode": true, + "validate_request_body_schema": true + } +} diff --git a/toolkits/pylon_api/pylon_api/wrapper_tools/CreateNewCollection.json b/toolkits/pylon_api/pylon_api/wrapper_tools/CreateNewCollection.json new file mode 100644 index 00000000..a3731015 --- /dev/null +++ b/toolkits/pylon_api/pylon_api/wrapper_tools/CreateNewCollection.json @@ -0,0 +1,203 @@ +{ + "name": "CreateNewCollection", + "fully_qualified_name": "PylonApi.CreateNewCollection@0.1.0", + "description": "Create a new collection in a knowledge base.\n\nThis tool is used to create a new collection within a specified knowledge base by providing the knowledge base ID.", + "toolkit": { + "name": "PylonApi", + "description": null, + "version": "0.1.0" + }, + "input": { + "parameters": [ + { + "name": "knowledge_base_id", + "required": true, + "description": "The unique identifier for the knowledge base where the new collection will be created.", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The ID of the knowledge base the article is being added to." + }, + "inferrable": true, + "http_endpoint_parameter_name": "id" + }, + { + "name": "collection_details", + "required": false, + "description": "JSON object containing 'title', 'description', 'slug', and 'parent_collection_id' for the new collection.", + "value_schema": { + "val_type": "json", + "inner_val_type": null, + "enum": null, + "properties": { + "description": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "Description of the collection." + }, + "parent_collection_id": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The id of the collection associated to the article" + }, + "slug": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The slug of the collection. Defaults to a slug based on the title." + }, + "title": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The title of the collection." + } + }, + "inner_properties": null, + "description": "" + }, + "inferrable": true, + "http_endpoint_parameter_name": "requestBody" + } + ] + }, + "output": { + "description": "Response from the API endpoint 'CreateCollection'.", + "available_modes": [ + "value", + "error", + "null" + ], + "value_schema": { + "val_type": "json", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": null + } + }, + "requirements": { + "authorization": null, + "secrets": [ + { + "key": "PYLON_SECRET_TOKEN" + } + ], + "metadata": null + }, + "deprecation_message": null, + "metadata": { + "object_type": "api_wrapper_tool", + "version": "1.1.0", + "description": "Tools that enable LLMs to interact directly with the pylon API." + }, + "http_endpoint": { + "metadata": { + "object_type": "http_endpoint", + "version": "1.2.0", + "description": "" + }, + "url": "https://api.usepylon.com/knowledge-bases/{id}/collections", + "http_method": "POST", + "headers": {}, + "parameters": [ + { + "name": "id", + "tool_parameter_name": "knowledge_base_id", + "description": "The ID of the knowledge base the article is being added to.", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The ID of the knowledge base the article is being added to." + }, + "accepted_as": "path", + "required": true, + "deprecated": false, + "default": null, + "documentation_urls": [] + }, + { + "name": "requestBody", + "tool_parameter_name": "collection_details", + "description": "", + "value_schema": { + "val_type": "json", + "inner_val_type": null, + "enum": null, + "properties": { + "description": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "Description of the collection." + }, + "parent_collection_id": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The id of the collection associated to the article" + }, + "slug": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The slug of the collection. Defaults to a slug based on the title." + }, + "title": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The title of the collection." + } + }, + "inner_properties": null, + "description": "" + }, + "accepted_as": "body", + "required": false, + "deprecated": false, + "default": null, + "documentation_urls": [] + } + ], + "documentation_urls": [], + "secrets": [ + { + "arcade_key": "PYLON_SECRET_TOKEN", + "parameter_name": "Authorization", + "accepted_as": "header", + "formatted_value": "Bearer {authorization}", + "description": "", + "is_auth_token": false + } + ], + "request_body_spec": "{\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"properties\": {\n \"description\": {\n \"description\": \"Description of the collection.\",\n \"type\": \"string\",\n \"x-go-name\": \"Description\"\n },\n \"parent_collection_id\": {\n \"description\": \"The id of the collection associated to the article\",\n \"type\": \"string\",\n \"x-go-name\": \"ParentCollectionID\"\n },\n \"slug\": {\n \"description\": \"The slug of the collection. Defaults to a slug based on the title.\",\n \"type\": \"string\",\n \"x-go-name\": \"Slug\"\n },\n \"title\": {\n \"description\": \"The title of the collection.\",\n \"type\": \"string\",\n \"x-go-name\": \"Title\"\n }\n },\n \"required\": [\n \"title\"\n ],\n \"type\": \"object\",\n \"x-go-package\": \"pylon/api/apiserver/endpoints\"\n }\n }\n },\n \"required\": false\n}", + "use_request_body_schema_mode": true, + "validate_request_body_schema": true + } +} diff --git a/toolkits/pylon_api/pylon_api/wrapper_tools/CreateNewContact.json b/toolkits/pylon_api/pylon_api/wrapper_tools/CreateNewContact.json new file mode 100644 index 00000000..b7f53067 --- /dev/null +++ b/toolkits/pylon_api/pylon_api/wrapper_tools/CreateNewContact.json @@ -0,0 +1,276 @@ +{ + "name": "CreateNewContact", + "fully_qualified_name": "PylonApi.CreateNewContact@0.1.0", + "description": "Create a new contact in the system.\n\nThis tool creates a new contact by sending the necessary details to the endpoint. Use it when you need to add a new person's contact information to the database.", + "toolkit": { + "name": "PylonApi", + "description": null, + "version": "0.1.0" + }, + "input": { + "parameters": [ + { + "name": "contact_details", + "required": false, + "description": "A JSON object containing the details of the contact to be created, such as name, email, account details, avatar URL, custom fields, and portal role.", + "value_schema": { + "val_type": "json", + "inner_val_type": null, + "enum": null, + "properties": { + "account_external_id": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The external ID of the account that this contact belongs to. Cannot be used together with account_id." + }, + "account_id": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The account that this contact belongs to." + }, + "avatar_url": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The avatar URL of the contact. Must be a square .png, .jpg or .jpeg." + }, + "custom_fields": { + "val_type": "array", + "inner_val_type": "json", + "enum": null, + "properties": null, + "inner_properties": { + "slug": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The slug of the custom field." + }, + "value": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The value of the custom field. Only to be used for single-valued custom fields. If unset, the custom field will be unset. If the custom field is a select field, the value must be the select option slug, which you can find from the GET /custom-fields endpoint." + }, + "values": { + "val_type": "array", + "inner_val_type": "string", + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The values of the custom field. Only to be used for multi-valued custom fields (ex. multiselect). If unset, the custom field will be unset. If the custom field is a multiselect field, the values must be the select option slugs which you can find from the GET /custom-fields endpoint." + } + }, + "description": "An array of custom fields to be applied to this contact." + }, + "email": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The email of the contact." + }, + "name": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The name of the contact." + }, + "portal_role": { + "val_type": "string", + "inner_val_type": null, + "enum": [ + "no_access", + "member", + "admin" + ], + "properties": null, + "inner_properties": null, + "description": "The portal role to assign to the contact. If not provided uses the default portal role from the portal settings.\n\n* no_access PortalRoleNoAccess\n\n* member PortalRoleMember\n\n* admin PortalRoleAdmin" + } + }, + "inner_properties": null, + "description": "" + }, + "inferrable": true, + "http_endpoint_parameter_name": "requestBody" + } + ] + }, + "output": { + "description": "Response from the API endpoint 'CreateContact'.", + "available_modes": [ + "value", + "error", + "null" + ], + "value_schema": { + "val_type": "json", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": null + } + }, + "requirements": { + "authorization": null, + "secrets": [ + { + "key": "PYLON_SECRET_TOKEN" + } + ], + "metadata": null + }, + "deprecation_message": null, + "metadata": { + "object_type": "api_wrapper_tool", + "version": "1.1.0", + "description": "Tools that enable LLMs to interact directly with the pylon API." + }, + "http_endpoint": { + "metadata": { + "object_type": "http_endpoint", + "version": "1.2.0", + "description": "" + }, + "url": "https://api.usepylon.com/contacts", + "http_method": "POST", + "headers": {}, + "parameters": [ + { + "name": "requestBody", + "tool_parameter_name": "contact_details", + "description": "", + "value_schema": { + "val_type": "json", + "inner_val_type": null, + "enum": null, + "properties": { + "account_external_id": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The external ID of the account that this contact belongs to. Cannot be used together with account_id." + }, + "account_id": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The account that this contact belongs to." + }, + "avatar_url": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The avatar URL of the contact. Must be a square .png, .jpg or .jpeg." + }, + "custom_fields": { + "val_type": "array", + "inner_val_type": "json", + "enum": null, + "properties": null, + "inner_properties": { + "slug": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The slug of the custom field." + }, + "value": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The value of the custom field. Only to be used for single-valued custom fields. If unset, the custom field will be unset. If the custom field is a select field, the value must be the select option slug, which you can find from the GET /custom-fields endpoint." + }, + "values": { + "val_type": "array", + "inner_val_type": "string", + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The values of the custom field. Only to be used for multi-valued custom fields (ex. multiselect). If unset, the custom field will be unset. If the custom field is a multiselect field, the values must be the select option slugs which you can find from the GET /custom-fields endpoint." + } + }, + "description": "An array of custom fields to be applied to this contact." + }, + "email": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The email of the contact." + }, + "name": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The name of the contact." + }, + "portal_role": { + "val_type": "string", + "inner_val_type": null, + "enum": [ + "no_access", + "member", + "admin" + ], + "properties": null, + "inner_properties": null, + "description": "The portal role to assign to the contact. If not provided uses the default portal role from the portal settings.\n\n* no_access PortalRoleNoAccess\n\n* member PortalRoleMember\n\n* admin PortalRoleAdmin" + } + }, + "inner_properties": null, + "description": "" + }, + "accepted_as": "body", + "required": false, + "deprecated": false, + "default": null, + "documentation_urls": [] + } + ], + "documentation_urls": [], + "secrets": [ + { + "arcade_key": "PYLON_SECRET_TOKEN", + "parameter_name": "Authorization", + "accepted_as": "header", + "formatted_value": "Bearer {authorization}", + "description": "", + "is_auth_token": false + } + ], + "request_body_spec": "{\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"properties\": {\n \"account_external_id\": {\n \"description\": \"The external ID of the account that this contact belongs to. Cannot be used together with account_id.\",\n \"type\": \"string\",\n \"x-go-name\": \"AccountExternalID\"\n },\n \"account_id\": {\n \"description\": \"The account that this contact belongs to.\",\n \"type\": \"string\",\n \"x-go-name\": \"AccountID\"\n },\n \"avatar_url\": {\n \"description\": \"The avatar URL of the contact. Must be a square .png, .jpg or .jpeg.\",\n \"type\": \"string\",\n \"x-go-name\": \"AvatarUrl\"\n },\n \"custom_fields\": {\n \"description\": \"An array of custom fields to be applied to this contact.\",\n \"items\": {\n \"properties\": {\n \"slug\": {\n \"description\": \"The slug of the custom field.\",\n \"type\": \"string\",\n \"x-go-name\": \"Slug\"\n },\n \"value\": {\n \"description\": \"The value of the custom field. Only to be used for single-valued custom fields. If unset, the custom field will be unset. If the custom field is a select field, the value must be the select option slug, which you can find from the GET /custom-fields endpoint.\",\n \"type\": \"string\",\n \"x-go-name\": \"Value\"\n },\n \"values\": {\n \"description\": \"The values of the custom field. Only to be used for multi-valued custom fields (ex. multiselect). If unset, the custom field will be unset. If the custom field is a multiselect field, the values must be the select option slugs which you can find from the GET /custom-fields endpoint.\",\n \"items\": {\n \"type\": \"string\"\n },\n \"type\": \"array\",\n \"x-go-name\": \"Values\"\n }\n },\n \"type\": \"object\",\n \"x-go-package\": \"pylon/api/apiserver/apitypes\"\n },\n \"type\": \"array\",\n \"x-go-name\": \"CustomFields\"\n },\n \"email\": {\n \"description\": \"The email of the contact.\",\n \"type\": \"string\",\n \"x-go-name\": \"Email\"\n },\n \"name\": {\n \"description\": \"The name of the contact.\",\n \"type\": \"string\",\n \"x-go-name\": \"Name\"\n },\n \"portal_role\": {\n \"description\": \"The portal role to assign to the contact. If not provided uses the default portal role from the portal settings.\\n\\n* no_access PortalRoleNoAccess\\n\\n* member PortalRoleMember\\n\\n* admin PortalRoleAdmin\",\n \"enum\": [\n \"no_access\",\n \"member\",\n \"admin\"\n ],\n \"type\": \"string\",\n \"x-go-enum-desc\": \"no_access PortalRoleNoAccess\\nmember PortalRoleMember\\nadmin PortalRoleAdmin\",\n \"x-go-name\": \"PortalRole\"\n }\n },\n \"required\": [\n \"name\"\n ],\n \"type\": \"object\",\n \"x-go-package\": \"pylon/api/apiserver/endpoints\"\n }\n }\n },\n \"required\": false\n}", + "use_request_body_schema_mode": true, + "validate_request_body_schema": true + } +} diff --git a/toolkits/pylon_api/pylon_api/wrapper_tools/CreateNewIssue.json b/toolkits/pylon_api/pylon_api/wrapper_tools/CreateNewIssue.json new file mode 100644 index 00000000..743914d3 --- /dev/null +++ b/toolkits/pylon_api/pylon_api/wrapper_tools/CreateNewIssue.json @@ -0,0 +1,520 @@ +{ + "name": "CreateNewIssue", + "fully_qualified_name": "PylonApi.CreateNewIssue@0.1.0", + "description": "Create a new issue in the system.\n\nThis tool is used to create a new issue in the system. It should be called whenever there's a need to log or track a new issue or task.", + "toolkit": { + "name": "PylonApi", + "description": null, + "version": "0.1.0" + }, + "input": { + "parameters": [ + { + "name": "issue_details", + "required": false, + "description": "A JSON object containing issue details including account_id, assignee_id, attachment_urls, body_html, contact_id, and other optional fields. This data structures the issue to be created, indicating ownership, assignment, and any additional contextual information like attachments or destination preferences.", + "value_schema": { + "val_type": "json", + "inner_val_type": null, + "enum": null, + "properties": { + "account_id": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The account that this issue belongs to." + }, + "assignee_id": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The user the issue should be assigned to." + }, + "attachment_urls": { + "val_type": "array", + "inner_val_type": "string", + "enum": null, + "properties": null, + "inner_properties": null, + "description": "An array of attachment URLs to attach to this issue." + }, + "body_html": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The HTML content of the body of the issue." + }, + "contact_id": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "Optional contact ID to post the message as. Only one of user_id or contact_id can be provided." + }, + "created_at": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "Timestamp of when the issue was created. If not specified, the current time will be used. (RFC3339)" + }, + "custom_fields": { + "val_type": "array", + "inner_val_type": "json", + "enum": null, + "properties": null, + "inner_properties": { + "slug": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The slug of the custom field." + }, + "value": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The value of the custom field. Only to be used for single-valued custom fields. If unset, the custom field will be unset. If the custom field is a select field, the value must be the select option slug, which you can find from the GET /custom-fields endpoint." + }, + "values": { + "val_type": "array", + "inner_val_type": "string", + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The values of the custom field. Only to be used for multi-valued custom fields (ex. multiselect). If unset, the custom field will be unset. If the custom field is a multiselect field, the values must be the select option slugs which you can find from the GET /custom-fields endpoint." + } + }, + "description": "An array of custom fields to be used on this issue." + }, + "destination_metadata": { + "val_type": "json", + "inner_val_type": null, + "enum": null, + "properties": { + "chat_widget_app_id": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The ID of the chat widget app to use for in-app chat." + }, + "destination": { + "val_type": "string", + "inner_val_type": null, + "enum": [ + "slack", + "email", + "in_app_chat", + "internal" + ], + "properties": null, + "inner_properties": null, + "description": "The destination type of the issue. Can be \"email\", \"slack\", \"in_app_chat\", or \"internal\". Defaults to \"internal\".\n\n* slack APIIssueDestinationSlack Deliver to the issue's account's Slack channel.\n\n* email APIIssueDestinationEmail Deliver messages to the issue requester via email.\n\n* in_app_chat APIIssueDestinationChatWidget Deliver messages to the issue requester via in-app chat.\n\n* internal APIIssueDestinationInternal Keep the issue internal and don't contact the requester at all." + }, + "email": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The email that emails to the requester will be sent from. You must configure an email app in Pylon with this address." + }, + "email_bccs": { + "val_type": "array", + "inner_val_type": "string", + "enum": null, + "properties": null, + "inner_properties": null, + "description": "Emails that will be BCCed on emails to the requester." + }, + "email_ccs": { + "val_type": "array", + "inner_val_type": "string", + "enum": null, + "properties": null, + "inner_properties": null, + "description": "Emails that will be CCed on emails to the requester." + } + }, + "inner_properties": null, + "description": "You can configure the issue to contact the requester via email, Slack, in-app chat, or not at all.\n\nIf a destination other than `internal` is specified, a message with the issue's BodyHTML will be delivered to the requester. If you don't wish to immediately contact the requester, you can specify the `internal` destination." + }, + "priority": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The priority of the issue. Can be one of: urgent, high, medium, or low." + }, + "requester_avatar_url": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The URL of an avatar of the requester." + }, + "requester_email": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The email of the user that this issue is on behalf of. Include one of requester_id or requester_email to create an issue with a requester." + }, + "requester_id": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The requester that this issue is on behalf of. Include one of requester_id or requester_email to create an issue with a requester." + }, + "requester_name": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The full name of the user that this issue is on behalf of." + }, + "tags": { + "val_type": "array", + "inner_val_type": "string", + "enum": null, + "properties": null, + "inner_properties": null, + "description": "An array of strings to use as tags on this issue. If provided, the issue tags will be updated to the given tags." + }, + "team_id": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The ID of the team this issue should be assigned to." + }, + "title": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The title of the issue." + }, + "user_id": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "Optional user ID to post the message as. Only one of user_id or contact_id can be provided." + } + }, + "inner_properties": null, + "description": "" + }, + "inferrable": true, + "http_endpoint_parameter_name": "requestBody" + } + ] + }, + "output": { + "description": "Response from the API endpoint 'CreateIssue'.", + "available_modes": [ + "value", + "error", + "null" + ], + "value_schema": { + "val_type": "json", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": null + } + }, + "requirements": { + "authorization": null, + "secrets": [ + { + "key": "PYLON_SECRET_TOKEN" + } + ], + "metadata": null + }, + "deprecation_message": null, + "metadata": { + "object_type": "api_wrapper_tool", + "version": "1.1.0", + "description": "Tools that enable LLMs to interact directly with the pylon API." + }, + "http_endpoint": { + "metadata": { + "object_type": "http_endpoint", + "version": "1.2.0", + "description": "" + }, + "url": "https://api.usepylon.com/issues", + "http_method": "POST", + "headers": {}, + "parameters": [ + { + "name": "requestBody", + "tool_parameter_name": "issue_details", + "description": "", + "value_schema": { + "val_type": "json", + "inner_val_type": null, + "enum": null, + "properties": { + "account_id": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The account that this issue belongs to." + }, + "assignee_id": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The user the issue should be assigned to." + }, + "attachment_urls": { + "val_type": "array", + "inner_val_type": "string", + "enum": null, + "properties": null, + "inner_properties": null, + "description": "An array of attachment URLs to attach to this issue." + }, + "body_html": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The HTML content of the body of the issue." + }, + "contact_id": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "Optional contact ID to post the message as. Only one of user_id or contact_id can be provided." + }, + "created_at": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "Timestamp of when the issue was created. If not specified, the current time will be used. (RFC3339)" + }, + "custom_fields": { + "val_type": "array", + "inner_val_type": "json", + "enum": null, + "properties": null, + "inner_properties": { + "slug": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The slug of the custom field." + }, + "value": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The value of the custom field. Only to be used for single-valued custom fields. If unset, the custom field will be unset. If the custom field is a select field, the value must be the select option slug, which you can find from the GET /custom-fields endpoint." + }, + "values": { + "val_type": "array", + "inner_val_type": "string", + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The values of the custom field. Only to be used for multi-valued custom fields (ex. multiselect). If unset, the custom field will be unset. If the custom field is a multiselect field, the values must be the select option slugs which you can find from the GET /custom-fields endpoint." + } + }, + "description": "An array of custom fields to be used on this issue." + }, + "destination_metadata": { + "val_type": "json", + "inner_val_type": null, + "enum": null, + "properties": { + "chat_widget_app_id": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The ID of the chat widget app to use for in-app chat." + }, + "destination": { + "val_type": "string", + "inner_val_type": null, + "enum": [ + "slack", + "email", + "in_app_chat", + "internal" + ], + "properties": null, + "inner_properties": null, + "description": "The destination type of the issue. Can be \"email\", \"slack\", \"in_app_chat\", or \"internal\". Defaults to \"internal\".\n\n* slack APIIssueDestinationSlack Deliver to the issue's account's Slack channel.\n\n* email APIIssueDestinationEmail Deliver messages to the issue requester via email.\n\n* in_app_chat APIIssueDestinationChatWidget Deliver messages to the issue requester via in-app chat.\n\n* internal APIIssueDestinationInternal Keep the issue internal and don't contact the requester at all." + }, + "email": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The email that emails to the requester will be sent from. You must configure an email app in Pylon with this address." + }, + "email_bccs": { + "val_type": "array", + "inner_val_type": "string", + "enum": null, + "properties": null, + "inner_properties": null, + "description": "Emails that will be BCCed on emails to the requester." + }, + "email_ccs": { + "val_type": "array", + "inner_val_type": "string", + "enum": null, + "properties": null, + "inner_properties": null, + "description": "Emails that will be CCed on emails to the requester." + } + }, + "inner_properties": null, + "description": "You can configure the issue to contact the requester via email, Slack, in-app chat, or not at all.\n\nIf a destination other than `internal` is specified, a message with the issue's BodyHTML will be delivered to the requester. If you don't wish to immediately contact the requester, you can specify the `internal` destination." + }, + "priority": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The priority of the issue. Can be one of: urgent, high, medium, or low." + }, + "requester_avatar_url": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The URL of an avatar of the requester." + }, + "requester_email": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The email of the user that this issue is on behalf of. Include one of requester_id or requester_email to create an issue with a requester." + }, + "requester_id": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The requester that this issue is on behalf of. Include one of requester_id or requester_email to create an issue with a requester." + }, + "requester_name": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The full name of the user that this issue is on behalf of." + }, + "tags": { + "val_type": "array", + "inner_val_type": "string", + "enum": null, + "properties": null, + "inner_properties": null, + "description": "An array of strings to use as tags on this issue. If provided, the issue tags will be updated to the given tags." + }, + "team_id": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The ID of the team this issue should be assigned to." + }, + "title": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The title of the issue." + }, + "user_id": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "Optional user ID to post the message as. Only one of user_id or contact_id can be provided." + } + }, + "inner_properties": null, + "description": "" + }, + "accepted_as": "body", + "required": false, + "deprecated": false, + "default": null, + "documentation_urls": [] + } + ], + "documentation_urls": [], + "secrets": [ + { + "arcade_key": "PYLON_SECRET_TOKEN", + "parameter_name": "Authorization", + "accepted_as": "header", + "formatted_value": "Bearer {authorization}", + "description": "", + "is_auth_token": false + } + ], + "request_body_spec": "{\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"properties\": {\n \"account_id\": {\n \"description\": \"The account that this issue belongs to.\",\n \"type\": \"string\",\n \"x-go-name\": \"AccountID\"\n },\n \"assignee_id\": {\n \"description\": \"The user the issue should be assigned to.\",\n \"type\": \"string\",\n \"x-go-name\": \"AssigneeID\"\n },\n \"attachment_urls\": {\n \"description\": \"An array of attachment URLs to attach to this issue.\",\n \"items\": {\n \"type\": \"string\"\n },\n \"type\": \"array\",\n \"x-go-name\": \"AttachmentURLs\"\n },\n \"body_html\": {\n \"description\": \"The HTML content of the body of the issue.\",\n \"type\": \"string\",\n \"x-go-name\": \"BodyHTML\"\n },\n \"contact_id\": {\n \"description\": \"Optional contact ID to post the message as. Only one of user_id or contact_id can be provided.\",\n \"type\": \"string\",\n \"x-go-name\": \"ContactID\"\n },\n \"created_at\": {\n \"description\": \"Timestamp of when the issue was created. If not specified, the current time will be used. (RFC3339)\",\n \"type\": \"string\",\n \"x-go-name\": \"CreatedAt\"\n },\n \"custom_fields\": {\n \"description\": \"An array of custom fields to be used on this issue.\",\n \"items\": {\n \"properties\": {\n \"slug\": {\n \"description\": \"The slug of the custom field.\",\n \"type\": \"string\",\n \"x-go-name\": \"Slug\"\n },\n \"value\": {\n \"description\": \"The value of the custom field. Only to be used for single-valued custom fields. If unset, the custom field will be unset. If the custom field is a select field, the value must be the select option slug, which you can find from the GET /custom-fields endpoint.\",\n \"type\": \"string\",\n \"x-go-name\": \"Value\"\n },\n \"values\": {\n \"description\": \"The values of the custom field. Only to be used for multi-valued custom fields (ex. multiselect). If unset, the custom field will be unset. If the custom field is a multiselect field, the values must be the select option slugs which you can find from the GET /custom-fields endpoint.\",\n \"items\": {\n \"type\": \"string\"\n },\n \"type\": \"array\",\n \"x-go-name\": \"Values\"\n }\n },\n \"type\": \"object\",\n \"x-go-package\": \"pylon/api/apiserver/apitypes\"\n },\n \"type\": \"array\",\n \"x-go-name\": \"CustomFields\"\n },\n \"destination_metadata\": {\n \"description\": \"You can configure the issue to contact the requester via email, Slack, in-app chat, or not at all.\\n\\nIf a destination other than `internal` is specified, a message with the issue's BodyHTML will be delivered to the requester. If you don't wish to immediately contact the requester, you can specify the `internal` destination.\",\n \"properties\": {\n \"chat_widget_app_id\": {\n \"description\": \"The ID of the chat widget app to use for in-app chat.\",\n \"type\": \"string\",\n \"x-go-name\": \"ChatWidgetAppID\"\n },\n \"destination\": {\n \"description\": \"The destination type of the issue. Can be \\\"email\\\", \\\"slack\\\", \\\"in_app_chat\\\", or \\\"internal\\\". Defaults to \\\"internal\\\".\\n\\n* slack APIIssueDestinationSlack Deliver to the issue's account's Slack channel.\\n\\n* email APIIssueDestinationEmail Deliver messages to the issue requester via email.\\n\\n* in_app_chat APIIssueDestinationChatWidget Deliver messages to the issue requester via in-app chat.\\n\\n* internal APIIssueDestinationInternal Keep the issue internal and don't contact the requester at all.\",\n \"enum\": [\n \"slack\",\n \"email\",\n \"in_app_chat\",\n \"internal\"\n ],\n \"type\": \"string\",\n \"x-go-enum-desc\": \"slack APIIssueDestinationSlack Deliver to the issue's account's Slack channel.\\nemail APIIssueDestinationEmail Deliver messages to the issue requester via email.\\nin_app_chat APIIssueDestinationChatWidget Deliver messages to the issue requester via in-app chat.\\ninternal APIIssueDestinationInternal Keep the issue internal and don't contact the requester at all.\",\n \"x-go-name\": \"Destination\"\n },\n \"email\": {\n \"description\": \"The email that emails to the requester will be sent from. You must configure an email app in Pylon with this address.\",\n \"type\": \"string\",\n \"x-go-name\": \"Email\"\n },\n \"email_bccs\": {\n \"description\": \"Emails that will be BCCed on emails to the requester.\",\n \"items\": {\n \"type\": \"string\"\n },\n \"type\": \"array\",\n \"x-go-name\": \"EmailBCCs\"\n },\n \"email_ccs\": {\n \"description\": \"Emails that will be CCed on emails to the requester.\",\n \"items\": {\n \"type\": \"string\"\n },\n \"type\": \"array\",\n \"x-go-name\": \"EmailCCs\"\n }\n },\n \"title\": \"DestinationMetadata specifies if/how communication will be delivered to the customer.\",\n \"type\": \"object\",\n \"x-go-package\": \"pylon/api/apiserver/apitypes\"\n },\n \"priority\": {\n \"description\": \"The priority of the issue. Can be one of: urgent, high, medium, or low.\",\n \"type\": \"string\",\n \"x-go-name\": \"Priority\"\n },\n \"requester_avatar_url\": {\n \"description\": \"The URL of an avatar of the requester.\",\n \"type\": \"string\",\n \"x-go-name\": \"RequesterAvatarUrl\"\n },\n \"requester_email\": {\n \"description\": \"The email of the user that this issue is on behalf of. Include one of requester_id or requester_email to create an issue with a requester.\",\n \"type\": \"string\",\n \"x-go-name\": \"RequesterEmail\"\n },\n \"requester_id\": {\n \"description\": \"The requester that this issue is on behalf of. Include one of requester_id or requester_email to create an issue with a requester.\",\n \"type\": \"string\",\n \"x-go-name\": \"RequesterID\"\n },\n \"requester_name\": {\n \"description\": \"The full name of the user that this issue is on behalf of.\",\n \"type\": \"string\",\n \"x-go-name\": \"RequesterName\"\n },\n \"tags\": {\n \"description\": \"An array of strings to use as tags on this issue. If provided, the issue tags will be updated to the given tags.\",\n \"items\": {\n \"type\": \"string\"\n },\n \"type\": \"array\",\n \"x-go-name\": \"Tags\"\n },\n \"team_id\": {\n \"description\": \"The ID of the team this issue should be assigned to.\",\n \"type\": \"string\",\n \"x-go-name\": \"TeamID\"\n },\n \"title\": {\n \"description\": \"The title of the issue.\",\n \"type\": \"string\",\n \"x-go-name\": \"Title\"\n },\n \"user_id\": {\n \"description\": \"Optional user ID to post the message as. Only one of user_id or contact_id can be provided.\",\n \"type\": \"string\",\n \"x-go-name\": \"UserID\"\n }\n },\n \"required\": [\n \"body_html\",\n \"title\"\n ],\n \"type\": \"object\",\n \"x-go-package\": \"pylon/api/apiserver/endpoints\"\n }\n }\n },\n \"required\": false\n}", + "use_request_body_schema_mode": true, + "validate_request_body_schema": true + } +} diff --git a/toolkits/pylon_api/pylon_api/wrapper_tools/CreateNewProject.json b/toolkits/pylon_api/pylon_api/wrapper_tools/CreateNewProject.json new file mode 100644 index 00000000..ac5ac83a --- /dev/null +++ b/toolkits/pylon_api/pylon_api/wrapper_tools/CreateNewProject.json @@ -0,0 +1,335 @@ +{ + "name": "CreateNewProject", + "fully_qualified_name": "PylonApi.CreateNewProject@0.1.0", + "description": "Create a new project seamlessly.\n\nThis tool is used to create a new project. It should be called when a user wants to initialize or start a new project within a system.", + "toolkit": { + "name": "PylonApi", + "description": null, + "version": "0.1.0" + }, + "input": { + "parameters": [ + { + "name": "project_name", + "required": true, + "description": "The name for the new project. This should be a descriptive and unique name to easily identify the project.", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "Name for this project" + }, + "inferrable": true, + "http_endpoint_parameter_name": "name" + }, + { + "name": "account_id_for_project", + "required": true, + "description": "Account ID associated with the project. This identifies the account under which the project will be created.", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "Account ID for this project" + }, + "inferrable": true, + "http_endpoint_parameter_name": "account_id" + }, + { + "name": "project_description_html", + "required": false, + "description": "HTML formatted description for the project, including any necessary tags and formatting.", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "Description HTML for this project" + }, + "inferrable": true, + "http_endpoint_parameter_name": "description_html" + }, + { + "name": "start_date", + "required": false, + "description": "Start date for the project in RFC 3339 format (e.g., 2023-03-10T14:00:00Z).", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "Start date for this project, in RFC 3339 format" + }, + "inferrable": true, + "http_endpoint_parameter_name": "start_date" + }, + { + "name": "project_end_date", + "required": false, + "description": "End date for the project in RFC 3339 format. Indicates when the project is expected to be finished.", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "End date for this project, in RFC 3339 format" + }, + "inferrable": true, + "http_endpoint_parameter_name": "end_date" + }, + { + "name": "project_owner_id", + "required": false, + "description": "The unique identifier for the owner of the project. This is a string that specifies who will be managing or leading the project.", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "Owner ID for this project" + }, + "inferrable": true, + "http_endpoint_parameter_name": "owner_id" + }, + { + "name": "project_template_id", + "required": false, + "description": "The ID of the template to be used for creating this project. It should match an existing project template ID.", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "Project template ID for this project" + }, + "inferrable": true, + "http_endpoint_parameter_name": "project_template_id" + }, + { + "name": "customer_portal_visible", + "required": false, + "description": "Boolean indicating if the project should be visible in the customer portal. True makes it visible.", + "value_schema": { + "val_type": "boolean", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "Customer portal visible for this project" + }, + "inferrable": true, + "http_endpoint_parameter_name": "customer_portal_visible" + } + ] + }, + "output": { + "description": "Response from the API endpoint 'CreateProject'.", + "available_modes": [ + "value", + "error", + "null" + ], + "value_schema": { + "val_type": "json", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": null + } + }, + "requirements": { + "authorization": null, + "secrets": [ + { + "key": "PYLON_SECRET_TOKEN" + } + ], + "metadata": null + }, + "deprecation_message": null, + "metadata": { + "object_type": "api_wrapper_tool", + "version": "1.1.0", + "description": "Tools that enable LLMs to interact directly with the pylon API." + }, + "http_endpoint": { + "metadata": { + "object_type": "http_endpoint", + "version": "1.2.0", + "description": "" + }, + "url": "https://api.usepylon.com/projects", + "http_method": "POST", + "headers": {}, + "parameters": [ + { + "name": "name", + "tool_parameter_name": "project_name", + "description": "Name for this project", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "Name for this project" + }, + "accepted_as": "query", + "required": true, + "deprecated": false, + "default": null, + "documentation_urls": [] + }, + { + "name": "description_html", + "tool_parameter_name": "project_description_html", + "description": "Description HTML for this project", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "Description HTML for this project" + }, + "accepted_as": "query", + "required": false, + "deprecated": false, + "default": null, + "documentation_urls": [] + }, + { + "name": "customer_portal_visible", + "tool_parameter_name": "customer_portal_visible", + "description": "Customer portal visible for this project", + "value_schema": { + "val_type": "boolean", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "Customer portal visible for this project" + }, + "accepted_as": "query", + "required": false, + "deprecated": false, + "default": false, + "documentation_urls": [] + }, + { + "name": "start_date", + "tool_parameter_name": "start_date", + "description": "Start date for this project, in RFC 3339 format", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "Start date for this project, in RFC 3339 format" + }, + "accepted_as": "query", + "required": false, + "deprecated": false, + "default": null, + "documentation_urls": [] + }, + { + "name": "end_date", + "tool_parameter_name": "project_end_date", + "description": "End date for this project, in RFC 3339 format", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "End date for this project, in RFC 3339 format" + }, + "accepted_as": "query", + "required": false, + "deprecated": false, + "default": null, + "documentation_urls": [] + }, + { + "name": "account_id", + "tool_parameter_name": "account_id_for_project", + "description": "Account ID for this project", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "Account ID for this project" + }, + "accepted_as": "query", + "required": true, + "deprecated": false, + "default": null, + "documentation_urls": [] + }, + { + "name": "owner_id", + "tool_parameter_name": "project_owner_id", + "description": "Owner ID for this project", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "Owner ID for this project" + }, + "accepted_as": "query", + "required": false, + "deprecated": false, + "default": null, + "documentation_urls": [] + }, + { + "name": "project_template_id", + "tool_parameter_name": "project_template_id", + "description": "Project template ID for this project", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "Project template ID for this project" + }, + "accepted_as": "query", + "required": false, + "deprecated": false, + "default": null, + "documentation_urls": [] + } + ], + "documentation_urls": [], + "secrets": [ + { + "arcade_key": "PYLON_SECRET_TOKEN", + "parameter_name": "Authorization", + "accepted_as": "header", + "formatted_value": "Bearer {authorization}", + "description": "", + "is_auth_token": false + } + ], + "request_body_spec": null, + "use_request_body_schema_mode": false, + "validate_request_body_schema": false + } +} diff --git a/toolkits/pylon_api/pylon_api/wrapper_tools/CreateNewTag.json b/toolkits/pylon_api/pylon_api/wrapper_tools/CreateNewTag.json new file mode 100644 index 00000000..4931211b --- /dev/null +++ b/toolkits/pylon_api/pylon_api/wrapper_tools/CreateNewTag.json @@ -0,0 +1,154 @@ +{ + "name": "CreateNewTag", + "fully_qualified_name": "PylonApi.CreateNewTag@0.1.0", + "description": "Create a new tag within the system.\n\nThis tool is used to create a new tag by sending a POST request to the /tags endpoint. It should be called when a user wants to add a new tag to the system for organizational or categorization purposes.", + "toolkit": { + "name": "PylonApi", + "description": null, + "version": "0.1.0" + }, + "input": { + "parameters": [ + { + "name": "tag_creation_details", + "required": false, + "description": "A JSON object containing the details of the tag to be created: 'hex_color' for the color code, 'object_type' to specify the associated object ('account', 'issue', or 'contact'), and 'value' for the tag's name.", + "value_schema": { + "val_type": "json", + "inner_val_type": null, + "enum": null, + "properties": { + "hex_color": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The hex code of the tag's color." + }, + "object_type": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The object type of the associated object. Can be \"account\", \"issue\", or \"contact\"." + }, + "value": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The tag value." + } + }, + "inner_properties": null, + "description": "" + }, + "inferrable": true, + "http_endpoint_parameter_name": "requestBody" + } + ] + }, + "output": { + "description": "Response from the API endpoint 'CreateTag'.", + "available_modes": [ + "value", + "error", + "null" + ], + "value_schema": { + "val_type": "json", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": null + } + }, + "requirements": { + "authorization": null, + "secrets": [ + { + "key": "PYLON_SECRET_TOKEN" + } + ], + "metadata": null + }, + "deprecation_message": null, + "metadata": { + "object_type": "api_wrapper_tool", + "version": "1.1.0", + "description": "Tools that enable LLMs to interact directly with the pylon API." + }, + "http_endpoint": { + "metadata": { + "object_type": "http_endpoint", + "version": "1.2.0", + "description": "" + }, + "url": "https://api.usepylon.com/tags", + "http_method": "POST", + "headers": {}, + "parameters": [ + { + "name": "requestBody", + "tool_parameter_name": "tag_creation_details", + "description": "", + "value_schema": { + "val_type": "json", + "inner_val_type": null, + "enum": null, + "properties": { + "hex_color": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The hex code of the tag's color." + }, + "object_type": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The object type of the associated object. Can be \"account\", \"issue\", or \"contact\"." + }, + "value": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The tag value." + } + }, + "inner_properties": null, + "description": "" + }, + "accepted_as": "body", + "required": false, + "deprecated": false, + "default": null, + "documentation_urls": [] + } + ], + "documentation_urls": [], + "secrets": [ + { + "arcade_key": "PYLON_SECRET_TOKEN", + "parameter_name": "Authorization", + "accepted_as": "header", + "formatted_value": "Bearer {authorization}", + "description": "", + "is_auth_token": false + } + ], + "request_body_spec": "{\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"properties\": {\n \"hex_color\": {\n \"description\": \"The hex code of the tag's color.\",\n \"type\": \"string\",\n \"x-go-name\": \"HexColor\"\n },\n \"object_type\": {\n \"description\": \"The object type of the associated object. Can be \\\"account\\\", \\\"issue\\\", or \\\"contact\\\".\",\n \"type\": \"string\",\n \"x-go-name\": \"ObjectType\"\n },\n \"value\": {\n \"description\": \"The tag value.\",\n \"type\": \"string\",\n \"x-go-name\": \"Value\"\n }\n },\n \"required\": [\n \"object_type\",\n \"value\"\n ],\n \"type\": \"object\",\n \"x-go-package\": \"pylon/api/apiserver/endpoints\"\n }\n }\n },\n \"required\": false\n}", + "use_request_body_schema_mode": true, + "validate_request_body_schema": true + } +} diff --git a/toolkits/pylon_api/pylon_api/wrapper_tools/CreateNewTeam.json b/toolkits/pylon_api/pylon_api/wrapper_tools/CreateNewTeam.json new file mode 100644 index 00000000..9b748a2c --- /dev/null +++ b/toolkits/pylon_api/pylon_api/wrapper_tools/CreateNewTeam.json @@ -0,0 +1,137 @@ +{ + "name": "CreateNewTeam", + "fully_qualified_name": "PylonApi.CreateNewTeam@0.1.0", + "description": "Create a new team for collaboration.\n\nUse this tool to create a new team on the platform, facilitating collaboration and organization. It returns details about the newly created team.", + "toolkit": { + "name": "PylonApi", + "description": null, + "version": "0.1.0" + }, + "input": { + "parameters": [ + { + "name": "team_name", + "required": false, + "description": "The name to assign to the newly created team.", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The name of the team." + }, + "inferrable": true, + "http_endpoint_parameter_name": "name" + }, + { + "name": "user_ids_to_add", + "required": false, + "description": "A list of user IDs to include in the new team. Each user ID should be a string.", + "value_schema": { + "val_type": "array", + "inner_val_type": "string", + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The list of user IDs to add to the team." + }, + "inferrable": true, + "http_endpoint_parameter_name": "user_ids" + } + ] + }, + "output": { + "description": "Response from the API endpoint 'CreateTeam'.", + "available_modes": [ + "value", + "error", + "null" + ], + "value_schema": { + "val_type": "json", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": null + } + }, + "requirements": { + "authorization": null, + "secrets": [ + { + "key": "PYLON_SECRET_TOKEN" + } + ], + "metadata": null + }, + "deprecation_message": null, + "metadata": { + "object_type": "api_wrapper_tool", + "version": "1.1.0", + "description": "Tools that enable LLMs to interact directly with the pylon API." + }, + "http_endpoint": { + "metadata": { + "object_type": "http_endpoint", + "version": "1.2.0", + "description": "" + }, + "url": "https://api.usepylon.com/teams", + "http_method": "POST", + "headers": {}, + "parameters": [ + { + "name": "name", + "tool_parameter_name": "team_name", + "description": "The name of the team.", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The name of the team." + }, + "accepted_as": "body", + "required": false, + "deprecated": false, + "default": null, + "documentation_urls": [] + }, + { + "name": "user_ids", + "tool_parameter_name": "user_ids_to_add", + "description": "The list of user IDs to add to the team.", + "value_schema": { + "val_type": "array", + "inner_val_type": "string", + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The list of user IDs to add to the team." + }, + "accepted_as": "body", + "required": false, + "deprecated": false, + "default": null, + "documentation_urls": [] + } + ], + "documentation_urls": [], + "secrets": [ + { + "arcade_key": "PYLON_SECRET_TOKEN", + "parameter_name": "Authorization", + "accepted_as": "header", + "formatted_value": "Bearer {authorization}", + "description": "", + "is_auth_token": false + } + ], + "request_body_spec": "{\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"properties\": {\n \"name\": {\n \"description\": \"The name of the team.\",\n \"type\": \"string\",\n \"x-go-name\": \"Name\"\n },\n \"user_ids\": {\n \"description\": \"The list of user IDs to add to the team.\",\n \"items\": {\n \"type\": \"string\"\n },\n \"type\": \"array\",\n \"x-go-name\": \"UserIDs\"\n }\n },\n \"type\": \"object\",\n \"x-go-package\": \"pylon/api/apiserver/endpoints\"\n }\n }\n },\n \"required\": false\n}", + "use_request_body_schema_mode": false, + "validate_request_body_schema": false + } +} diff --git a/toolkits/pylon_api/pylon_api/wrapper_tools/CreateRouteRedirect.json b/toolkits/pylon_api/pylon_api/wrapper_tools/CreateRouteRedirect.json new file mode 100644 index 00000000..2674fb4e --- /dev/null +++ b/toolkits/pylon_api/pylon_api/wrapper_tools/CreateRouteRedirect.json @@ -0,0 +1,203 @@ +{ + "name": "CreateRouteRedirect", + "fully_qualified_name": "PylonApi.CreateRouteRedirect@0.1.0", + "description": "Create a new route redirect for a knowledge base.\n\nThis tool is used to create a new route redirect within a specified knowledge base. It should be called when you need to add a redirect to manage or alter the routing within a knowledge base.", + "toolkit": { + "name": "PylonApi", + "description": null, + "version": "0.1.0" + }, + "input": { + "parameters": [ + { + "name": "knowledge_base_id", + "required": true, + "description": "The unique identifier for the knowledge base where the route redirect will be added.", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The ID of the knowledge base the route redirect is being added to." + }, + "inferrable": true, + "http_endpoint_parameter_name": "id" + }, + { + "name": "route_redirect_details", + "required": false, + "description": "JSON object with details for creating the route redirect, including 'from_path', 'language', 'object_id', and 'object_type'.", + "value_schema": { + "val_type": "json", + "inner_val_type": null, + "enum": null, + "properties": { + "from_path": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The path to redirect from." + }, + "language": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "Language of the object to redirect to. If not specified, the default language of the knowledge base will be used." + }, + "object_id": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The ID of the object to redirect to." + }, + "object_type": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The type of the object to redirect to. This must be \"article\"." + } + }, + "inner_properties": null, + "description": "" + }, + "inferrable": true, + "http_endpoint_parameter_name": "requestBody" + } + ] + }, + "output": { + "description": "Response from the API endpoint 'CreateRouteRedirect'.", + "available_modes": [ + "value", + "error", + "null" + ], + "value_schema": { + "val_type": "json", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": null + } + }, + "requirements": { + "authorization": null, + "secrets": [ + { + "key": "PYLON_SECRET_TOKEN" + } + ], + "metadata": null + }, + "deprecation_message": null, + "metadata": { + "object_type": "api_wrapper_tool", + "version": "1.1.0", + "description": "Tools that enable LLMs to interact directly with the pylon API." + }, + "http_endpoint": { + "metadata": { + "object_type": "http_endpoint", + "version": "1.2.0", + "description": "" + }, + "url": "https://api.usepylon.com/knowledge-bases/{id}/route-redirects", + "http_method": "POST", + "headers": {}, + "parameters": [ + { + "name": "id", + "tool_parameter_name": "knowledge_base_id", + "description": "The ID of the knowledge base the route redirect is being added to.", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The ID of the knowledge base the route redirect is being added to." + }, + "accepted_as": "path", + "required": true, + "deprecated": false, + "default": null, + "documentation_urls": [] + }, + { + "name": "requestBody", + "tool_parameter_name": "route_redirect_details", + "description": "", + "value_schema": { + "val_type": "json", + "inner_val_type": null, + "enum": null, + "properties": { + "from_path": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The path to redirect from." + }, + "language": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "Language of the object to redirect to. If not specified, the default language of the knowledge base will be used." + }, + "object_id": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The ID of the object to redirect to." + }, + "object_type": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The type of the object to redirect to. This must be \"article\"." + } + }, + "inner_properties": null, + "description": "" + }, + "accepted_as": "body", + "required": false, + "deprecated": false, + "default": null, + "documentation_urls": [] + } + ], + "documentation_urls": [], + "secrets": [ + { + "arcade_key": "PYLON_SECRET_TOKEN", + "parameter_name": "Authorization", + "accepted_as": "header", + "formatted_value": "Bearer {authorization}", + "description": "", + "is_auth_token": false + } + ], + "request_body_spec": "{\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"properties\": {\n \"from_path\": {\n \"description\": \"The path to redirect from.\",\n \"type\": \"string\",\n \"x-go-name\": \"FromPath\"\n },\n \"language\": {\n \"description\": \"Language of the object to redirect to. If not specified, the default language of the knowledge base will be used.\",\n \"type\": \"string\",\n \"x-go-name\": \"Language\"\n },\n \"object_id\": {\n \"description\": \"The ID of the object to redirect to.\",\n \"type\": \"string\",\n \"x-go-name\": \"ObjectID\"\n },\n \"object_type\": {\n \"description\": \"The type of the object to redirect to. This must be \\\"article\\\".\",\n \"type\": \"string\",\n \"x-go-name\": \"ObjectType\"\n }\n },\n \"required\": [\n \"from_path\",\n \"object_id\",\n \"object_type\"\n ],\n \"type\": \"object\",\n \"x-go-package\": \"pylon/api/apiserver/endpoints\"\n }\n }\n },\n \"required\": false\n}", + "use_request_body_schema_mode": true, + "validate_request_body_schema": true + } +} diff --git a/toolkits/pylon_api/pylon_api/wrapper_tools/CreateTask.json b/toolkits/pylon_api/pylon_api/wrapper_tools/CreateTask.json new file mode 100644 index 00000000..762ee725 --- /dev/null +++ b/toolkits/pylon_api/pylon_api/wrapper_tools/CreateTask.json @@ -0,0 +1,376 @@ +{ + "name": "CreateTask", + "fully_qualified_name": "PylonApi.CreateTask@0.1.0", + "description": "Create a new task with specified parameters.\n\nUse this tool to create a task. It should be called when a new task needs to be added to the system, specifying necessary parameters.", + "toolkit": { + "name": "PylonApi", + "description": null, + "version": "0.1.0" + }, + "input": { + "parameters": [ + { + "name": "task_title", + "required": true, + "description": "The title of the task to be created. It should summarize the task clearly and concisely.", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "Title for this task" + }, + "inferrable": true, + "http_endpoint_parameter_name": "title" + }, + { + "name": "task_body_html", + "required": false, + "description": "HTML content for the task body. Provide detailed information or instructions here using HTML formatting.", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "Body HTML for this task" + }, + "inferrable": true, + "http_endpoint_parameter_name": "body_html" + }, + { + "name": "milestone_id", + "required": false, + "description": "Unique identifier for the milestone associated with the task.", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "Milestone ID for this task" + }, + "inferrable": true, + "http_endpoint_parameter_name": "milestone_id" + }, + { + "name": "task_status", + "required": false, + "description": "Set the task's current status: 'not_started', 'in_progress', or 'completed'.", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": [ + "not_started", + "in_progress", + "completed" + ], + "properties": null, + "inner_properties": null, + "description": "Status for this task\n\nnot_started TaskStatusNotStarted\n\nin_progress TaskStatusInProgress\n\ncompleted TaskStatusCompleted" + }, + "inferrable": true, + "http_endpoint_parameter_name": "status" + }, + { + "name": "task_due_date", + "required": false, + "description": "Due date for the task, formatted in RFC 3339. Specify the date by which the task should be completed.", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "Due date for this task, in RFC 3339 format" + }, + "inferrable": true, + "http_endpoint_parameter_name": "due_date" + }, + { + "name": "task_assignee_id", + "required": false, + "description": "The ID of the user to whom the task is assigned. It should be a valid user ID in the system.", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "Assignee ID for this task" + }, + "inferrable": true, + "http_endpoint_parameter_name": "assignee_id" + }, + { + "name": "account_id_for_task", + "required": false, + "description": "Specify the Account ID associated with this task.", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "Account ID for this task" + }, + "inferrable": true, + "http_endpoint_parameter_name": "account_id" + }, + { + "name": "project_id", + "required": false, + "description": "Unique identifier for the project to which this task belongs.", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "Project ID for this task" + }, + "inferrable": true, + "http_endpoint_parameter_name": "project_id" + }, + { + "name": "make_customer_portal_visible", + "required": false, + "description": "Set to true to make the task visible on the customer portal, false to hide it.", + "value_schema": { + "val_type": "boolean", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "Customer portal visible for this task" + }, + "inferrable": true, + "http_endpoint_parameter_name": "customer_portal_visible" + } + ] + }, + "output": { + "description": "Response from the API endpoint 'CreateTask'.", + "available_modes": [ + "value", + "error", + "null" + ], + "value_schema": { + "val_type": "json", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": null + } + }, + "requirements": { + "authorization": null, + "secrets": [ + { + "key": "PYLON_SECRET_TOKEN" + } + ], + "metadata": null + }, + "deprecation_message": null, + "metadata": { + "object_type": "api_wrapper_tool", + "version": "1.1.0", + "description": "Tools that enable LLMs to interact directly with the pylon API." + }, + "http_endpoint": { + "metadata": { + "object_type": "http_endpoint", + "version": "1.2.0", + "description": "" + }, + "url": "https://api.usepylon.com/tasks", + "http_method": "POST", + "headers": {}, + "parameters": [ + { + "name": "title", + "tool_parameter_name": "task_title", + "description": "Title for this task", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "Title for this task" + }, + "accepted_as": "query", + "required": true, + "deprecated": false, + "default": null, + "documentation_urls": [] + }, + { + "name": "body_html", + "tool_parameter_name": "task_body_html", + "description": "Body HTML for this task", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "Body HTML for this task" + }, + "accepted_as": "query", + "required": false, + "deprecated": false, + "default": null, + "documentation_urls": [] + }, + { + "name": "milestone_id", + "tool_parameter_name": "milestone_id", + "description": "Milestone ID for this task", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "Milestone ID for this task" + }, + "accepted_as": "query", + "required": false, + "deprecated": false, + "default": null, + "documentation_urls": [] + }, + { + "name": "status", + "tool_parameter_name": "task_status", + "description": "Status for this task\n\nnot_started TaskStatusNotStarted\n\nin_progress TaskStatusInProgress\n\ncompleted TaskStatusCompleted", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": [ + "not_started", + "in_progress", + "completed" + ], + "properties": null, + "inner_properties": null, + "description": "Status for this task\n\nnot_started TaskStatusNotStarted\n\nin_progress TaskStatusInProgress\n\ncompleted TaskStatusCompleted" + }, + "accepted_as": "query", + "required": false, + "deprecated": false, + "default": null, + "documentation_urls": [] + }, + { + "name": "customer_portal_visible", + "tool_parameter_name": "make_customer_portal_visible", + "description": "Customer portal visible for this task", + "value_schema": { + "val_type": "boolean", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "Customer portal visible for this task" + }, + "accepted_as": "query", + "required": false, + "deprecated": false, + "default": false, + "documentation_urls": [] + }, + { + "name": "due_date", + "tool_parameter_name": "task_due_date", + "description": "Due date for this task, in RFC 3339 format", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "Due date for this task, in RFC 3339 format" + }, + "accepted_as": "query", + "required": false, + "deprecated": false, + "default": null, + "documentation_urls": [] + }, + { + "name": "assignee_id", + "tool_parameter_name": "task_assignee_id", + "description": "Assignee ID for this task", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "Assignee ID for this task" + }, + "accepted_as": "query", + "required": false, + "deprecated": false, + "default": null, + "documentation_urls": [] + }, + { + "name": "account_id", + "tool_parameter_name": "account_id_for_task", + "description": "Account ID for this task", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "Account ID for this task" + }, + "accepted_as": "query", + "required": false, + "deprecated": false, + "default": null, + "documentation_urls": [] + }, + { + "name": "project_id", + "tool_parameter_name": "project_id", + "description": "Project ID for this task", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "Project ID for this task" + }, + "accepted_as": "query", + "required": false, + "deprecated": false, + "default": null, + "documentation_urls": [] + } + ], + "documentation_urls": [], + "secrets": [ + { + "arcade_key": "PYLON_SECRET_TOKEN", + "parameter_name": "Authorization", + "accepted_as": "header", + "formatted_value": "Bearer {authorization}", + "description": "", + "is_auth_token": false + } + ], + "request_body_spec": null, + "use_request_body_schema_mode": false, + "validate_request_body_schema": false + } +} diff --git a/toolkits/pylon_api/pylon_api/wrapper_tools/CreateTrainingDataConfig.json b/toolkits/pylon_api/pylon_api/wrapper_tools/CreateTrainingDataConfig.json new file mode 100644 index 00000000..8d6190b5 --- /dev/null +++ b/toolkits/pylon_api/pylon_api/wrapper_tools/CreateTrainingDataConfig.json @@ -0,0 +1,137 @@ +{ + "name": "CreateTrainingDataConfig", + "fully_qualified_name": "PylonApi.CreateTrainingDataConfig@0.1.0", + "description": "Create a new training data configuration.\n\nCall this tool to set up a new training data configuration for your application. It is used when you need to initialize or update your training data setup.", + "toolkit": { + "name": "PylonApi", + "description": null, + "version": "0.1.0" + }, + "input": { + "parameters": [ + { + "name": "training_data_name", + "required": false, + "description": "The name of the training data container to be created.", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The name of the training data container." + }, + "inferrable": true, + "http_endpoint_parameter_name": "training_data_name" + }, + { + "name": "training_data_visibility", + "required": false, + "description": "Specifies who can access the training data. Valid options: \"everyone\", \"user_only\", \"ai_agent_only\". Defaults to \"everyone\".", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The visibility of the training data. Defaults to \"everyone\".\n\nValid values: \"everyone\", \"user_only\", \"ai_agent_only\"" + }, + "inferrable": true, + "http_endpoint_parameter_name": "visibility" + } + ] + }, + "output": { + "description": "Response from the API endpoint 'CreateTrainingData'.", + "available_modes": [ + "value", + "error", + "null" + ], + "value_schema": { + "val_type": "json", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": null + } + }, + "requirements": { + "authorization": null, + "secrets": [ + { + "key": "PYLON_SECRET_TOKEN" + } + ], + "metadata": null + }, + "deprecation_message": null, + "metadata": { + "object_type": "api_wrapper_tool", + "version": "1.1.0", + "description": "Tools that enable LLMs to interact directly with the pylon API." + }, + "http_endpoint": { + "metadata": { + "object_type": "http_endpoint", + "version": "1.2.0", + "description": "" + }, + "url": "https://api.usepylon.com/training-data", + "http_method": "POST", + "headers": {}, + "parameters": [ + { + "name": "training_data_name", + "tool_parameter_name": "training_data_name", + "description": "The name of the training data container.", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The name of the training data container." + }, + "accepted_as": "body", + "required": false, + "deprecated": false, + "default": null, + "documentation_urls": [] + }, + { + "name": "visibility", + "tool_parameter_name": "training_data_visibility", + "description": "The visibility of the training data. Defaults to \"everyone\".\n\nValid values: \"everyone\", \"user_only\", \"ai_agent_only\"", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The visibility of the training data. Defaults to \"everyone\".\n\nValid values: \"everyone\", \"user_only\", \"ai_agent_only\"" + }, + "accepted_as": "body", + "required": false, + "deprecated": false, + "default": null, + "documentation_urls": [] + } + ], + "documentation_urls": [], + "secrets": [ + { + "arcade_key": "PYLON_SECRET_TOKEN", + "parameter_name": "Authorization", + "accepted_as": "header", + "formatted_value": "Bearer {authorization}", + "description": "", + "is_auth_token": false + } + ], + "request_body_spec": "{\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"properties\": {\n \"training_data_name\": {\n \"description\": \"The name of the training data container.\",\n \"type\": \"string\",\n \"x-go-name\": \"TrainingDataName\"\n },\n \"visibility\": {\n \"description\": \"The visibility of the training data. Defaults to \\\"everyone\\\".\\n\\nValid values: \\\"everyone\\\", \\\"user_only\\\", \\\"ai_agent_only\\\"\",\n \"type\": \"string\",\n \"x-go-name\": \"Visibility\"\n }\n },\n \"type\": \"object\",\n \"x-go-package\": \"pylon/api/apiserver/endpoints\"\n }\n }\n },\n \"required\": false\n}", + "use_request_body_schema_mode": false, + "validate_request_body_schema": false + } +} diff --git a/toolkits/pylon_api/pylon_api/wrapper_tools/DeleteAccount.json b/toolkits/pylon_api/pylon_api/wrapper_tools/DeleteAccount.json new file mode 100644 index 00000000..ea13bada --- /dev/null +++ b/toolkits/pylon_api/pylon_api/wrapper_tools/DeleteAccount.json @@ -0,0 +1,104 @@ +{ + "name": "DeleteAccount", + "fully_qualified_name": "PylonApi.DeleteAccount@0.1.0", + "description": "Delete an existing account.\n\nThis tool deletes an existing account based on the provided account ID. Call this tool when you need to permanently remove an account.", + "toolkit": { + "name": "PylonApi", + "description": null, + "version": "0.1.0" + }, + "input": { + "parameters": [ + { + "name": "account_id", + "required": true, + "description": "The ID or external ID of the account to delete.", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The ID or external ID of the account to delete." + }, + "inferrable": true, + "http_endpoint_parameter_name": "id" + } + ] + }, + "output": { + "description": "Response from the API endpoint 'DeleteAccount'.", + "available_modes": [ + "value", + "error", + "null" + ], + "value_schema": { + "val_type": "json", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": null + } + }, + "requirements": { + "authorization": null, + "secrets": [ + { + "key": "PYLON_SECRET_TOKEN" + } + ], + "metadata": null + }, + "deprecation_message": null, + "metadata": { + "object_type": "api_wrapper_tool", + "version": "1.1.0", + "description": "Tools that enable LLMs to interact directly with the pylon API." + }, + "http_endpoint": { + "metadata": { + "object_type": "http_endpoint", + "version": "1.2.0", + "description": "" + }, + "url": "https://api.usepylon.com/accounts/{id}", + "http_method": "DELETE", + "headers": {}, + "parameters": [ + { + "name": "id", + "tool_parameter_name": "account_id", + "description": "The ID or external ID of the account to delete.", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The ID or external ID of the account to delete." + }, + "accepted_as": "path", + "required": true, + "deprecated": false, + "default": null, + "documentation_urls": [] + } + ], + "documentation_urls": [], + "secrets": [ + { + "arcade_key": "PYLON_SECRET_TOKEN", + "parameter_name": "Authorization", + "accepted_as": "header", + "formatted_value": "Bearer {authorization}", + "description": "", + "is_auth_token": false + } + ], + "request_body_spec": null, + "use_request_body_schema_mode": false, + "validate_request_body_schema": false + } +} diff --git a/toolkits/pylon_api/pylon_api/wrapper_tools/DeleteAccountHighlight.json b/toolkits/pylon_api/pylon_api/wrapper_tools/DeleteAccountHighlight.json new file mode 100644 index 00000000..c758f831 --- /dev/null +++ b/toolkits/pylon_api/pylon_api/wrapper_tools/DeleteAccountHighlight.json @@ -0,0 +1,137 @@ +{ + "name": "DeleteAccountHighlight", + "fully_qualified_name": "PylonApi.DeleteAccountHighlight@0.1.0", + "description": "Delete a specific highlight from an account.\n\nUse this tool to delete a specific highlight by providing the account ID and highlight ID. It should be called when a user wants to remove a highlight linked to an account.", + "toolkit": { + "name": "PylonApi", + "description": null, + "version": "0.1.0" + }, + "input": { + "parameters": [ + { + "name": "account_identifier", + "required": true, + "description": "The ID or external ID of the account that the highlight belongs to. Can be a UUID or any string.", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The ID or external ID of the account that the highlight belongs to." + }, + "inferrable": true, + "http_endpoint_parameter_name": "account_id" + }, + { + "name": "highlight_id", + "required": true, + "description": "The unique ID of the highlight you intend to delete.", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The ID of the highlight to delete." + }, + "inferrable": true, + "http_endpoint_parameter_name": "highlight_id" + } + ] + }, + "output": { + "description": "Response from the API endpoint 'DeleteAccountHighlight'.", + "available_modes": [ + "value", + "error", + "null" + ], + "value_schema": { + "val_type": "json", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": null + } + }, + "requirements": { + "authorization": null, + "secrets": [ + { + "key": "PYLON_SECRET_TOKEN" + } + ], + "metadata": null + }, + "deprecation_message": null, + "metadata": { + "object_type": "api_wrapper_tool", + "version": "1.1.0", + "description": "Tools that enable LLMs to interact directly with the pylon API." + }, + "http_endpoint": { + "metadata": { + "object_type": "http_endpoint", + "version": "1.2.0", + "description": "" + }, + "url": "https://api.usepylon.com/accounts/{account_id}/highlights/{highlight_id}", + "http_method": "DELETE", + "headers": {}, + "parameters": [ + { + "name": "account_id", + "tool_parameter_name": "account_identifier", + "description": "The ID or external ID of the account that the highlight belongs to.", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The ID or external ID of the account that the highlight belongs to." + }, + "accepted_as": "path", + "required": true, + "deprecated": false, + "default": null, + "documentation_urls": [] + }, + { + "name": "highlight_id", + "tool_parameter_name": "highlight_id", + "description": "The ID of the highlight to delete.", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The ID of the highlight to delete." + }, + "accepted_as": "path", + "required": true, + "deprecated": false, + "default": null, + "documentation_urls": [] + } + ], + "documentation_urls": [], + "secrets": [ + { + "arcade_key": "PYLON_SECRET_TOKEN", + "parameter_name": "Authorization", + "accepted_as": "header", + "formatted_value": "Bearer {authorization}", + "description": "", + "is_auth_token": false + } + ], + "request_body_spec": null, + "use_request_body_schema_mode": false, + "validate_request_body_schema": false + } +} diff --git a/toolkits/pylon_api/pylon_api/wrapper_tools/DeleteArticle.json b/toolkits/pylon_api/pylon_api/wrapper_tools/DeleteArticle.json new file mode 100644 index 00000000..4f116168 --- /dev/null +++ b/toolkits/pylon_api/pylon_api/wrapper_tools/DeleteArticle.json @@ -0,0 +1,137 @@ +{ + "name": "DeleteArticle", + "fully_qualified_name": "PylonApi.DeleteArticle@0.1.0", + "description": "Delete an existing article from a knowledge base.\n\nCall this tool to remove an article from a knowledge base by specifying the knowledge base and article IDs.", + "toolkit": { + "name": "PylonApi", + "description": null, + "version": "0.1.0" + }, + "input": { + "parameters": [ + { + "name": "knowledge_base_id", + "required": true, + "description": "The KnowledgeBaseID of the article to delete.", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The KnowledgeBaseID of the article to delete." + }, + "inferrable": true, + "http_endpoint_parameter_name": "id" + }, + { + "name": "article_id", + "required": true, + "description": "The ID of the article that needs to be deleted from the knowledge base.", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The ID of the article to delete." + }, + "inferrable": true, + "http_endpoint_parameter_name": "article_id" + } + ] + }, + "output": { + "description": "Response from the API endpoint 'DeleteArticle'.", + "available_modes": [ + "value", + "error", + "null" + ], + "value_schema": { + "val_type": "json", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": null + } + }, + "requirements": { + "authorization": null, + "secrets": [ + { + "key": "PYLON_SECRET_TOKEN" + } + ], + "metadata": null + }, + "deprecation_message": null, + "metadata": { + "object_type": "api_wrapper_tool", + "version": "1.1.0", + "description": "Tools that enable LLMs to interact directly with the pylon API." + }, + "http_endpoint": { + "metadata": { + "object_type": "http_endpoint", + "version": "1.2.0", + "description": "" + }, + "url": "https://api.usepylon.com/knowledge-bases/{id}/articles/{article_id}", + "http_method": "DELETE", + "headers": {}, + "parameters": [ + { + "name": "id", + "tool_parameter_name": "knowledge_base_id", + "description": "The KnowledgeBaseID of the article to delete.", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The KnowledgeBaseID of the article to delete." + }, + "accepted_as": "path", + "required": true, + "deprecated": false, + "default": null, + "documentation_urls": [] + }, + { + "name": "article_id", + "tool_parameter_name": "article_id", + "description": "The ID of the article to delete.", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The ID of the article to delete." + }, + "accepted_as": "path", + "required": true, + "deprecated": false, + "default": null, + "documentation_urls": [] + } + ], + "documentation_urls": [], + "secrets": [ + { + "arcade_key": "PYLON_SECRET_TOKEN", + "parameter_name": "Authorization", + "accepted_as": "header", + "formatted_value": "Bearer {authorization}", + "description": "", + "is_auth_token": false + } + ], + "request_body_spec": null, + "use_request_body_schema_mode": false, + "validate_request_body_schema": false + } +} diff --git a/toolkits/pylon_api/pylon_api/wrapper_tools/DeleteContact.json b/toolkits/pylon_api/pylon_api/wrapper_tools/DeleteContact.json new file mode 100644 index 00000000..035cad73 --- /dev/null +++ b/toolkits/pylon_api/pylon_api/wrapper_tools/DeleteContact.json @@ -0,0 +1,104 @@ +{ + "name": "DeleteContact", + "fully_qualified_name": "PylonApi.DeleteContact@0.1.0", + "description": "Delete an existing contact by ID.\n\nThis tool deletes a contact by its ID. It should be called when a user needs to remove a contact from the system.", + "toolkit": { + "name": "PylonApi", + "description": null, + "version": "0.1.0" + }, + "input": { + "parameters": [ + { + "name": "contact_id", + "required": true, + "description": "The ID of the contact to be deleted.", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The ID of the contact to delete." + }, + "inferrable": true, + "http_endpoint_parameter_name": "id" + } + ] + }, + "output": { + "description": "Response from the API endpoint 'DeleteContact'.", + "available_modes": [ + "value", + "error", + "null" + ], + "value_schema": { + "val_type": "json", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": null + } + }, + "requirements": { + "authorization": null, + "secrets": [ + { + "key": "PYLON_SECRET_TOKEN" + } + ], + "metadata": null + }, + "deprecation_message": null, + "metadata": { + "object_type": "api_wrapper_tool", + "version": "1.1.0", + "description": "Tools that enable LLMs to interact directly with the pylon API." + }, + "http_endpoint": { + "metadata": { + "object_type": "http_endpoint", + "version": "1.2.0", + "description": "" + }, + "url": "https://api.usepylon.com/contacts/{id}", + "http_method": "DELETE", + "headers": {}, + "parameters": [ + { + "name": "id", + "tool_parameter_name": "contact_id", + "description": "The ID of the contact to delete.", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The ID of the contact to delete." + }, + "accepted_as": "path", + "required": true, + "deprecated": false, + "default": null, + "documentation_urls": [] + } + ], + "documentation_urls": [], + "secrets": [ + { + "arcade_key": "PYLON_SECRET_TOKEN", + "parameter_name": "Authorization", + "accepted_as": "header", + "formatted_value": "Bearer {authorization}", + "description": "", + "is_auth_token": false + } + ], + "request_body_spec": null, + "use_request_body_schema_mode": false, + "validate_request_body_schema": false + } +} diff --git a/toolkits/pylon_api/pylon_api/wrapper_tools/DeleteExistingProject.json b/toolkits/pylon_api/pylon_api/wrapper_tools/DeleteExistingProject.json new file mode 100644 index 00000000..ae843e38 --- /dev/null +++ b/toolkits/pylon_api/pylon_api/wrapper_tools/DeleteExistingProject.json @@ -0,0 +1,104 @@ +{ + "name": "DeleteExistingProject", + "fully_qualified_name": "PylonApi.DeleteExistingProject@0.1.0", + "description": "Delete an existing project using its ID.\n\nUse this tool to delete an existing project by providing the project ID. It allows you to manage and remove projects that are no longer needed.", + "toolkit": { + "name": "PylonApi", + "description": null, + "version": "0.1.0" + }, + "input": { + "parameters": [ + { + "name": "project_id", + "required": true, + "description": "The unique identifier of the project to be deleted.", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The ID of the project to delete." + }, + "inferrable": true, + "http_endpoint_parameter_name": "id" + } + ] + }, + "output": { + "description": "Response from the API endpoint 'DeleteProject'.", + "available_modes": [ + "value", + "error", + "null" + ], + "value_schema": { + "val_type": "json", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": null + } + }, + "requirements": { + "authorization": null, + "secrets": [ + { + "key": "PYLON_SECRET_TOKEN" + } + ], + "metadata": null + }, + "deprecation_message": null, + "metadata": { + "object_type": "api_wrapper_tool", + "version": "1.1.0", + "description": "Tools that enable LLMs to interact directly with the pylon API." + }, + "http_endpoint": { + "metadata": { + "object_type": "http_endpoint", + "version": "1.2.0", + "description": "" + }, + "url": "https://api.usepylon.com/projects/{id}", + "http_method": "DELETE", + "headers": {}, + "parameters": [ + { + "name": "id", + "tool_parameter_name": "project_id", + "description": "The ID of the project to delete.", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The ID of the project to delete." + }, + "accepted_as": "path", + "required": true, + "deprecated": false, + "default": null, + "documentation_urls": [] + } + ], + "documentation_urls": [], + "secrets": [ + { + "arcade_key": "PYLON_SECRET_TOKEN", + "parameter_name": "Authorization", + "accepted_as": "header", + "formatted_value": "Bearer {authorization}", + "description": "", + "is_auth_token": false + } + ], + "request_body_spec": null, + "use_request_body_schema_mode": false, + "validate_request_body_schema": false + } +} diff --git a/toolkits/pylon_api/pylon_api/wrapper_tools/DeleteExistingTag.json b/toolkits/pylon_api/pylon_api/wrapper_tools/DeleteExistingTag.json new file mode 100644 index 00000000..c54862ef --- /dev/null +++ b/toolkits/pylon_api/pylon_api/wrapper_tools/DeleteExistingTag.json @@ -0,0 +1,104 @@ +{ + "name": "DeleteExistingTag", + "fully_qualified_name": "PylonApi.DeleteExistingTag@0.1.0", + "description": "Delete an existing tag by ID.\n\nUse this tool to delete an existing tag by specifying its ID. It confirms whether the deletion was successful.", + "toolkit": { + "name": "PylonApi", + "description": null, + "version": "0.1.0" + }, + "input": { + "parameters": [ + { + "name": "tag_id", + "required": true, + "description": "The unique identifier of the tag to delete. Provide this ID to specify which tag should be removed.", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The ID of the tag to update." + }, + "inferrable": true, + "http_endpoint_parameter_name": "id" + } + ] + }, + "output": { + "description": "Response from the API endpoint 'DeleteTag'.", + "available_modes": [ + "value", + "error", + "null" + ], + "value_schema": { + "val_type": "json", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": null + } + }, + "requirements": { + "authorization": null, + "secrets": [ + { + "key": "PYLON_SECRET_TOKEN" + } + ], + "metadata": null + }, + "deprecation_message": null, + "metadata": { + "object_type": "api_wrapper_tool", + "version": "1.1.0", + "description": "Tools that enable LLMs to interact directly with the pylon API." + }, + "http_endpoint": { + "metadata": { + "object_type": "http_endpoint", + "version": "1.2.0", + "description": "" + }, + "url": "https://api.usepylon.com/tags/{id}", + "http_method": "DELETE", + "headers": {}, + "parameters": [ + { + "name": "id", + "tool_parameter_name": "tag_id", + "description": "The ID of the tag to update.", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The ID of the tag to update." + }, + "accepted_as": "path", + "required": true, + "deprecated": false, + "default": null, + "documentation_urls": [] + } + ], + "documentation_urls": [], + "secrets": [ + { + "arcade_key": "PYLON_SECRET_TOKEN", + "parameter_name": "Authorization", + "accepted_as": "header", + "formatted_value": "Bearer {authorization}", + "description": "", + "is_auth_token": false + } + ], + "request_body_spec": null, + "use_request_body_schema_mode": false, + "validate_request_body_schema": false + } +} diff --git a/toolkits/pylon_api/pylon_api/wrapper_tools/DeleteIssue.json b/toolkits/pylon_api/pylon_api/wrapper_tools/DeleteIssue.json new file mode 100644 index 00000000..b23f241d --- /dev/null +++ b/toolkits/pylon_api/pylon_api/wrapper_tools/DeleteIssue.json @@ -0,0 +1,104 @@ +{ + "name": "DeleteIssue", + "fully_qualified_name": "PylonApi.DeleteIssue@0.1.0", + "description": "Delete an existing issue by ID.\n\nUse this tool to delete an issue from the system by providing its ID. It is ideal for scenarios where issues need to be managed or cleaned up.", + "toolkit": { + "name": "PylonApi", + "description": null, + "version": "0.1.0" + }, + "input": { + "parameters": [ + { + "name": "issue_id", + "required": true, + "description": "The unique identifier of the issue to delete.", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The ID of the issue to delete." + }, + "inferrable": true, + "http_endpoint_parameter_name": "id" + } + ] + }, + "output": { + "description": "Response from the API endpoint 'DeleteIssue'.", + "available_modes": [ + "value", + "error", + "null" + ], + "value_schema": { + "val_type": "json", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": null + } + }, + "requirements": { + "authorization": null, + "secrets": [ + { + "key": "PYLON_SECRET_TOKEN" + } + ], + "metadata": null + }, + "deprecation_message": null, + "metadata": { + "object_type": "api_wrapper_tool", + "version": "1.1.0", + "description": "Tools that enable LLMs to interact directly with the pylon API." + }, + "http_endpoint": { + "metadata": { + "object_type": "http_endpoint", + "version": "1.2.0", + "description": "" + }, + "url": "https://api.usepylon.com/issues/{id}", + "http_method": "DELETE", + "headers": {}, + "parameters": [ + { + "name": "id", + "tool_parameter_name": "issue_id", + "description": "The ID of the issue to delete.", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The ID of the issue to delete." + }, + "accepted_as": "path", + "required": true, + "deprecated": false, + "default": null, + "documentation_urls": [] + } + ], + "documentation_urls": [], + "secrets": [ + { + "arcade_key": "PYLON_SECRET_TOKEN", + "parameter_name": "Authorization", + "accepted_as": "header", + "formatted_value": "Bearer {authorization}", + "description": "", + "is_auth_token": false + } + ], + "request_body_spec": null, + "use_request_body_schema_mode": false, + "validate_request_body_schema": false + } +} diff --git a/toolkits/pylon_api/pylon_api/wrapper_tools/DeleteMilestone.json b/toolkits/pylon_api/pylon_api/wrapper_tools/DeleteMilestone.json new file mode 100644 index 00000000..439c3b4c --- /dev/null +++ b/toolkits/pylon_api/pylon_api/wrapper_tools/DeleteMilestone.json @@ -0,0 +1,104 @@ +{ + "name": "DeleteMilestone", + "fully_qualified_name": "PylonApi.DeleteMilestone@0.1.0", + "description": "Delete a specific milestone using its ID.\n\nUse this tool to remove a milestone by providing its unique ID. This operation is irreversible and should be used when a milestone is no longer needed.", + "toolkit": { + "name": "PylonApi", + "description": null, + "version": "0.1.0" + }, + "input": { + "parameters": [ + { + "name": "milestone_id", + "required": true, + "description": "The unique ID of the milestone to be deleted. Ensure it is correct as this action is irreversible.", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The ID of the milestone to delete." + }, + "inferrable": true, + "http_endpoint_parameter_name": "id" + } + ] + }, + "output": { + "description": "Response from the API endpoint 'DeleteMilestone'.", + "available_modes": [ + "value", + "error", + "null" + ], + "value_schema": { + "val_type": "json", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": null + } + }, + "requirements": { + "authorization": null, + "secrets": [ + { + "key": "PYLON_SECRET_TOKEN" + } + ], + "metadata": null + }, + "deprecation_message": null, + "metadata": { + "object_type": "api_wrapper_tool", + "version": "1.1.0", + "description": "Tools that enable LLMs to interact directly with the pylon API." + }, + "http_endpoint": { + "metadata": { + "object_type": "http_endpoint", + "version": "1.2.0", + "description": "" + }, + "url": "https://api.usepylon.com/milestones/{id}", + "http_method": "DELETE", + "headers": {}, + "parameters": [ + { + "name": "id", + "tool_parameter_name": "milestone_id", + "description": "The ID of the milestone to delete.", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The ID of the milestone to delete." + }, + "accepted_as": "path", + "required": true, + "deprecated": false, + "default": null, + "documentation_urls": [] + } + ], + "documentation_urls": [], + "secrets": [ + { + "arcade_key": "PYLON_SECRET_TOKEN", + "parameter_name": "Authorization", + "accepted_as": "header", + "formatted_value": "Bearer {authorization}", + "description": "", + "is_auth_token": false + } + ], + "request_body_spec": null, + "use_request_body_schema_mode": false, + "validate_request_body_schema": false + } +} diff --git a/toolkits/pylon_api/pylon_api/wrapper_tools/DeleteTask.json b/toolkits/pylon_api/pylon_api/wrapper_tools/DeleteTask.json new file mode 100644 index 00000000..29db60c8 --- /dev/null +++ b/toolkits/pylon_api/pylon_api/wrapper_tools/DeleteTask.json @@ -0,0 +1,104 @@ +{ + "name": "DeleteTask", + "fully_qualified_name": "PylonApi.DeleteTask@0.1.0", + "description": "Delete an existing task by ID.\n\nUse this tool to delete a specific task by its ID. Call it when you need to remove a task permanently from the system.", + "toolkit": { + "name": "PylonApi", + "description": null, + "version": "0.1.0" + }, + "input": { + "parameters": [ + { + "name": "task_id", + "required": true, + "description": "The unique identifier of the task to be deleted.", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The ID of the task to delete." + }, + "inferrable": true, + "http_endpoint_parameter_name": "id" + } + ] + }, + "output": { + "description": "Response from the API endpoint 'DeleteTask'.", + "available_modes": [ + "value", + "error", + "null" + ], + "value_schema": { + "val_type": "json", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": null + } + }, + "requirements": { + "authorization": null, + "secrets": [ + { + "key": "PYLON_SECRET_TOKEN" + } + ], + "metadata": null + }, + "deprecation_message": null, + "metadata": { + "object_type": "api_wrapper_tool", + "version": "1.1.0", + "description": "Tools that enable LLMs to interact directly with the pylon API." + }, + "http_endpoint": { + "metadata": { + "object_type": "http_endpoint", + "version": "1.2.0", + "description": "" + }, + "url": "https://api.usepylon.com/tasks/{id}", + "http_method": "DELETE", + "headers": {}, + "parameters": [ + { + "name": "id", + "tool_parameter_name": "task_id", + "description": "The ID of the task to delete.", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The ID of the task to delete." + }, + "accepted_as": "path", + "required": true, + "deprecated": false, + "default": null, + "documentation_urls": [] + } + ], + "documentation_urls": [], + "secrets": [ + { + "arcade_key": "PYLON_SECRET_TOKEN", + "parameter_name": "Authorization", + "accepted_as": "header", + "formatted_value": "Bearer {authorization}", + "description": "", + "is_auth_token": false + } + ], + "request_body_spec": null, + "use_request_body_schema_mode": false, + "validate_request_body_schema": false + } +} diff --git a/toolkits/pylon_api/pylon_api/wrapper_tools/DeleteTrainingDataDocuments.json b/toolkits/pylon_api/pylon_api/wrapper_tools/DeleteTrainingDataDocuments.json new file mode 100644 index 00000000..24bce5d5 --- /dev/null +++ b/toolkits/pylon_api/pylon_api/wrapper_tools/DeleteTrainingDataDocuments.json @@ -0,0 +1,170 @@ +{ + "name": "DeleteTrainingDataDocuments", + "fully_qualified_name": "PylonApi.DeleteTrainingDataDocuments@0.1.0", + "description": "Deletes documents from a training data configuration.\n\nUse this tool to delete documents from a specific training data configuration by providing the relevant ID. This tool is helpful when managing or updating data sets for training purposes.", + "toolkit": { + "name": "PylonApi", + "description": null, + "version": "0.1.0" + }, + "input": { + "parameters": [ + { + "name": "training_data_id", + "required": true, + "description": "The ID of the training data from which documents will be deleted. Provide this to specify the exact dataset.", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The ID of the training data." + }, + "inferrable": true, + "http_endpoint_parameter_name": "id" + }, + { + "name": "document_ids_to_delete", + "required": false, + "description": "An array of document IDs that need to be deleted from the training data configuration.", + "value_schema": { + "val_type": "array", + "inner_val_type": "string", + "enum": null, + "properties": null, + "inner_properties": null, + "description": "Document IDs to delete." + }, + "inferrable": true, + "http_endpoint_parameter_name": "document_ids" + }, + { + "name": "external_ids_to_delete", + "required": false, + "description": "A list of external IDs to delete from the training data configuration.", + "value_schema": { + "val_type": "array", + "inner_val_type": "string", + "enum": null, + "properties": null, + "inner_properties": null, + "description": "External IDs to delete." + }, + "inferrable": true, + "http_endpoint_parameter_name": "external_ids" + } + ] + }, + "output": { + "description": "Response from the API endpoint 'DeleteTrainingDataDocuments'.", + "available_modes": [ + "value", + "error", + "null" + ], + "value_schema": { + "val_type": "json", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": null + } + }, + "requirements": { + "authorization": null, + "secrets": [ + { + "key": "PYLON_SECRET_TOKEN" + } + ], + "metadata": null + }, + "deprecation_message": null, + "metadata": { + "object_type": "api_wrapper_tool", + "version": "1.1.0", + "description": "Tools that enable LLMs to interact directly with the pylon API." + }, + "http_endpoint": { + "metadata": { + "object_type": "http_endpoint", + "version": "1.2.0", + "description": "" + }, + "url": "https://api.usepylon.com/training-data/{id}/documents", + "http_method": "DELETE", + "headers": {}, + "parameters": [ + { + "name": "document_ids", + "tool_parameter_name": "document_ids_to_delete", + "description": "Document IDs to delete.", + "value_schema": { + "val_type": "array", + "inner_val_type": "string", + "enum": null, + "properties": null, + "inner_properties": null, + "description": "Document IDs to delete." + }, + "accepted_as": "query", + "required": false, + "deprecated": false, + "default": null, + "documentation_urls": [] + }, + { + "name": "external_ids", + "tool_parameter_name": "external_ids_to_delete", + "description": "External IDs to delete.", + "value_schema": { + "val_type": "array", + "inner_val_type": "string", + "enum": null, + "properties": null, + "inner_properties": null, + "description": "External IDs to delete." + }, + "accepted_as": "query", + "required": false, + "deprecated": false, + "default": null, + "documentation_urls": [] + }, + { + "name": "id", + "tool_parameter_name": "training_data_id", + "description": "The ID of the training data.", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The ID of the training data." + }, + "accepted_as": "path", + "required": true, + "deprecated": false, + "default": null, + "documentation_urls": [] + } + ], + "documentation_urls": [], + "secrets": [ + { + "arcade_key": "PYLON_SECRET_TOKEN", + "parameter_name": "Authorization", + "accepted_as": "header", + "formatted_value": "Bearer {authorization}", + "description": "", + "is_auth_token": false + } + ], + "request_body_spec": null, + "use_request_body_schema_mode": false, + "validate_request_body_schema": false + } +} diff --git a/toolkits/pylon_api/pylon_api/wrapper_tools/FetchAllTags.json b/toolkits/pylon_api/pylon_api/wrapper_tools/FetchAllTags.json new file mode 100644 index 00000000..0f0e1a45 --- /dev/null +++ b/toolkits/pylon_api/pylon_api/wrapper_tools/FetchAllTags.json @@ -0,0 +1,69 @@ +{ + "name": "FetchAllTags", + "fully_qualified_name": "PylonApi.FetchAllTags@0.1.0", + "description": "Retrieve all available tags.\n\nUse this tool to obtain a comprehensive list of all tags. It is ideal for scenarios where you need to display or manage tags.", + "toolkit": { + "name": "PylonApi", + "description": null, + "version": "0.1.0" + }, + "input": { + "parameters": [] + }, + "output": { + "description": "Response from the API endpoint 'GetTags'.", + "available_modes": [ + "value", + "error", + "null" + ], + "value_schema": { + "val_type": "json", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": null + } + }, + "requirements": { + "authorization": null, + "secrets": [ + { + "key": "PYLON_SECRET_TOKEN" + } + ], + "metadata": null + }, + "deprecation_message": null, + "metadata": { + "object_type": "api_wrapper_tool", + "version": "1.1.0", + "description": "Tools that enable LLMs to interact directly with the pylon API." + }, + "http_endpoint": { + "metadata": { + "object_type": "http_endpoint", + "version": "1.2.0", + "description": "" + }, + "url": "https://api.usepylon.com/tags", + "http_method": "GET", + "headers": {}, + "parameters": [], + "documentation_urls": [], + "secrets": [ + { + "arcade_key": "PYLON_SECRET_TOKEN", + "parameter_name": "Authorization", + "accepted_as": "header", + "formatted_value": "Bearer {authorization}", + "description": "", + "is_auth_token": false + } + ], + "request_body_spec": null, + "use_request_body_schema_mode": false, + "validate_request_body_schema": false + } +} diff --git a/toolkits/pylon_api/pylon_api/wrapper_tools/FetchTeamList.json b/toolkits/pylon_api/pylon_api/wrapper_tools/FetchTeamList.json new file mode 100644 index 00000000..11918932 --- /dev/null +++ b/toolkits/pylon_api/pylon_api/wrapper_tools/FetchTeamList.json @@ -0,0 +1,69 @@ +{ + "name": "FetchTeamList", + "fully_qualified_name": "PylonApi.FetchTeamList@0.1.0", + "description": "Retrieve the list of available teams.\n\nUse this tool to get a list of all teams from the service. Useful for displaying team information or selecting a team from the list.", + "toolkit": { + "name": "PylonApi", + "description": null, + "version": "0.1.0" + }, + "input": { + "parameters": [] + }, + "output": { + "description": "Response from the API endpoint 'GetTeams'.", + "available_modes": [ + "value", + "error", + "null" + ], + "value_schema": { + "val_type": "json", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": null + } + }, + "requirements": { + "authorization": null, + "secrets": [ + { + "key": "PYLON_SECRET_TOKEN" + } + ], + "metadata": null + }, + "deprecation_message": null, + "metadata": { + "object_type": "api_wrapper_tool", + "version": "1.1.0", + "description": "Tools that enable LLMs to interact directly with the pylon API." + }, + "http_endpoint": { + "metadata": { + "object_type": "http_endpoint", + "version": "1.2.0", + "description": "" + }, + "url": "https://api.usepylon.com/teams", + "http_method": "GET", + "headers": {}, + "parameters": [], + "documentation_urls": [], + "secrets": [ + { + "arcade_key": "PYLON_SECRET_TOKEN", + "parameter_name": "Authorization", + "accepted_as": "header", + "formatted_value": "Bearer {authorization}", + "description": "", + "is_auth_token": false + } + ], + "request_body_spec": null, + "use_request_body_schema_mode": false, + "validate_request_body_schema": false + } +} diff --git a/toolkits/pylon_api/pylon_api/wrapper_tools/GetAccountInfo.json b/toolkits/pylon_api/pylon_api/wrapper_tools/GetAccountInfo.json new file mode 100644 index 00000000..3e35228c --- /dev/null +++ b/toolkits/pylon_api/pylon_api/wrapper_tools/GetAccountInfo.json @@ -0,0 +1,104 @@ +{ + "name": "GetAccountInfo", + "fully_qualified_name": "PylonApi.GetAccountInfo@0.1.0", + "description": "Retrieve an account's details using its ID or external ID.\n\nCall this tool to obtain detailed information about an account by providing either the account ID or external ID.", + "toolkit": { + "name": "PylonApi", + "description": null, + "version": "0.1.0" + }, + "input": { + "parameters": [ + { + "name": "account_id", + "required": true, + "description": "The ID or external ID of the account to fetch.", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The ID or external ID of the account to fetch." + }, + "inferrable": true, + "http_endpoint_parameter_name": "id" + } + ] + }, + "output": { + "description": "Response from the API endpoint 'GetAccount'.", + "available_modes": [ + "value", + "error", + "null" + ], + "value_schema": { + "val_type": "json", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": null + } + }, + "requirements": { + "authorization": null, + "secrets": [ + { + "key": "PYLON_SECRET_TOKEN" + } + ], + "metadata": null + }, + "deprecation_message": null, + "metadata": { + "object_type": "api_wrapper_tool", + "version": "1.1.0", + "description": "Tools that enable LLMs to interact directly with the pylon API." + }, + "http_endpoint": { + "metadata": { + "object_type": "http_endpoint", + "version": "1.2.0", + "description": "" + }, + "url": "https://api.usepylon.com/accounts/{id}", + "http_method": "GET", + "headers": {}, + "parameters": [ + { + "name": "id", + "tool_parameter_name": "account_id", + "description": "The ID or external ID of the account to fetch.", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The ID or external ID of the account to fetch." + }, + "accepted_as": "path", + "required": true, + "deprecated": false, + "default": null, + "documentation_urls": [] + } + ], + "documentation_urls": [], + "secrets": [ + { + "arcade_key": "PYLON_SECRET_TOKEN", + "parameter_name": "Authorization", + "accepted_as": "header", + "formatted_value": "Bearer {authorization}", + "description": "", + "is_auth_token": false + } + ], + "request_body_spec": null, + "use_request_body_schema_mode": false, + "validate_request_body_schema": false + } +} diff --git a/toolkits/pylon_api/pylon_api/wrapper_tools/GetAccountList.json b/toolkits/pylon_api/pylon_api/wrapper_tools/GetAccountList.json new file mode 100644 index 00000000..583c68e2 --- /dev/null +++ b/toolkits/pylon_api/pylon_api/wrapper_tools/GetAccountList.json @@ -0,0 +1,137 @@ +{ + "name": "GetAccountList", + "fully_qualified_name": "PylonApi.GetAccountList@0.1.0", + "description": "Retrieve a list of accounts from the service.\n\nThis tool fetches a complete list of accounts from the Pylon service. It should be called when you need to obtain account information.", + "toolkit": { + "name": "PylonApi", + "description": null, + "version": "0.1.0" + }, + "input": { + "parameters": [ + { + "name": "account_fetch_limit", + "required": true, + "description": "Specify the number of accounts to fetch, from 1 to 999. Defaults to 100 if not specified.", + "value_schema": { + "val_type": "integer", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The number of accounts to fetch. Defaults to 100. Must be greater than 0 and less than 1000." + }, + "inferrable": true, + "http_endpoint_parameter_name": "limit" + }, + { + "name": "pagination_cursor", + "required": false, + "description": "A string representing the cursor for pagination. Use this to fetch the next set of accounts.", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The cursor to use for pagination." + }, + "inferrable": true, + "http_endpoint_parameter_name": "cursor" + } + ] + }, + "output": { + "description": "Response from the API endpoint 'GetAccounts'.", + "available_modes": [ + "value", + "error", + "null" + ], + "value_schema": { + "val_type": "json", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": null + } + }, + "requirements": { + "authorization": null, + "secrets": [ + { + "key": "PYLON_SECRET_TOKEN" + } + ], + "metadata": null + }, + "deprecation_message": null, + "metadata": { + "object_type": "api_wrapper_tool", + "version": "1.1.0", + "description": "Tools that enable LLMs to interact directly with the pylon API." + }, + "http_endpoint": { + "metadata": { + "object_type": "http_endpoint", + "version": "1.2.0", + "description": "" + }, + "url": "https://api.usepylon.com/accounts", + "http_method": "GET", + "headers": {}, + "parameters": [ + { + "name": "cursor", + "tool_parameter_name": "pagination_cursor", + "description": "The cursor to use for pagination.", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The cursor to use for pagination." + }, + "accepted_as": "query", + "required": false, + "deprecated": false, + "default": null, + "documentation_urls": [] + }, + { + "name": "limit", + "tool_parameter_name": "account_fetch_limit", + "description": "The number of accounts to fetch. Defaults to 100. Must be greater than 0 and less than 1000.", + "value_schema": { + "val_type": "integer", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The number of accounts to fetch. Defaults to 100. Must be greater than 0 and less than 1000." + }, + "accepted_as": "query", + "required": true, + "deprecated": false, + "default": null, + "documentation_urls": [] + } + ], + "documentation_urls": [], + "secrets": [ + { + "arcade_key": "PYLON_SECRET_TOKEN", + "parameter_name": "Authorization", + "accepted_as": "header", + "formatted_value": "Bearer {authorization}", + "description": "", + "is_auth_token": false + } + ], + "request_body_spec": null, + "use_request_body_schema_mode": false, + "validate_request_body_schema": false + } +} diff --git a/toolkits/pylon_api/pylon_api/wrapper_tools/GetAllContacts.json b/toolkits/pylon_api/pylon_api/wrapper_tools/GetAllContacts.json new file mode 100644 index 00000000..c7b845b0 --- /dev/null +++ b/toolkits/pylon_api/pylon_api/wrapper_tools/GetAllContacts.json @@ -0,0 +1,69 @@ +{ + "name": "GetAllContacts", + "fully_qualified_name": "PylonApi.GetAllContacts@0.1.0", + "description": "Retrieve all contacts from the service.\n\nThis tool retrieves all contacts using the Pylon service. It should be called when there's a need to fetch a complete list of contacts from the service.", + "toolkit": { + "name": "PylonApi", + "description": null, + "version": "0.1.0" + }, + "input": { + "parameters": [] + }, + "output": { + "description": "Response from the API endpoint 'GetContacts'.", + "available_modes": [ + "value", + "error", + "null" + ], + "value_schema": { + "val_type": "json", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": null + } + }, + "requirements": { + "authorization": null, + "secrets": [ + { + "key": "PYLON_SECRET_TOKEN" + } + ], + "metadata": null + }, + "deprecation_message": null, + "metadata": { + "object_type": "api_wrapper_tool", + "version": "1.1.0", + "description": "Tools that enable LLMs to interact directly with the pylon API." + }, + "http_endpoint": { + "metadata": { + "object_type": "http_endpoint", + "version": "1.2.0", + "description": "" + }, + "url": "https://api.usepylon.com/contacts", + "http_method": "GET", + "headers": {}, + "parameters": [], + "documentation_urls": [], + "secrets": [ + { + "arcade_key": "PYLON_SECRET_TOKEN", + "parameter_name": "Authorization", + "accepted_as": "header", + "formatted_value": "Bearer {authorization}", + "description": "", + "is_auth_token": false + } + ], + "request_body_spec": null, + "use_request_body_schema_mode": false, + "validate_request_body_schema": false + } +} diff --git a/toolkits/pylon_api/pylon_api/wrapper_tools/GetAllCustomFields.json b/toolkits/pylon_api/pylon_api/wrapper_tools/GetAllCustomFields.json new file mode 100644 index 00000000..c5ba860a --- /dev/null +++ b/toolkits/pylon_api/pylon_api/wrapper_tools/GetAllCustomFields.json @@ -0,0 +1,104 @@ +{ + "name": "GetAllCustomFields", + "fully_qualified_name": "PylonApi.GetAllCustomFields@0.1.0", + "description": "Retrieve all custom fields from the system.\n\nThis tool is used to get a complete list of custom fields. It should be called when you need information about available custom fields.", + "toolkit": { + "name": "PylonApi", + "description": null, + "version": "0.1.0" + }, + "input": { + "parameters": [ + { + "name": "custom_field_object_type", + "required": true, + "description": "Specify the object type for custom fields. Options: \"account\", \"issue\", or \"contact\".", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The object type of the custom fields. Can be \"account\", \"issue\", or \"contact\"." + }, + "inferrable": true, + "http_endpoint_parameter_name": "object_type" + } + ] + }, + "output": { + "description": "Response from the API endpoint 'GetCustomFields'.", + "available_modes": [ + "value", + "error", + "null" + ], + "value_schema": { + "val_type": "json", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": null + } + }, + "requirements": { + "authorization": null, + "secrets": [ + { + "key": "PYLON_SECRET_TOKEN" + } + ], + "metadata": null + }, + "deprecation_message": null, + "metadata": { + "object_type": "api_wrapper_tool", + "version": "1.1.0", + "description": "Tools that enable LLMs to interact directly with the pylon API." + }, + "http_endpoint": { + "metadata": { + "object_type": "http_endpoint", + "version": "1.2.0", + "description": "" + }, + "url": "https://api.usepylon.com/custom-fields", + "http_method": "GET", + "headers": {}, + "parameters": [ + { + "name": "object_type", + "tool_parameter_name": "custom_field_object_type", + "description": "The object type of the custom fields. Can be \"account\", \"issue\", or \"contact\".", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The object type of the custom fields. Can be \"account\", \"issue\", or \"contact\"." + }, + "accepted_as": "query", + "required": true, + "deprecated": false, + "default": null, + "documentation_urls": [] + } + ], + "documentation_urls": [], + "secrets": [ + { + "arcade_key": "PYLON_SECRET_TOKEN", + "parameter_name": "Authorization", + "accepted_as": "header", + "formatted_value": "Bearer {authorization}", + "description": "", + "is_auth_token": false + } + ], + "request_body_spec": null, + "use_request_body_schema_mode": false, + "validate_request_body_schema": false + } +} diff --git a/toolkits/pylon_api/pylon_api/wrapper_tools/GetCollectionById.json b/toolkits/pylon_api/pylon_api/wrapper_tools/GetCollectionById.json new file mode 100644 index 00000000..bf7f0632 --- /dev/null +++ b/toolkits/pylon_api/pylon_api/wrapper_tools/GetCollectionById.json @@ -0,0 +1,137 @@ +{ + "name": "GetCollectionById", + "fully_qualified_name": "PylonApi.GetCollectionById@0.1.0", + "description": "Retrieve a specific collection using its ID.\n\nUse this tool to obtain detailed information about a particular collection by supplying the collection ID. The collection belongs to a specific knowledge base. Ideal for retrieving specific datasets or information collections within larger systems.", + "toolkit": { + "name": "PylonApi", + "description": null, + "version": "0.1.0" + }, + "input": { + "parameters": [ + { + "name": "knowledge_base_id", + "required": true, + "description": "The ID of the knowledge base to which the collection belongs.", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The ID of the knowledge base" + }, + "inferrable": true, + "http_endpoint_parameter_name": "id" + }, + { + "name": "collection_id", + "required": true, + "description": "The unique ID of the collection to be retrieved from the knowledge base.", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The ID of the collection" + }, + "inferrable": true, + "http_endpoint_parameter_name": "collection_id" + } + ] + }, + "output": { + "description": "Response from the API endpoint 'GetCollection'.", + "available_modes": [ + "value", + "error", + "null" + ], + "value_schema": { + "val_type": "json", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": null + } + }, + "requirements": { + "authorization": null, + "secrets": [ + { + "key": "PYLON_SECRET_TOKEN" + } + ], + "metadata": null + }, + "deprecation_message": null, + "metadata": { + "object_type": "api_wrapper_tool", + "version": "1.1.0", + "description": "Tools that enable LLMs to interact directly with the pylon API." + }, + "http_endpoint": { + "metadata": { + "object_type": "http_endpoint", + "version": "1.2.0", + "description": "" + }, + "url": "https://api.usepylon.com/knowledge-bases/{id}/collections/{collection_id}", + "http_method": "GET", + "headers": {}, + "parameters": [ + { + "name": "id", + "tool_parameter_name": "knowledge_base_id", + "description": "The ID of the knowledge base", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The ID of the knowledge base" + }, + "accepted_as": "path", + "required": true, + "deprecated": false, + "default": null, + "documentation_urls": [] + }, + { + "name": "collection_id", + "tool_parameter_name": "collection_id", + "description": "The ID of the collection", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The ID of the collection" + }, + "accepted_as": "path", + "required": true, + "deprecated": false, + "default": null, + "documentation_urls": [] + } + ], + "documentation_urls": [], + "secrets": [ + { + "arcade_key": "PYLON_SECRET_TOKEN", + "parameter_name": "Authorization", + "accepted_as": "header", + "formatted_value": "Bearer {authorization}", + "description": "", + "is_auth_token": false + } + ], + "request_body_spec": null, + "use_request_body_schema_mode": false, + "validate_request_body_schema": false + } +} diff --git a/toolkits/pylon_api/pylon_api/wrapper_tools/GetContactById.json b/toolkits/pylon_api/pylon_api/wrapper_tools/GetContactById.json new file mode 100644 index 00000000..cf307183 --- /dev/null +++ b/toolkits/pylon_api/pylon_api/wrapper_tools/GetContactById.json @@ -0,0 +1,170 @@ +{ + "name": "GetContactById", + "fully_qualified_name": "PylonApi.GetContactById@0.1.0", + "description": "Retrieve contact details using the contact ID.\n\nThis tool fetches and returns contact details by querying with a specified contact ID. Use it when you need to obtain specific contact information.", + "toolkit": { + "name": "PylonApi", + "description": null, + "version": "0.1.0" + }, + "input": { + "parameters": [ + { + "name": "number_of_accounts_to_fetch", + "required": true, + "description": "Specifies the number of accounts to fetch. Must be between 1 and 999. Defaults to 100 if not provided.", + "value_schema": { + "val_type": "integer", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The number of accounts to fetch. Defaults to 100. Must be greater than 0 and less than 1000." + }, + "inferrable": true, + "http_endpoint_parameter_name": "limit" + }, + { + "name": "contact_id", + "required": true, + "description": "The unique identifier for the contact to fetch details.", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The ID of the contact." + }, + "inferrable": true, + "http_endpoint_parameter_name": "id" + }, + { + "name": "pagination_cursor", + "required": false, + "description": "A string representing the cursor for pagination purposes, used to fetch the next set of results in a paginated response.", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The cursor to use for pagination." + }, + "inferrable": true, + "http_endpoint_parameter_name": "cursor" + } + ] + }, + "output": { + "description": "Response from the API endpoint 'GetContact'.", + "available_modes": [ + "value", + "error", + "null" + ], + "value_schema": { + "val_type": "json", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": null + } + }, + "requirements": { + "authorization": null, + "secrets": [ + { + "key": "PYLON_SECRET_TOKEN" + } + ], + "metadata": null + }, + "deprecation_message": null, + "metadata": { + "object_type": "api_wrapper_tool", + "version": "1.1.0", + "description": "Tools that enable LLMs to interact directly with the pylon API." + }, + "http_endpoint": { + "metadata": { + "object_type": "http_endpoint", + "version": "1.2.0", + "description": "" + }, + "url": "https://api.usepylon.com/contacts/{id}", + "http_method": "GET", + "headers": {}, + "parameters": [ + { + "name": "cursor", + "tool_parameter_name": "pagination_cursor", + "description": "The cursor to use for pagination.", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The cursor to use for pagination." + }, + "accepted_as": "query", + "required": false, + "deprecated": false, + "default": null, + "documentation_urls": [] + }, + { + "name": "limit", + "tool_parameter_name": "number_of_accounts_to_fetch", + "description": "The number of accounts to fetch. Defaults to 100. Must be greater than 0 and less than 1000.", + "value_schema": { + "val_type": "integer", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The number of accounts to fetch. Defaults to 100. Must be greater than 0 and less than 1000." + }, + "accepted_as": "query", + "required": true, + "deprecated": false, + "default": null, + "documentation_urls": [] + }, + { + "name": "id", + "tool_parameter_name": "contact_id", + "description": "The ID of the contact.", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The ID of the contact." + }, + "accepted_as": "path", + "required": true, + "deprecated": false, + "default": null, + "documentation_urls": [] + } + ], + "documentation_urls": [], + "secrets": [ + { + "arcade_key": "PYLON_SECRET_TOKEN", + "parameter_name": "Authorization", + "accepted_as": "header", + "formatted_value": "Bearer {authorization}", + "description": "", + "is_auth_token": false + } + ], + "request_body_spec": null, + "use_request_body_schema_mode": false, + "validate_request_body_schema": false + } +} diff --git a/toolkits/pylon_api/pylon_api/wrapper_tools/GetCustomActivityTypes.json b/toolkits/pylon_api/pylon_api/wrapper_tools/GetCustomActivityTypes.json new file mode 100644 index 00000000..7d5bb53a --- /dev/null +++ b/toolkits/pylon_api/pylon_api/wrapper_tools/GetCustomActivityTypes.json @@ -0,0 +1,69 @@ +{ + "name": "GetCustomActivityTypes", + "fully_qualified_name": "PylonApi.GetCustomActivityTypes@0.1.0", + "description": "Retrieve a list of custom activity types.\n\nUse this tool to get a list of custom activity types that are available. It should be called when there's a need to know what custom activity types exist.", + "toolkit": { + "name": "PylonApi", + "description": null, + "version": "0.1.0" + }, + "input": { + "parameters": [] + }, + "output": { + "description": "Response from the API endpoint 'GetActivityTypes'.", + "available_modes": [ + "value", + "error", + "null" + ], + "value_schema": { + "val_type": "json", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": null + } + }, + "requirements": { + "authorization": null, + "secrets": [ + { + "key": "PYLON_SECRET_TOKEN" + } + ], + "metadata": null + }, + "deprecation_message": null, + "metadata": { + "object_type": "api_wrapper_tool", + "version": "1.1.0", + "description": "Tools that enable LLMs to interact directly with the pylon API." + }, + "http_endpoint": { + "metadata": { + "object_type": "http_endpoint", + "version": "1.2.0", + "description": "" + }, + "url": "https://api.usepylon.com/activity-types", + "http_method": "GET", + "headers": {}, + "parameters": [], + "documentation_urls": [], + "secrets": [ + { + "arcade_key": "PYLON_SECRET_TOKEN", + "parameter_name": "Authorization", + "accepted_as": "header", + "formatted_value": "Bearer {authorization}", + "description": "", + "is_auth_token": false + } + ], + "request_body_spec": null, + "use_request_body_schema_mode": false, + "validate_request_body_schema": false + } +} diff --git a/toolkits/pylon_api/pylon_api/wrapper_tools/GetCustomField.json b/toolkits/pylon_api/pylon_api/wrapper_tools/GetCustomField.json new file mode 100644 index 00000000..24ce1411 --- /dev/null +++ b/toolkits/pylon_api/pylon_api/wrapper_tools/GetCustomField.json @@ -0,0 +1,104 @@ +{ + "name": "GetCustomField", + "fully_qualified_name": "PylonApi.GetCustomField@0.1.0", + "description": "Retrieve a custom field by its ID.\n\nUse this tool to obtain details of a specific custom field using its unique identifier.", + "toolkit": { + "name": "PylonApi", + "description": null, + "version": "0.1.0" + }, + "input": { + "parameters": [ + { + "name": "custom_field_id", + "required": true, + "description": "The unique identifier of the custom field to retrieve.", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The ID of the custom field." + }, + "inferrable": true, + "http_endpoint_parameter_name": "id" + } + ] + }, + "output": { + "description": "Response from the API endpoint 'GetCustomField'.", + "available_modes": [ + "value", + "error", + "null" + ], + "value_schema": { + "val_type": "json", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": null + } + }, + "requirements": { + "authorization": null, + "secrets": [ + { + "key": "PYLON_SECRET_TOKEN" + } + ], + "metadata": null + }, + "deprecation_message": null, + "metadata": { + "object_type": "api_wrapper_tool", + "version": "1.1.0", + "description": "Tools that enable LLMs to interact directly with the pylon API." + }, + "http_endpoint": { + "metadata": { + "object_type": "http_endpoint", + "version": "1.2.0", + "description": "" + }, + "url": "https://api.usepylon.com/custom-fields/{id}", + "http_method": "GET", + "headers": {}, + "parameters": [ + { + "name": "id", + "tool_parameter_name": "custom_field_id", + "description": "The ID of the custom field.", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The ID of the custom field." + }, + "accepted_as": "path", + "required": true, + "deprecated": false, + "default": null, + "documentation_urls": [] + } + ], + "documentation_urls": [], + "secrets": [ + { + "arcade_key": "PYLON_SECRET_TOKEN", + "parameter_name": "Authorization", + "accepted_as": "header", + "formatted_value": "Bearer {authorization}", + "description": "", + "is_auth_token": false + } + ], + "request_body_spec": null, + "use_request_body_schema_mode": false, + "validate_request_body_schema": false + } +} diff --git a/toolkits/pylon_api/pylon_api/wrapper_tools/GetIssueById.json b/toolkits/pylon_api/pylon_api/wrapper_tools/GetIssueById.json new file mode 100644 index 00000000..d9e70a8f --- /dev/null +++ b/toolkits/pylon_api/pylon_api/wrapper_tools/GetIssueById.json @@ -0,0 +1,104 @@ +{ + "name": "GetIssueById", + "fully_qualified_name": "PylonApi.GetIssueById@0.1.0", + "description": "Retrieve issue details using its ID or number.\n\nUse this tool to access details of an issue by providing its specific ID or number. Ideal for tasks requiring detailed issue information retrieval in issue tracking systems.", + "toolkit": { + "name": "PylonApi", + "description": null, + "version": "0.1.0" + }, + "input": { + "parameters": [ + { + "name": "issue_id", + "required": true, + "description": "The unique ID or number of the issue you want to retrieve.", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The ID or number of the issue to fetch." + }, + "inferrable": true, + "http_endpoint_parameter_name": "id" + } + ] + }, + "output": { + "description": "Response from the API endpoint 'GetIssue'.", + "available_modes": [ + "value", + "error", + "null" + ], + "value_schema": { + "val_type": "json", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": null + } + }, + "requirements": { + "authorization": null, + "secrets": [ + { + "key": "PYLON_SECRET_TOKEN" + } + ], + "metadata": null + }, + "deprecation_message": null, + "metadata": { + "object_type": "api_wrapper_tool", + "version": "1.1.0", + "description": "Tools that enable LLMs to interact directly with the pylon API." + }, + "http_endpoint": { + "metadata": { + "object_type": "http_endpoint", + "version": "1.2.0", + "description": "" + }, + "url": "https://api.usepylon.com/issues/{id}", + "http_method": "GET", + "headers": {}, + "parameters": [ + { + "name": "id", + "tool_parameter_name": "issue_id", + "description": "The ID or number of the issue to fetch.", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The ID or number of the issue to fetch." + }, + "accepted_as": "path", + "required": true, + "deprecated": false, + "default": null, + "documentation_urls": [] + } + ], + "documentation_urls": [], + "secrets": [ + { + "arcade_key": "PYLON_SECRET_TOKEN", + "parameter_name": "Authorization", + "accepted_as": "header", + "formatted_value": "Bearer {authorization}", + "description": "", + "is_auth_token": false + } + ], + "request_body_spec": null, + "use_request_body_schema_mode": false, + "validate_request_body_schema": false + } +} diff --git a/toolkits/pylon_api/pylon_api/wrapper_tools/GetIssueFollowers.json b/toolkits/pylon_api/pylon_api/wrapper_tools/GetIssueFollowers.json new file mode 100644 index 00000000..7df15d46 --- /dev/null +++ b/toolkits/pylon_api/pylon_api/wrapper_tools/GetIssueFollowers.json @@ -0,0 +1,104 @@ +{ + "name": "GetIssueFollowers", + "fully_qualified_name": "PylonApi.GetIssueFollowers@0.1.0", + "description": "Get followers of a specific issue to manage participation.\n\nThis tool retrieves the list of users who are following a specified issue. Use this tool when you need to know who is engaging with or interested in updates about an issue.", + "toolkit": { + "name": "PylonApi", + "description": null, + "version": "0.1.0" + }, + "input": { + "parameters": [ + { + "name": "issue_id", + "required": true, + "description": "The unique ID or number of the issue to retrieve followers for.", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The ID or number of the issue to get followers for." + }, + "inferrable": true, + "http_endpoint_parameter_name": "id" + } + ] + }, + "output": { + "description": "Response from the API endpoint 'GetIssueFollowers'.", + "available_modes": [ + "value", + "error", + "null" + ], + "value_schema": { + "val_type": "json", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": null + } + }, + "requirements": { + "authorization": null, + "secrets": [ + { + "key": "PYLON_SECRET_TOKEN" + } + ], + "metadata": null + }, + "deprecation_message": null, + "metadata": { + "object_type": "api_wrapper_tool", + "version": "1.1.0", + "description": "Tools that enable LLMs to interact directly with the pylon API." + }, + "http_endpoint": { + "metadata": { + "object_type": "http_endpoint", + "version": "1.2.0", + "description": "" + }, + "url": "https://api.usepylon.com/issues/{id}/followers", + "http_method": "GET", + "headers": {}, + "parameters": [ + { + "name": "id", + "tool_parameter_name": "issue_id", + "description": "The ID or number of the issue to get followers for.", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The ID or number of the issue to get followers for." + }, + "accepted_as": "path", + "required": true, + "deprecated": false, + "default": null, + "documentation_urls": [] + } + ], + "documentation_urls": [], + "secrets": [ + { + "arcade_key": "PYLON_SECRET_TOKEN", + "parameter_name": "Authorization", + "accepted_as": "header", + "formatted_value": "Bearer {authorization}", + "description": "", + "is_auth_token": false + } + ], + "request_body_spec": null, + "use_request_body_schema_mode": false, + "validate_request_body_schema": false + } +} diff --git a/toolkits/pylon_api/pylon_api/wrapper_tools/GetIssueMessages.json b/toolkits/pylon_api/pylon_api/wrapper_tools/GetIssueMessages.json new file mode 100644 index 00000000..993904c3 --- /dev/null +++ b/toolkits/pylon_api/pylon_api/wrapper_tools/GetIssueMessages.json @@ -0,0 +1,104 @@ +{ + "name": "GetIssueMessages", + "fully_qualified_name": "PylonApi.GetIssueMessages@0.1.0", + "description": "Retrieve messages for a specific issue.\n\nThis tool is used to obtain all messages associated with a particular issue, identified by its ID.", + "toolkit": { + "name": "PylonApi", + "description": null, + "version": "0.1.0" + }, + "input": { + "parameters": [ + { + "name": "issue_id", + "required": true, + "description": "The unique ID of the issue for which to retrieve messages.", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The ID of the issue to fetch messages for." + }, + "inferrable": true, + "http_endpoint_parameter_name": "id" + } + ] + }, + "output": { + "description": "Response from the API endpoint 'GetIssueMessages'.", + "available_modes": [ + "value", + "error", + "null" + ], + "value_schema": { + "val_type": "json", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": null + } + }, + "requirements": { + "authorization": null, + "secrets": [ + { + "key": "PYLON_SECRET_TOKEN" + } + ], + "metadata": null + }, + "deprecation_message": null, + "metadata": { + "object_type": "api_wrapper_tool", + "version": "1.1.0", + "description": "Tools that enable LLMs to interact directly with the pylon API." + }, + "http_endpoint": { + "metadata": { + "object_type": "http_endpoint", + "version": "1.2.0", + "description": "" + }, + "url": "https://api.usepylon.com/issues/{id}/messages", + "http_method": "GET", + "headers": {}, + "parameters": [ + { + "name": "id", + "tool_parameter_name": "issue_id", + "description": "The ID of the issue to fetch messages for.", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The ID of the issue to fetch messages for." + }, + "accepted_as": "path", + "required": true, + "deprecated": false, + "default": null, + "documentation_urls": [] + } + ], + "documentation_urls": [], + "secrets": [ + { + "arcade_key": "PYLON_SECRET_TOKEN", + "parameter_name": "Authorization", + "accepted_as": "header", + "formatted_value": "Bearer {authorization}", + "description": "", + "is_auth_token": false + } + ], + "request_body_spec": null, + "use_request_body_schema_mode": false, + "validate_request_body_schema": false + } +} diff --git a/toolkits/pylon_api/pylon_api/wrapper_tools/GetIssueStatuses.json b/toolkits/pylon_api/pylon_api/wrapper_tools/GetIssueStatuses.json new file mode 100644 index 00000000..72cd4cff --- /dev/null +++ b/toolkits/pylon_api/pylon_api/wrapper_tools/GetIssueStatuses.json @@ -0,0 +1,69 @@ +{ + "name": "GetIssueStatuses", + "fully_qualified_name": "PylonApi.GetIssueStatuses@0.1.0", + "description": "Retrieve all issue statuses from the system.\n\nUse this tool to get a complete list of issue statuses available in the project management system. This can help with tracking and managing project workflows efficiently.", + "toolkit": { + "name": "PylonApi", + "description": null, + "version": "0.1.0" + }, + "input": { + "parameters": [] + }, + "output": { + "description": "Response from the API endpoint 'GetIssueStatuses'.", + "available_modes": [ + "value", + "error", + "null" + ], + "value_schema": { + "val_type": "json", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": null + } + }, + "requirements": { + "authorization": null, + "secrets": [ + { + "key": "PYLON_SECRET_TOKEN" + } + ], + "metadata": null + }, + "deprecation_message": null, + "metadata": { + "object_type": "api_wrapper_tool", + "version": "1.1.0", + "description": "Tools that enable LLMs to interact directly with the pylon API." + }, + "http_endpoint": { + "metadata": { + "object_type": "http_endpoint", + "version": "1.2.0", + "description": "" + }, + "url": "https://api.usepylon.com/issue-statuses", + "http_method": "GET", + "headers": {}, + "parameters": [], + "documentation_urls": [], + "secrets": [ + { + "arcade_key": "PYLON_SECRET_TOKEN", + "parameter_name": "Authorization", + "accepted_as": "header", + "formatted_value": "Bearer {authorization}", + "description": "", + "is_auth_token": false + } + ], + "request_body_spec": null, + "use_request_body_schema_mode": false, + "validate_request_body_schema": false + } +} diff --git a/toolkits/pylon_api/pylon_api/wrapper_tools/GetIssueThreads.json b/toolkits/pylon_api/pylon_api/wrapper_tools/GetIssueThreads.json new file mode 100644 index 00000000..50795eb2 --- /dev/null +++ b/toolkits/pylon_api/pylon_api/wrapper_tools/GetIssueThreads.json @@ -0,0 +1,104 @@ +{ + "name": "GetIssueThreads", + "fully_qualified_name": "PylonApi.GetIssueThreads@0.1.0", + "description": "Retrieve threads for a specific issue.\n\nCall this tool to get all threads associated with a particular issue using its ID. Useful for tracking conversations or discussions related to an issue.", + "toolkit": { + "name": "PylonApi", + "description": null, + "version": "0.1.0" + }, + "input": { + "parameters": [ + { + "name": "issue_id", + "required": true, + "description": "The unique ID of the issue for which threads need to be retrieved.", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The ID of the issue to fetch threads for." + }, + "inferrable": true, + "http_endpoint_parameter_name": "id" + } + ] + }, + "output": { + "description": "Response from the API endpoint 'GetIssueThreads'.", + "available_modes": [ + "value", + "error", + "null" + ], + "value_schema": { + "val_type": "json", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": null + } + }, + "requirements": { + "authorization": null, + "secrets": [ + { + "key": "PYLON_SECRET_TOKEN" + } + ], + "metadata": null + }, + "deprecation_message": null, + "metadata": { + "object_type": "api_wrapper_tool", + "version": "1.1.0", + "description": "Tools that enable LLMs to interact directly with the pylon API." + }, + "http_endpoint": { + "metadata": { + "object_type": "http_endpoint", + "version": "1.2.0", + "description": "" + }, + "url": "https://api.usepylon.com/issues/{id}/threads", + "http_method": "GET", + "headers": {}, + "parameters": [ + { + "name": "id", + "tool_parameter_name": "issue_id", + "description": "The ID of the issue to fetch threads for.", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The ID of the issue to fetch threads for." + }, + "accepted_as": "path", + "required": true, + "deprecated": false, + "default": null, + "documentation_urls": [] + } + ], + "documentation_urls": [], + "secrets": [ + { + "arcade_key": "PYLON_SECRET_TOKEN", + "parameter_name": "Authorization", + "accepted_as": "header", + "formatted_value": "Bearer {authorization}", + "description": "", + "is_auth_token": false + } + ], + "request_body_spec": null, + "use_request_body_schema_mode": false, + "validate_request_body_schema": false + } +} diff --git a/toolkits/pylon_api/pylon_api/wrapper_tools/GetIssuesList.json b/toolkits/pylon_api/pylon_api/wrapper_tools/GetIssuesList.json new file mode 100644 index 00000000..22f494b1 --- /dev/null +++ b/toolkits/pylon_api/pylon_api/wrapper_tools/GetIssuesList.json @@ -0,0 +1,137 @@ +{ + "name": "GetIssuesList", + "fully_qualified_name": "PylonApi.GetIssuesList@0.1.0", + "description": "Retrieve a list of issues.\n\nCall this tool to get a list of issues from the Pylon service, useful for tracking or managing tasks and bugs.", + "toolkit": { + "name": "PylonApi", + "description": null, + "version": "0.1.0" + }, + "input": { + "parameters": [ + { + "name": "start_time_for_issue_range", + "required": true, + "description": "The start time in RFC3339 format to query issues. Duration with end_time must be <= 30 days.", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The start time (RFC3339) of the time range to get issues for. The duration between start_time and end_time must be less than or equal to 30 days." + }, + "inferrable": true, + "http_endpoint_parameter_name": "start_time" + }, + { + "name": "end_time_rfc3339", + "required": true, + "description": "The end time in RFC3339 format for the issue retrieval range, must be within 30 days of the start time.", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The end time (RFC3339) of the time range to get issues for. The duration between start_time and end_time must be less than or equal to 30 days." + }, + "inferrable": true, + "http_endpoint_parameter_name": "end_time" + } + ] + }, + "output": { + "description": "Response from the API endpoint 'GetIssues'.", + "available_modes": [ + "value", + "error", + "null" + ], + "value_schema": { + "val_type": "json", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": null + } + }, + "requirements": { + "authorization": null, + "secrets": [ + { + "key": "PYLON_SECRET_TOKEN" + } + ], + "metadata": null + }, + "deprecation_message": null, + "metadata": { + "object_type": "api_wrapper_tool", + "version": "1.1.0", + "description": "Tools that enable LLMs to interact directly with the pylon API." + }, + "http_endpoint": { + "metadata": { + "object_type": "http_endpoint", + "version": "1.2.0", + "description": "" + }, + "url": "https://api.usepylon.com/issues", + "http_method": "GET", + "headers": {}, + "parameters": [ + { + "name": "start_time", + "tool_parameter_name": "start_time_for_issue_range", + "description": "The start time (RFC3339) of the time range to get issues for. The duration between start_time and end_time must be less than or equal to 30 days.", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The start time (RFC3339) of the time range to get issues for. The duration between start_time and end_time must be less than or equal to 30 days." + }, + "accepted_as": "query", + "required": true, + "deprecated": false, + "default": null, + "documentation_urls": [] + }, + { + "name": "end_time", + "tool_parameter_name": "end_time_rfc3339", + "description": "The end time (RFC3339) of the time range to get issues for. The duration between start_time and end_time must be less than or equal to 30 days.", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The end time (RFC3339) of the time range to get issues for. The duration between start_time and end_time must be less than or equal to 30 days." + }, + "accepted_as": "query", + "required": true, + "deprecated": false, + "default": null, + "documentation_urls": [] + } + ], + "documentation_urls": [], + "secrets": [ + { + "arcade_key": "PYLON_SECRET_TOKEN", + "parameter_name": "Authorization", + "accepted_as": "header", + "formatted_value": "Bearer {authorization}", + "description": "", + "is_auth_token": false + } + ], + "request_body_spec": null, + "use_request_body_schema_mode": false, + "validate_request_body_schema": false + } +} diff --git a/toolkits/pylon_api/pylon_api/wrapper_tools/GetKnowledgeBaseById.json b/toolkits/pylon_api/pylon_api/wrapper_tools/GetKnowledgeBaseById.json new file mode 100644 index 00000000..796accb9 --- /dev/null +++ b/toolkits/pylon_api/pylon_api/wrapper_tools/GetKnowledgeBaseById.json @@ -0,0 +1,104 @@ +{ + "name": "GetKnowledgeBaseById", + "fully_qualified_name": "PylonApi.GetKnowledgeBaseById@0.1.0", + "description": "Retrieve a knowledge base using its ID.\n\nUse this tool to fetch information about a specific knowledge base by providing its ID.", + "toolkit": { + "name": "PylonApi", + "description": null, + "version": "0.1.0" + }, + "input": { + "parameters": [ + { + "name": "knowledge_base_id", + "required": true, + "description": "The unique identifier for the knowledge base to be retrieved.", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The ID of the knowledge base." + }, + "inferrable": true, + "http_endpoint_parameter_name": "id" + } + ] + }, + "output": { + "description": "Response from the API endpoint 'GetKnowledgeBase'.", + "available_modes": [ + "value", + "error", + "null" + ], + "value_schema": { + "val_type": "json", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": null + } + }, + "requirements": { + "authorization": null, + "secrets": [ + { + "key": "PYLON_SECRET_TOKEN" + } + ], + "metadata": null + }, + "deprecation_message": null, + "metadata": { + "object_type": "api_wrapper_tool", + "version": "1.1.0", + "description": "Tools that enable LLMs to interact directly with the pylon API." + }, + "http_endpoint": { + "metadata": { + "object_type": "http_endpoint", + "version": "1.2.0", + "description": "" + }, + "url": "https://api.usepylon.com/knowledge-bases/{id}", + "http_method": "GET", + "headers": {}, + "parameters": [ + { + "name": "id", + "tool_parameter_name": "knowledge_base_id", + "description": "The ID of the knowledge base.", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The ID of the knowledge base." + }, + "accepted_as": "path", + "required": true, + "deprecated": false, + "default": null, + "documentation_urls": [] + } + ], + "documentation_urls": [], + "secrets": [ + { + "arcade_key": "PYLON_SECRET_TOKEN", + "parameter_name": "Authorization", + "accepted_as": "header", + "formatted_value": "Bearer {authorization}", + "description": "", + "is_auth_token": false + } + ], + "request_body_spec": null, + "use_request_body_schema_mode": false, + "validate_request_body_schema": false + } +} diff --git a/toolkits/pylon_api/pylon_api/wrapper_tools/GetKnowledgeBases.json b/toolkits/pylon_api/pylon_api/wrapper_tools/GetKnowledgeBases.json new file mode 100644 index 00000000..007ce5b7 --- /dev/null +++ b/toolkits/pylon_api/pylon_api/wrapper_tools/GetKnowledgeBases.json @@ -0,0 +1,69 @@ +{ + "name": "GetKnowledgeBases", + "fully_qualified_name": "PylonApi.GetKnowledgeBases@0.1.0", + "description": "Retrieve all available knowledge bases.\n\nThis tool is called to get a list of all knowledge bases from the Pylon service.", + "toolkit": { + "name": "PylonApi", + "description": null, + "version": "0.1.0" + }, + "input": { + "parameters": [] + }, + "output": { + "description": "Response from the API endpoint 'GetKnowledgeBases'.", + "available_modes": [ + "value", + "error", + "null" + ], + "value_schema": { + "val_type": "json", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": null + } + }, + "requirements": { + "authorization": null, + "secrets": [ + { + "key": "PYLON_SECRET_TOKEN" + } + ], + "metadata": null + }, + "deprecation_message": null, + "metadata": { + "object_type": "api_wrapper_tool", + "version": "1.1.0", + "description": "Tools that enable LLMs to interact directly with the pylon API." + }, + "http_endpoint": { + "metadata": { + "object_type": "http_endpoint", + "version": "1.2.0", + "description": "" + }, + "url": "https://api.usepylon.com/knowledge-bases", + "http_method": "GET", + "headers": {}, + "parameters": [], + "documentation_urls": [], + "secrets": [ + { + "arcade_key": "PYLON_SECRET_TOKEN", + "parameter_name": "Authorization", + "accepted_as": "header", + "formatted_value": "Bearer {authorization}", + "description": "", + "is_auth_token": false + } + ], + "request_body_spec": null, + "use_request_body_schema_mode": false, + "validate_request_body_schema": false + } +} diff --git a/toolkits/pylon_api/pylon_api/wrapper_tools/GetOrganizationDetails.json b/toolkits/pylon_api/pylon_api/wrapper_tools/GetOrganizationDetails.json new file mode 100644 index 00000000..a4e80dd4 --- /dev/null +++ b/toolkits/pylon_api/pylon_api/wrapper_tools/GetOrganizationDetails.json @@ -0,0 +1,69 @@ +{ + "name": "GetOrganizationDetails", + "fully_qualified_name": "PylonApi.GetOrganizationDetails@0.1.0", + "description": "Retrieve details of the current organization.\n\nUse this tool to get information about the organization linked to the given API token, like name, address, and other relevant details.", + "toolkit": { + "name": "PylonApi", + "description": null, + "version": "0.1.0" + }, + "input": { + "parameters": [] + }, + "output": { + "description": "Response from the API endpoint 'GetMe'.", + "available_modes": [ + "value", + "error", + "null" + ], + "value_schema": { + "val_type": "json", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": null + } + }, + "requirements": { + "authorization": null, + "secrets": [ + { + "key": "PYLON_SECRET_TOKEN" + } + ], + "metadata": null + }, + "deprecation_message": null, + "metadata": { + "object_type": "api_wrapper_tool", + "version": "1.1.0", + "description": "Tools that enable LLMs to interact directly with the pylon API." + }, + "http_endpoint": { + "metadata": { + "object_type": "http_endpoint", + "version": "1.2.0", + "description": "" + }, + "url": "https://api.usepylon.com/me", + "http_method": "GET", + "headers": {}, + "parameters": [], + "documentation_urls": [], + "secrets": [ + { + "arcade_key": "PYLON_SECRET_TOKEN", + "parameter_name": "Authorization", + "accepted_as": "header", + "formatted_value": "Bearer {authorization}", + "description": "", + "is_auth_token": false + } + ], + "request_body_spec": null, + "use_request_body_schema_mode": false, + "validate_request_body_schema": false + } +} diff --git a/toolkits/pylon_api/pylon_api/wrapper_tools/GetTagById.json b/toolkits/pylon_api/pylon_api/wrapper_tools/GetTagById.json new file mode 100644 index 00000000..6844b250 --- /dev/null +++ b/toolkits/pylon_api/pylon_api/wrapper_tools/GetTagById.json @@ -0,0 +1,104 @@ +{ + "name": "GetTagById", + "fully_qualified_name": "PylonApi.GetTagById@0.1.0", + "description": "Retrieve tag details using a specified ID.\n\n", + "toolkit": { + "name": "PylonApi", + "description": null, + "version": "0.1.0" + }, + "input": { + "parameters": [ + { + "name": "tag_id", + "required": true, + "description": "The unique identifier for the tag to retrieve details.", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The ID of the tag." + }, + "inferrable": true, + "http_endpoint_parameter_name": "id" + } + ] + }, + "output": { + "description": "Response from the API endpoint 'GetTag'.", + "available_modes": [ + "value", + "error", + "null" + ], + "value_schema": { + "val_type": "json", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": null + } + }, + "requirements": { + "authorization": null, + "secrets": [ + { + "key": "PYLON_SECRET_TOKEN" + } + ], + "metadata": null + }, + "deprecation_message": null, + "metadata": { + "object_type": "api_wrapper_tool", + "version": "1.1.0", + "description": "Tools that enable LLMs to interact directly with the pylon API." + }, + "http_endpoint": { + "metadata": { + "object_type": "http_endpoint", + "version": "1.2.0", + "description": "" + }, + "url": "https://api.usepylon.com/tags/{id}", + "http_method": "GET", + "headers": {}, + "parameters": [ + { + "name": "id", + "tool_parameter_name": "tag_id", + "description": "The ID of the tag.", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The ID of the tag." + }, + "accepted_as": "path", + "required": true, + "deprecated": false, + "default": null, + "documentation_urls": [] + } + ], + "documentation_urls": [], + "secrets": [ + { + "arcade_key": "PYLON_SECRET_TOKEN", + "parameter_name": "Authorization", + "accepted_as": "header", + "formatted_value": "Bearer {authorization}", + "description": "", + "is_auth_token": false + } + ], + "request_body_spec": null, + "use_request_body_schema_mode": false, + "validate_request_body_schema": false + } +} diff --git a/toolkits/pylon_api/pylon_api/wrapper_tools/GetTeamById.json b/toolkits/pylon_api/pylon_api/wrapper_tools/GetTeamById.json new file mode 100644 index 00000000..01e478f7 --- /dev/null +++ b/toolkits/pylon_api/pylon_api/wrapper_tools/GetTeamById.json @@ -0,0 +1,104 @@ +{ + "name": "GetTeamById", + "fully_qualified_name": "PylonApi.GetTeamById@0.1.0", + "description": "Retrieve team details using the team's ID.\n\nUse this tool to get detailed information about a team by specifying its unique ID.", + "toolkit": { + "name": "PylonApi", + "description": null, + "version": "0.1.0" + }, + "input": { + "parameters": [ + { + "name": "team_id", + "required": true, + "description": "The unique ID of the team to retrieve details for.", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The ID of the team to fetch." + }, + "inferrable": true, + "http_endpoint_parameter_name": "id" + } + ] + }, + "output": { + "description": "Response from the API endpoint 'GetTeam'.", + "available_modes": [ + "value", + "error", + "null" + ], + "value_schema": { + "val_type": "json", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": null + } + }, + "requirements": { + "authorization": null, + "secrets": [ + { + "key": "PYLON_SECRET_TOKEN" + } + ], + "metadata": null + }, + "deprecation_message": null, + "metadata": { + "object_type": "api_wrapper_tool", + "version": "1.1.0", + "description": "Tools that enable LLMs to interact directly with the pylon API." + }, + "http_endpoint": { + "metadata": { + "object_type": "http_endpoint", + "version": "1.2.0", + "description": "" + }, + "url": "https://api.usepylon.com/teams/{id}", + "http_method": "GET", + "headers": {}, + "parameters": [ + { + "name": "id", + "tool_parameter_name": "team_id", + "description": "The ID of the team to fetch.", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The ID of the team to fetch." + }, + "accepted_as": "path", + "required": true, + "deprecated": false, + "default": null, + "documentation_urls": [] + } + ], + "documentation_urls": [], + "secrets": [ + { + "arcade_key": "PYLON_SECRET_TOKEN", + "parameter_name": "Authorization", + "accepted_as": "header", + "formatted_value": "Bearer {authorization}", + "description": "", + "is_auth_token": false + } + ], + "request_body_spec": null, + "use_request_body_schema_mode": false, + "validate_request_body_schema": false + } +} diff --git a/toolkits/pylon_api/pylon_api/wrapper_tools/GetTicketForm.json b/toolkits/pylon_api/pylon_api/wrapper_tools/GetTicketForm.json new file mode 100644 index 00000000..e1a09a34 --- /dev/null +++ b/toolkits/pylon_api/pylon_api/wrapper_tools/GetTicketForm.json @@ -0,0 +1,104 @@ +{ + "name": "GetTicketForm", + "fully_qualified_name": "PylonApi.GetTicketForm@0.1.0", + "description": "Retrieve detailed information about a ticket form.\n\nCall this tool to obtain detailed information for a specific ticket form by providing its ID.", + "toolkit": { + "name": "PylonApi", + "description": null, + "version": "0.1.0" + }, + "input": { + "parameters": [ + { + "name": "ticket_form_id", + "required": true, + "description": "The unique ID of the ticket form to retrieve.", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The ID of the ticket form to fetch." + }, + "inferrable": true, + "http_endpoint_parameter_name": "id" + } + ] + }, + "output": { + "description": "Response from the API endpoint 'GetTicketForm'.", + "available_modes": [ + "value", + "error", + "null" + ], + "value_schema": { + "val_type": "json", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": null + } + }, + "requirements": { + "authorization": null, + "secrets": [ + { + "key": "PYLON_SECRET_TOKEN" + } + ], + "metadata": null + }, + "deprecation_message": null, + "metadata": { + "object_type": "api_wrapper_tool", + "version": "1.1.0", + "description": "Tools that enable LLMs to interact directly with the pylon API." + }, + "http_endpoint": { + "metadata": { + "object_type": "http_endpoint", + "version": "1.2.0", + "description": "" + }, + "url": "https://api.usepylon.com/ticket-forms/{id}", + "http_method": "GET", + "headers": {}, + "parameters": [ + { + "name": "id", + "tool_parameter_name": "ticket_form_id", + "description": "The ID of the ticket form to fetch.", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The ID of the ticket form to fetch." + }, + "accepted_as": "path", + "required": true, + "deprecated": false, + "default": null, + "documentation_urls": [] + } + ], + "documentation_urls": [], + "secrets": [ + { + "arcade_key": "PYLON_SECRET_TOKEN", + "parameter_name": "Authorization", + "accepted_as": "header", + "formatted_value": "Bearer {authorization}", + "description": "", + "is_auth_token": false + } + ], + "request_body_spec": null, + "use_request_body_schema_mode": false, + "validate_request_body_schema": false + } +} diff --git a/toolkits/pylon_api/pylon_api/wrapper_tools/GetTicketForms.json b/toolkits/pylon_api/pylon_api/wrapper_tools/GetTicketForms.json new file mode 100644 index 00000000..bfb3e393 --- /dev/null +++ b/toolkits/pylon_api/pylon_api/wrapper_tools/GetTicketForms.json @@ -0,0 +1,69 @@ +{ + "name": "GetTicketForms", + "fully_qualified_name": "PylonApi.GetTicketForms@0.1.0", + "description": "Retrieve a list of ticket forms available.\n\nThis tool fetches a list of ticket forms, which can be used to understand the structure of available forms for managing tickets. It should be called when you need to review or select from ticket forms.", + "toolkit": { + "name": "PylonApi", + "description": null, + "version": "0.1.0" + }, + "input": { + "parameters": [] + }, + "output": { + "description": "Response from the API endpoint 'GetTicketForms'.", + "available_modes": [ + "value", + "error", + "null" + ], + "value_schema": { + "val_type": "json", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": null + } + }, + "requirements": { + "authorization": null, + "secrets": [ + { + "key": "PYLON_SECRET_TOKEN" + } + ], + "metadata": null + }, + "deprecation_message": null, + "metadata": { + "object_type": "api_wrapper_tool", + "version": "1.1.0", + "description": "Tools that enable LLMs to interact directly with the pylon API." + }, + "http_endpoint": { + "metadata": { + "object_type": "http_endpoint", + "version": "1.2.0", + "description": "" + }, + "url": "https://api.usepylon.com/ticket-forms", + "http_method": "GET", + "headers": {}, + "parameters": [], + "documentation_urls": [], + "secrets": [ + { + "arcade_key": "PYLON_SECRET_TOKEN", + "parameter_name": "Authorization", + "accepted_as": "header", + "formatted_value": "Bearer {authorization}", + "description": "", + "is_auth_token": false + } + ], + "request_body_spec": null, + "use_request_body_schema_mode": false, + "validate_request_body_schema": false + } +} diff --git a/toolkits/pylon_api/pylon_api/wrapper_tools/GetUserById.json b/toolkits/pylon_api/pylon_api/wrapper_tools/GetUserById.json new file mode 100644 index 00000000..43a76236 --- /dev/null +++ b/toolkits/pylon_api/pylon_api/wrapper_tools/GetUserById.json @@ -0,0 +1,104 @@ +{ + "name": "GetUserById", + "fully_qualified_name": "PylonApi.GetUserById@0.1.0", + "description": "Retrieve user details using their unique ID.\n\nUse this tool to get detailed information about a user by providing their unique ID.", + "toolkit": { + "name": "PylonApi", + "description": null, + "version": "0.1.0" + }, + "input": { + "parameters": [ + { + "name": "user_id", + "required": true, + "description": "The unique ID of the user to fetch details for.", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The ID of the user to fetch." + }, + "inferrable": true, + "http_endpoint_parameter_name": "id" + } + ] + }, + "output": { + "description": "Response from the API endpoint 'GetUser'.", + "available_modes": [ + "value", + "error", + "null" + ], + "value_schema": { + "val_type": "json", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": null + } + }, + "requirements": { + "authorization": null, + "secrets": [ + { + "key": "PYLON_SECRET_TOKEN" + } + ], + "metadata": null + }, + "deprecation_message": null, + "metadata": { + "object_type": "api_wrapper_tool", + "version": "1.1.0", + "description": "Tools that enable LLMs to interact directly with the pylon API." + }, + "http_endpoint": { + "metadata": { + "object_type": "http_endpoint", + "version": "1.2.0", + "description": "" + }, + "url": "https://api.usepylon.com/users/{id}", + "http_method": "GET", + "headers": {}, + "parameters": [ + { + "name": "id", + "tool_parameter_name": "user_id", + "description": "The ID of the user to fetch.", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The ID of the user to fetch." + }, + "accepted_as": "path", + "required": true, + "deprecated": false, + "default": null, + "documentation_urls": [] + } + ], + "documentation_urls": [], + "secrets": [ + { + "arcade_key": "PYLON_SECRET_TOKEN", + "parameter_name": "Authorization", + "accepted_as": "header", + "formatted_value": "Bearer {authorization}", + "description": "", + "is_auth_token": false + } + ], + "request_body_spec": null, + "use_request_body_schema_mode": false, + "validate_request_body_schema": false + } +} diff --git a/toolkits/pylon_api/pylon_api/wrapper_tools/GetUserRoles.json b/toolkits/pylon_api/pylon_api/wrapper_tools/GetUserRoles.json new file mode 100644 index 00000000..8a9e8dab --- /dev/null +++ b/toolkits/pylon_api/pylon_api/wrapper_tools/GetUserRoles.json @@ -0,0 +1,69 @@ +{ + "name": "GetUserRoles", + "fully_qualified_name": "PylonApi.GetUserRoles@0.1.0", + "description": "Get a list of all user roles.\n\nUse this tool to retrieve a comprehensive list of all user roles. It is useful for managing and understanding user permissions.", + "toolkit": { + "name": "PylonApi", + "description": null, + "version": "0.1.0" + }, + "input": { + "parameters": [] + }, + "output": { + "description": "Response from the API endpoint 'GetUserRoles'.", + "available_modes": [ + "value", + "error", + "null" + ], + "value_schema": { + "val_type": "json", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": null + } + }, + "requirements": { + "authorization": null, + "secrets": [ + { + "key": "PYLON_SECRET_TOKEN" + } + ], + "metadata": null + }, + "deprecation_message": null, + "metadata": { + "object_type": "api_wrapper_tool", + "version": "1.1.0", + "description": "Tools that enable LLMs to interact directly with the pylon API." + }, + "http_endpoint": { + "metadata": { + "object_type": "http_endpoint", + "version": "1.2.0", + "description": "" + }, + "url": "https://api.usepylon.com/user-roles", + "http_method": "GET", + "headers": {}, + "parameters": [], + "documentation_urls": [], + "secrets": [ + { + "arcade_key": "PYLON_SECRET_TOKEN", + "parameter_name": "Authorization", + "accepted_as": "header", + "formatted_value": "Bearer {authorization}", + "description": "", + "is_auth_token": false + } + ], + "request_body_spec": null, + "use_request_body_schema_mode": false, + "validate_request_body_schema": false + } +} diff --git a/toolkits/pylon_api/pylon_api/wrapper_tools/ImportIssue.json b/toolkits/pylon_api/pylon_api/wrapper_tools/ImportIssue.json new file mode 100644 index 00000000..9430ef70 --- /dev/null +++ b/toolkits/pylon_api/pylon_api/wrapper_tools/ImportIssue.json @@ -0,0 +1,578 @@ +{ + "name": "ImportIssue", + "fully_qualified_name": "PylonApi.ImportIssue@0.1.0", + "description": "Import an issue into the system.\n\nThis tool is used to import an issue into the Pylon system. Use it when you need to add new issues by importing them through a specified format or integration.", + "toolkit": { + "name": "PylonApi", + "description": null, + "version": "0.1.0" + }, + "input": { + "parameters": [ + { + "name": "issue_import_request", + "required": false, + "description": "A JSON object with details for the issue import, including account ID, assignee, attachments, created time, and more.", + "value_schema": { + "val_type": "json", + "inner_val_type": null, + "enum": null, + "properties": { + "account_id": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "AccountID that the issue should belong to." + }, + "assignee_id": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "UserID that the issue should be assigned to." + }, + "attachment_urls": { + "val_type": "array", + "inner_val_type": "string", + "enum": null, + "properties": null, + "inner_properties": null, + "description": "An array of attachment URLs to attach to this issue." + }, + "created_at": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "CreatedAt is the time the issue was created (RFC3339)." + }, + "custom_fields": { + "val_type": "array", + "inner_val_type": "json", + "enum": null, + "properties": null, + "inner_properties": { + "slug": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The slug of the custom field." + }, + "value": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The value of the custom field. Only to be used for single-valued custom fields. If unset, the custom field will be unset. If the custom field is a select field, the value must be the select option slug, which you can find from the GET /custom-fields endpoint." + }, + "values": { + "val_type": "array", + "inner_val_type": "string", + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The values of the custom field. Only to be used for multi-valued custom fields (ex. multiselect). If unset, the custom field will be unset. If the custom field is a multiselect field, the values must be the select option slugs which you can find from the GET /custom-fields endpoint." + } + }, + "description": "An array of custom fields to be used on this issue." + }, + "external_issues": { + "val_type": "array", + "inner_val_type": "json", + "enum": null, + "properties": null, + "inner_properties": { + "external_issue_id": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The ID of the external issue in the source system." + }, + "source": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The source system of the external issue (e.g., \"linear\", \"asana\", \"jira\", \"github\")." + } + }, + "description": "External issues to link to this issue." + }, + "external_refs": { + "val_type": "json", + "inner_val_type": null, + "enum": null, + "properties": { + "intercom_conversation_id": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The Intercom conversation ID associated with this issue, if any." + }, + "zendesk_ticket_id": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The Zendesk ticket ID associated with this issue, if any." + } + }, + "inner_properties": null, + "description": null + }, + "first_response_time": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "FirstResponseTime is the time the issue was first responded to (RFC3339)." + }, + "messages": { + "val_type": "array", + "inner_val_type": "json", + "enum": null, + "properties": null, + "inner_properties": { + "attachment_urls": { + "val_type": "array", + "inner_val_type": "string", + "enum": null, + "properties": null, + "inner_properties": null, + "description": "An array of attachment URLs to attach to this message." + }, + "body_html": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The HTML content of the message." + }, + "contact_id": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The contact that sent the message. Only one of user_id or contact_id can be specified." + }, + "created_at": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "CreatedAt is the time the message was created (RFC3339)." + }, + "is_private": { + "val_type": "boolean", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "Whether the message is private." + }, + "user_id": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The user that sent the message. Only one of user_id or contact_id can be specified." + } + }, + "description": "Messages to be imported for this issue. At least one message is required." + }, + "requester_id": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "ContactID that the issue should be on behalf of." + }, + "resolution_time": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "ResolutionTime is the time the issue was resolved (RFC3339)." + }, + "state": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The state of the issue. Can be one of new, waiting_on_you, waiting_on_customer, on_hold, closed, or a custom status." + }, + "tags": { + "val_type": "array", + "inner_val_type": "string", + "enum": null, + "properties": null, + "inner_properties": null, + "description": "An array of strings to use as tags on this issue." + }, + "team_id": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "TeamID that the issue should be assigned to." + }, + "title": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The title of the issue." + }, + "updated_at": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "UpdatedAt is the time the issue was last updated (RFC3339)." + } + }, + "inner_properties": null, + "description": "" + }, + "inferrable": true, + "http_endpoint_parameter_name": "requestBody" + } + ] + }, + "output": { + "description": "Response from the API endpoint 'ImportIssue'.", + "available_modes": [ + "value", + "error", + "null" + ], + "value_schema": { + "val_type": "json", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": null + } + }, + "requirements": { + "authorization": null, + "secrets": [ + { + "key": "PYLON_SECRET_TOKEN" + } + ], + "metadata": null + }, + "deprecation_message": null, + "metadata": { + "object_type": "api_wrapper_tool", + "version": "1.1.0", + "description": "Tools that enable LLMs to interact directly with the pylon API." + }, + "http_endpoint": { + "metadata": { + "object_type": "http_endpoint", + "version": "1.2.0", + "description": "" + }, + "url": "https://api.usepylon.com/import/issues", + "http_method": "POST", + "headers": {}, + "parameters": [ + { + "name": "requestBody", + "tool_parameter_name": "issue_import_request", + "description": "", + "value_schema": { + "val_type": "json", + "inner_val_type": null, + "enum": null, + "properties": { + "account_id": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "AccountID that the issue should belong to." + }, + "assignee_id": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "UserID that the issue should be assigned to." + }, + "attachment_urls": { + "val_type": "array", + "inner_val_type": "string", + "enum": null, + "properties": null, + "inner_properties": null, + "description": "An array of attachment URLs to attach to this issue." + }, + "created_at": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "CreatedAt is the time the issue was created (RFC3339)." + }, + "custom_fields": { + "val_type": "array", + "inner_val_type": "json", + "enum": null, + "properties": null, + "inner_properties": { + "slug": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The slug of the custom field." + }, + "value": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The value of the custom field. Only to be used for single-valued custom fields. If unset, the custom field will be unset. If the custom field is a select field, the value must be the select option slug, which you can find from the GET /custom-fields endpoint." + }, + "values": { + "val_type": "array", + "inner_val_type": "string", + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The values of the custom field. Only to be used for multi-valued custom fields (ex. multiselect). If unset, the custom field will be unset. If the custom field is a multiselect field, the values must be the select option slugs which you can find from the GET /custom-fields endpoint." + } + }, + "description": "An array of custom fields to be used on this issue." + }, + "external_issues": { + "val_type": "array", + "inner_val_type": "json", + "enum": null, + "properties": null, + "inner_properties": { + "external_issue_id": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The ID of the external issue in the source system." + }, + "source": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The source system of the external issue (e.g., \"linear\", \"asana\", \"jira\", \"github\")." + } + }, + "description": "External issues to link to this issue." + }, + "external_refs": { + "val_type": "json", + "inner_val_type": null, + "enum": null, + "properties": { + "intercom_conversation_id": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The Intercom conversation ID associated with this issue, if any." + }, + "zendesk_ticket_id": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The Zendesk ticket ID associated with this issue, if any." + } + }, + "inner_properties": null, + "description": null + }, + "first_response_time": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "FirstResponseTime is the time the issue was first responded to (RFC3339)." + }, + "messages": { + "val_type": "array", + "inner_val_type": "json", + "enum": null, + "properties": null, + "inner_properties": { + "attachment_urls": { + "val_type": "array", + "inner_val_type": "string", + "enum": null, + "properties": null, + "inner_properties": null, + "description": "An array of attachment URLs to attach to this message." + }, + "body_html": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The HTML content of the message." + }, + "contact_id": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The contact that sent the message. Only one of user_id or contact_id can be specified." + }, + "created_at": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "CreatedAt is the time the message was created (RFC3339)." + }, + "is_private": { + "val_type": "boolean", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "Whether the message is private." + }, + "user_id": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The user that sent the message. Only one of user_id or contact_id can be specified." + } + }, + "description": "Messages to be imported for this issue. At least one message is required." + }, + "requester_id": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "ContactID that the issue should be on behalf of." + }, + "resolution_time": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "ResolutionTime is the time the issue was resolved (RFC3339)." + }, + "state": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The state of the issue. Can be one of new, waiting_on_you, waiting_on_customer, on_hold, closed, or a custom status." + }, + "tags": { + "val_type": "array", + "inner_val_type": "string", + "enum": null, + "properties": null, + "inner_properties": null, + "description": "An array of strings to use as tags on this issue." + }, + "team_id": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "TeamID that the issue should be assigned to." + }, + "title": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The title of the issue." + }, + "updated_at": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "UpdatedAt is the time the issue was last updated (RFC3339)." + } + }, + "inner_properties": null, + "description": "" + }, + "accepted_as": "body", + "required": false, + "deprecated": false, + "default": null, + "documentation_urls": [] + } + ], + "documentation_urls": [], + "secrets": [ + { + "arcade_key": "PYLON_SECRET_TOKEN", + "parameter_name": "Authorization", + "accepted_as": "header", + "formatted_value": "Bearer {authorization}", + "description": "", + "is_auth_token": false + } + ], + "request_body_spec": "{\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"properties\": {\n \"account_id\": {\n \"description\": \"AccountID that the issue should belong to.\",\n \"type\": \"string\",\n \"x-go-name\": \"AccountID\"\n },\n \"assignee_id\": {\n \"description\": \"UserID that the issue should be assigned to.\",\n \"type\": \"string\",\n \"x-go-name\": \"AssigneeID\"\n },\n \"attachment_urls\": {\n \"description\": \"An array of attachment URLs to attach to this issue.\",\n \"items\": {\n \"type\": \"string\"\n },\n \"type\": \"array\",\n \"x-go-name\": \"AttachmentURLs\"\n },\n \"created_at\": {\n \"description\": \"CreatedAt is the time the issue was created (RFC3339).\",\n \"type\": \"string\",\n \"x-go-name\": \"CreatedAt\"\n },\n \"custom_fields\": {\n \"description\": \"An array of custom fields to be used on this issue.\",\n \"items\": {\n \"properties\": {\n \"slug\": {\n \"description\": \"The slug of the custom field.\",\n \"type\": \"string\",\n \"x-go-name\": \"Slug\"\n },\n \"value\": {\n \"description\": \"The value of the custom field. Only to be used for single-valued custom fields. If unset, the custom field will be unset. If the custom field is a select field, the value must be the select option slug, which you can find from the GET /custom-fields endpoint.\",\n \"type\": \"string\",\n \"x-go-name\": \"Value\"\n },\n \"values\": {\n \"description\": \"The values of the custom field. Only to be used for multi-valued custom fields (ex. multiselect). If unset, the custom field will be unset. If the custom field is a multiselect field, the values must be the select option slugs which you can find from the GET /custom-fields endpoint.\",\n \"items\": {\n \"type\": \"string\"\n },\n \"type\": \"array\",\n \"x-go-name\": \"Values\"\n }\n },\n \"type\": \"object\",\n \"x-go-package\": \"pylon/api/apiserver/apitypes\"\n },\n \"type\": \"array\",\n \"x-go-name\": \"CustomFields\"\n },\n \"external_issues\": {\n \"description\": \"External issues to link to this issue.\",\n \"items\": {\n \"properties\": {\n \"external_issue_id\": {\n \"description\": \"The ID of the external issue in the source system.\",\n \"type\": \"string\",\n \"x-go-name\": \"ExternalIssueID\"\n },\n \"source\": {\n \"description\": \"The source system of the external issue (e.g., \\\"linear\\\", \\\"asana\\\", \\\"jira\\\", \\\"github\\\").\",\n \"type\": \"string\",\n \"x-go-name\": \"Source\"\n }\n },\n \"required\": [\n \"external_issue_id\",\n \"source\"\n ],\n \"type\": \"object\",\n \"x-go-package\": \"pylon/api/apiserver/endpoints\"\n },\n \"type\": \"array\",\n \"x-go-name\": \"ExternalIssues\"\n },\n \"external_refs\": {\n \"properties\": {\n \"intercom_conversation_id\": {\n \"description\": \"The Intercom conversation ID associated with this issue, if any.\",\n \"type\": \"string\",\n \"x-go-name\": \"IntercomConversationID\"\n },\n \"zendesk_ticket_id\": {\n \"description\": \"The Zendesk ticket ID associated with this issue, if any.\",\n \"type\": \"string\",\n \"x-go-name\": \"ZendeskTicketID\"\n }\n },\n \"type\": \"object\",\n \"x-go-package\": \"pylon/api/apiserver/endpoints\"\n },\n \"first_response_time\": {\n \"description\": \"FirstResponseTime is the time the issue was first responded to (RFC3339).\",\n \"type\": \"string\",\n \"x-go-name\": \"FirstResponseTime\"\n },\n \"messages\": {\n \"description\": \"Messages to be imported for this issue. At least one message is required.\",\n \"items\": {\n \"properties\": {\n \"attachment_urls\": {\n \"description\": \"An array of attachment URLs to attach to this message.\",\n \"items\": {\n \"type\": \"string\"\n },\n \"type\": \"array\",\n \"x-go-name\": \"AttachmentURLs\"\n },\n \"body_html\": {\n \"description\": \"The HTML content of the message.\",\n \"type\": \"string\",\n \"x-go-name\": \"BodyHTML\"\n },\n \"contact_id\": {\n \"description\": \"The contact that sent the message. Only one of user_id or contact_id can be specified.\",\n \"type\": \"string\",\n \"x-go-name\": \"ContactID\"\n },\n \"created_at\": {\n \"description\": \"CreatedAt is the time the message was created (RFC3339).\",\n \"type\": \"string\",\n \"x-go-name\": \"CreatedAt\"\n },\n \"is_private\": {\n \"description\": \"Whether the message is private.\",\n \"type\": \"boolean\",\n \"x-go-name\": \"IsPrivate\"\n },\n \"user_id\": {\n \"description\": \"The user that sent the message. Only one of user_id or contact_id can be specified.\",\n \"type\": \"string\",\n \"x-go-name\": \"UserID\"\n }\n },\n \"required\": [\n \"body_html\",\n \"is_private\"\n ],\n \"type\": \"object\",\n \"x-go-package\": \"pylon/api/apiserver/endpoints\"\n },\n \"type\": \"array\",\n \"x-go-name\": \"Messages\"\n },\n \"requester_id\": {\n \"description\": \"ContactID that the issue should be on behalf of.\",\n \"type\": \"string\",\n \"x-go-name\": \"RequesterID\"\n },\n \"resolution_time\": {\n \"description\": \"ResolutionTime is the time the issue was resolved (RFC3339).\",\n \"type\": \"string\",\n \"x-go-name\": \"ResolutionTime\"\n },\n \"state\": {\n \"description\": \"The state of the issue. Can be one of new, waiting_on_you, waiting_on_customer, on_hold, closed, or a custom status.\",\n \"type\": \"string\",\n \"x-go-name\": \"State\"\n },\n \"tags\": {\n \"description\": \"An array of strings to use as tags on this issue.\",\n \"items\": {\n \"type\": \"string\"\n },\n \"type\": \"array\",\n \"x-go-name\": \"Tags\"\n },\n \"team_id\": {\n \"description\": \"TeamID that the issue should be assigned to.\",\n \"type\": \"string\",\n \"x-go-name\": \"TeamID\"\n },\n \"title\": {\n \"description\": \"The title of the issue.\",\n \"type\": \"string\",\n \"x-go-name\": \"Title\"\n },\n \"updated_at\": {\n \"description\": \"UpdatedAt is the time the issue was last updated (RFC3339).\",\n \"type\": \"string\",\n \"x-go-name\": \"UpdatedAt\"\n }\n },\n \"required\": [\n \"messages\",\n \"state\",\n \"title\"\n ],\n \"type\": \"object\",\n \"x-go-package\": \"pylon/api/apiserver/endpoints\"\n }\n }\n },\n \"required\": false\n}", + "use_request_body_schema_mode": true, + "validate_request_body_schema": true + } +} diff --git a/toolkits/pylon_api/pylon_api/wrapper_tools/ImportMessagesToIssue.json b/toolkits/pylon_api/pylon_api/wrapper_tools/ImportMessagesToIssue.json new file mode 100644 index 00000000..d8d11d55 --- /dev/null +++ b/toolkits/pylon_api/pylon_api/wrapper_tools/ImportMessagesToIssue.json @@ -0,0 +1,253 @@ +{ + "name": "ImportMessagesToIssue", + "fully_qualified_name": "PylonApi.ImportMessagesToIssue@0.1.0", + "description": "Import messages into an existing issue.\n\nUse this tool to import new messages onto an existing issue, facilitating better organization and tracking within issue management systems.", + "toolkit": { + "name": "PylonApi", + "description": null, + "version": "0.1.0" + }, + "input": { + "parameters": [ + { + "name": "issue_id", + "required": true, + "description": "The unique ID of the existing issue to which messages will be imported.", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The ID of the issue." + }, + "inferrable": true, + "http_endpoint_parameter_name": "id" + }, + { + "name": "imported_messages", + "required": false, + "description": "A JSON array of messages to import, each containing fields like body_html, contact_id or user_id (one is required), created_at, is_private, and optional attachment_urls.", + "value_schema": { + "val_type": "json", + "inner_val_type": null, + "enum": null, + "properties": { + "messages": { + "val_type": "array", + "inner_val_type": "json", + "enum": null, + "properties": null, + "inner_properties": { + "attachment_urls": { + "val_type": "array", + "inner_val_type": "string", + "enum": null, + "properties": null, + "inner_properties": null, + "description": "An array of attachment URLs to attach to this message." + }, + "body_html": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The HTML content of the message." + }, + "contact_id": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The contact that sent the message. Only one of user_id or contact_id can be specified." + }, + "created_at": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "CreatedAt is the time the message was created (RFC3339)." + }, + "is_private": { + "val_type": "boolean", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "Whether the message is private." + }, + "user_id": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The user that sent the message. Only one of user_id or contact_id can be specified." + } + }, + "description": "Messages to be imported for this issue. At least one message is required." + } + }, + "inner_properties": null, + "description": "" + }, + "inferrable": true, + "http_endpoint_parameter_name": "requestBody" + } + ] + }, + "output": { + "description": "Response from the API endpoint 'ImportMessages'.", + "available_modes": [ + "value", + "error", + "null" + ], + "value_schema": { + "val_type": "json", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": null + } + }, + "requirements": { + "authorization": null, + "secrets": [ + { + "key": "PYLON_SECRET_TOKEN" + } + ], + "metadata": null + }, + "deprecation_message": null, + "metadata": { + "object_type": "api_wrapper_tool", + "version": "1.1.0", + "description": "Tools that enable LLMs to interact directly with the pylon API." + }, + "http_endpoint": { + "metadata": { + "object_type": "http_endpoint", + "version": "1.2.0", + "description": "" + }, + "url": "https://api.usepylon.com/import/issues/{id}/messages", + "http_method": "POST", + "headers": {}, + "parameters": [ + { + "name": "id", + "tool_parameter_name": "issue_id", + "description": "The ID of the issue.", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The ID of the issue." + }, + "accepted_as": "path", + "required": true, + "deprecated": false, + "default": null, + "documentation_urls": [] + }, + { + "name": "requestBody", + "tool_parameter_name": "imported_messages", + "description": "", + "value_schema": { + "val_type": "json", + "inner_val_type": null, + "enum": null, + "properties": { + "messages": { + "val_type": "array", + "inner_val_type": "json", + "enum": null, + "properties": null, + "inner_properties": { + "attachment_urls": { + "val_type": "array", + "inner_val_type": "string", + "enum": null, + "properties": null, + "inner_properties": null, + "description": "An array of attachment URLs to attach to this message." + }, + "body_html": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The HTML content of the message." + }, + "contact_id": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The contact that sent the message. Only one of user_id or contact_id can be specified." + }, + "created_at": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "CreatedAt is the time the message was created (RFC3339)." + }, + "is_private": { + "val_type": "boolean", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "Whether the message is private." + }, + "user_id": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The user that sent the message. Only one of user_id or contact_id can be specified." + } + }, + "description": "Messages to be imported for this issue. At least one message is required." + } + }, + "inner_properties": null, + "description": "" + }, + "accepted_as": "body", + "required": false, + "deprecated": false, + "default": null, + "documentation_urls": [] + } + ], + "documentation_urls": [], + "secrets": [ + { + "arcade_key": "PYLON_SECRET_TOKEN", + "parameter_name": "Authorization", + "accepted_as": "header", + "formatted_value": "Bearer {authorization}", + "description": "", + "is_auth_token": false + } + ], + "request_body_spec": "{\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"properties\": {\n \"messages\": {\n \"description\": \"Messages to be imported for this issue. At least one message is required.\",\n \"items\": {\n \"properties\": {\n \"attachment_urls\": {\n \"description\": \"An array of attachment URLs to attach to this message.\",\n \"items\": {\n \"type\": \"string\"\n },\n \"type\": \"array\",\n \"x-go-name\": \"AttachmentURLs\"\n },\n \"body_html\": {\n \"description\": \"The HTML content of the message.\",\n \"type\": \"string\",\n \"x-go-name\": \"BodyHTML\"\n },\n \"contact_id\": {\n \"description\": \"The contact that sent the message. Only one of user_id or contact_id can be specified.\",\n \"type\": \"string\",\n \"x-go-name\": \"ContactID\"\n },\n \"created_at\": {\n \"description\": \"CreatedAt is the time the message was created (RFC3339).\",\n \"type\": \"string\",\n \"x-go-name\": \"CreatedAt\"\n },\n \"is_private\": {\n \"description\": \"Whether the message is private.\",\n \"type\": \"boolean\",\n \"x-go-name\": \"IsPrivate\"\n },\n \"user_id\": {\n \"description\": \"The user that sent the message. Only one of user_id or contact_id can be specified.\",\n \"type\": \"string\",\n \"x-go-name\": \"UserID\"\n }\n },\n \"required\": [\n \"body_html\",\n \"is_private\"\n ],\n \"type\": \"object\",\n \"x-go-package\": \"pylon/api/apiserver/endpoints\"\n },\n \"type\": \"array\",\n \"x-go-name\": \"Messages\"\n }\n },\n \"required\": [\n \"messages\"\n ],\n \"type\": \"object\",\n \"x-go-package\": \"pylon/api/apiserver/endpoints\"\n }\n }\n },\n \"required\": false\n}", + "use_request_body_schema_mode": true, + "validate_request_body_schema": true + } +} diff --git a/toolkits/pylon_api/pylon_api/wrapper_tools/ImportNewContact.json b/toolkits/pylon_api/pylon_api/wrapper_tools/ImportNewContact.json new file mode 100644 index 00000000..5652dd63 --- /dev/null +++ b/toolkits/pylon_api/pylon_api/wrapper_tools/ImportNewContact.json @@ -0,0 +1,260 @@ +{ + "name": "ImportNewContact", + "fully_qualified_name": "PylonApi.ImportNewContact@0.1.0", + "description": "Import a new contact into the system.\n\nUse this tool to import a new contact into the system whenever you need to add contact information.", + "toolkit": { + "name": "PylonApi", + "description": null, + "version": "0.1.0" + }, + "input": { + "parameters": [ + { + "name": "contact_details", + "required": false, + "description": "A JSON object containing the contact's details, such as account ID, avatar URL, custom fields, email, name, and portal role.", + "value_schema": { + "val_type": "json", + "inner_val_type": null, + "enum": null, + "properties": { + "account_id": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The account that this contact belongs to." + }, + "avatar_url": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The avatar URL of the contact. Must be a square .png, .jpg or .jpeg." + }, + "custom_fields": { + "val_type": "array", + "inner_val_type": "json", + "enum": null, + "properties": null, + "inner_properties": { + "slug": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The slug of the custom field." + }, + "value": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The value of the custom field. Only to be used for single-valued custom fields. If unset, the custom field will be unset. If the custom field is a select field, the value must be the select option slug, which you can find from the GET /custom-fields endpoint." + }, + "values": { + "val_type": "array", + "inner_val_type": "string", + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The values of the custom field. Only to be used for multi-valued custom fields (ex. multiselect). If unset, the custom field will be unset. If the custom field is a multiselect field, the values must be the select option slugs which you can find from the GET /custom-fields endpoint." + } + }, + "description": "An array of custom fields to be applied to this contact." + }, + "email": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The email of the contact." + }, + "name": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The name of the contact." + }, + "portal_role": { + "val_type": "string", + "inner_val_type": null, + "enum": [ + "no_access", + "member", + "admin" + ], + "properties": null, + "inner_properties": null, + "description": "The portal role to assign to the contact. If not provided uses the default portal role from the portal settings.\n\n* no_access PortalRoleNoAccess\n\n* member PortalRoleMember\n\n* admin PortalRoleAdmin" + } + }, + "inner_properties": null, + "description": "" + }, + "inferrable": true, + "http_endpoint_parameter_name": "requestBody" + } + ] + }, + "output": { + "description": "Response from the API endpoint 'ImportContact'.", + "available_modes": [ + "value", + "error", + "null" + ], + "value_schema": { + "val_type": "json", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": null + } + }, + "requirements": { + "authorization": null, + "secrets": [ + { + "key": "PYLON_SECRET_TOKEN" + } + ], + "metadata": null + }, + "deprecation_message": null, + "metadata": { + "object_type": "api_wrapper_tool", + "version": "1.1.0", + "description": "Tools that enable LLMs to interact directly with the pylon API." + }, + "http_endpoint": { + "metadata": { + "object_type": "http_endpoint", + "version": "1.2.0", + "description": "" + }, + "url": "https://api.usepylon.com/import/contacts", + "http_method": "POST", + "headers": {}, + "parameters": [ + { + "name": "requestBody", + "tool_parameter_name": "contact_details", + "description": "", + "value_schema": { + "val_type": "json", + "inner_val_type": null, + "enum": null, + "properties": { + "account_id": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The account that this contact belongs to." + }, + "avatar_url": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The avatar URL of the contact. Must be a square .png, .jpg or .jpeg." + }, + "custom_fields": { + "val_type": "array", + "inner_val_type": "json", + "enum": null, + "properties": null, + "inner_properties": { + "slug": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The slug of the custom field." + }, + "value": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The value of the custom field. Only to be used for single-valued custom fields. If unset, the custom field will be unset. If the custom field is a select field, the value must be the select option slug, which you can find from the GET /custom-fields endpoint." + }, + "values": { + "val_type": "array", + "inner_val_type": "string", + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The values of the custom field. Only to be used for multi-valued custom fields (ex. multiselect). If unset, the custom field will be unset. If the custom field is a multiselect field, the values must be the select option slugs which you can find from the GET /custom-fields endpoint." + } + }, + "description": "An array of custom fields to be applied to this contact." + }, + "email": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The email of the contact." + }, + "name": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The name of the contact." + }, + "portal_role": { + "val_type": "string", + "inner_val_type": null, + "enum": [ + "no_access", + "member", + "admin" + ], + "properties": null, + "inner_properties": null, + "description": "The portal role to assign to the contact. If not provided uses the default portal role from the portal settings.\n\n* no_access PortalRoleNoAccess\n\n* member PortalRoleMember\n\n* admin PortalRoleAdmin" + } + }, + "inner_properties": null, + "description": "" + }, + "accepted_as": "body", + "required": false, + "deprecated": false, + "default": null, + "documentation_urls": [] + } + ], + "documentation_urls": [], + "secrets": [ + { + "arcade_key": "PYLON_SECRET_TOKEN", + "parameter_name": "Authorization", + "accepted_as": "header", + "formatted_value": "Bearer {authorization}", + "description": "", + "is_auth_token": false + } + ], + "request_body_spec": "{\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"properties\": {\n \"account_id\": {\n \"description\": \"The account that this contact belongs to.\",\n \"type\": \"string\",\n \"x-go-name\": \"AccountID\"\n },\n \"avatar_url\": {\n \"description\": \"The avatar URL of the contact. Must be a square .png, .jpg or .jpeg.\",\n \"type\": \"string\",\n \"x-go-name\": \"AvatarUrl\"\n },\n \"custom_fields\": {\n \"description\": \"An array of custom fields to be applied to this contact.\",\n \"items\": {\n \"properties\": {\n \"slug\": {\n \"description\": \"The slug of the custom field.\",\n \"type\": \"string\",\n \"x-go-name\": \"Slug\"\n },\n \"value\": {\n \"description\": \"The value of the custom field. Only to be used for single-valued custom fields. If unset, the custom field will be unset. If the custom field is a select field, the value must be the select option slug, which you can find from the GET /custom-fields endpoint.\",\n \"type\": \"string\",\n \"x-go-name\": \"Value\"\n },\n \"values\": {\n \"description\": \"The values of the custom field. Only to be used for multi-valued custom fields (ex. multiselect). If unset, the custom field will be unset. If the custom field is a multiselect field, the values must be the select option slugs which you can find from the GET /custom-fields endpoint.\",\n \"items\": {\n \"type\": \"string\"\n },\n \"type\": \"array\",\n \"x-go-name\": \"Values\"\n }\n },\n \"type\": \"object\",\n \"x-go-package\": \"pylon/api/apiserver/apitypes\"\n },\n \"type\": \"array\",\n \"x-go-name\": \"CustomFields\"\n },\n \"email\": {\n \"description\": \"The email of the contact.\",\n \"type\": \"string\",\n \"x-go-name\": \"Email\"\n },\n \"name\": {\n \"description\": \"The name of the contact.\",\n \"type\": \"string\",\n \"x-go-name\": \"Name\"\n },\n \"portal_role\": {\n \"description\": \"The portal role to assign to the contact. If not provided uses the default portal role from the portal settings.\\n\\n* no_access PortalRoleNoAccess\\n\\n* member PortalRoleMember\\n\\n* admin PortalRoleAdmin\",\n \"enum\": [\n \"no_access\",\n \"member\",\n \"admin\"\n ],\n \"type\": \"string\",\n \"x-go-enum-desc\": \"no_access PortalRoleNoAccess\\nmember PortalRoleMember\\nadmin PortalRoleAdmin\",\n \"x-go-name\": \"PortalRole\"\n }\n },\n \"required\": [\n \"email\",\n \"name\"\n ],\n \"type\": \"object\",\n \"x-go-package\": \"pylon/api/apiserver/endpoints\"\n }\n }\n },\n \"required\": false\n}", + "use_request_body_schema_mode": true, + "validate_request_body_schema": true + } +} diff --git a/toolkits/pylon_api/pylon_api/wrapper_tools/LinkExternalIssue.json b/toolkits/pylon_api/pylon_api/wrapper_tools/LinkExternalIssue.json new file mode 100644 index 00000000..ea8a60c5 --- /dev/null +++ b/toolkits/pylon_api/pylon_api/wrapper_tools/LinkExternalIssue.json @@ -0,0 +1,187 @@ +{ + "name": "LinkExternalIssue", + "fully_qualified_name": "PylonApi.LinkExternalIssue@0.1.0", + "description": "Link or unlink external issues to an internal issue.\n\nUse this tool to link external issues to an internal issue or unlink them by specifying the operation type. Ideal for managing issue relationships between different systems.", + "toolkit": { + "name": "PylonApi", + "description": null, + "version": "0.1.0" + }, + "input": { + "parameters": [ + { + "name": "issue_identifier", + "required": true, + "description": "The unique ID or number of the internal issue to which external issues should be linked or unlinked.", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The ID or number of the issue to link external issues to." + }, + "inferrable": true, + "http_endpoint_parameter_name": "id" + }, + { + "name": "external_issue_details", + "required": false, + "description": "JSON object containing details of the external issue, including `external_issue_id`, `operation` (link/unlink), and `source` system.", + "value_schema": { + "val_type": "json", + "inner_val_type": null, + "enum": null, + "properties": { + "external_issue_id": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The ID of the external issue in the source system." + }, + "operation": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "Operation to perform. Use \"link\" to link issues (default) or \"unlink\" to unlink issues." + }, + "source": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The source system of the external issue (e.g., \"linear\", \"asana\", \"jira\", \"github\")." + } + }, + "inner_properties": null, + "description": "" + }, + "inferrable": true, + "http_endpoint_parameter_name": "requestBody" + } + ] + }, + "output": { + "description": "Response from the API endpoint 'LinkExternalIssue'.", + "available_modes": [ + "value", + "error", + "null" + ], + "value_schema": { + "val_type": "json", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": null + } + }, + "requirements": { + "authorization": null, + "secrets": [ + { + "key": "PYLON_SECRET_TOKEN" + } + ], + "metadata": null + }, + "deprecation_message": null, + "metadata": { + "object_type": "api_wrapper_tool", + "version": "1.1.0", + "description": "Tools that enable LLMs to interact directly with the pylon API." + }, + "http_endpoint": { + "metadata": { + "object_type": "http_endpoint", + "version": "1.2.0", + "description": "" + }, + "url": "https://api.usepylon.com/issues/{id}/external-issues", + "http_method": "POST", + "headers": {}, + "parameters": [ + { + "name": "id", + "tool_parameter_name": "issue_identifier", + "description": "The ID or number of the issue to link external issues to.", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The ID or number of the issue to link external issues to." + }, + "accepted_as": "path", + "required": true, + "deprecated": false, + "default": null, + "documentation_urls": [] + }, + { + "name": "requestBody", + "tool_parameter_name": "external_issue_details", + "description": "", + "value_schema": { + "val_type": "json", + "inner_val_type": null, + "enum": null, + "properties": { + "external_issue_id": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The ID of the external issue in the source system." + }, + "operation": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "Operation to perform. Use \"link\" to link issues (default) or \"unlink\" to unlink issues." + }, + "source": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The source system of the external issue (e.g., \"linear\", \"asana\", \"jira\", \"github\")." + } + }, + "inner_properties": null, + "description": "" + }, + "accepted_as": "body", + "required": false, + "deprecated": false, + "default": null, + "documentation_urls": [] + } + ], + "documentation_urls": [], + "secrets": [ + { + "arcade_key": "PYLON_SECRET_TOKEN", + "parameter_name": "Authorization", + "accepted_as": "header", + "formatted_value": "Bearer {authorization}", + "description": "", + "is_auth_token": false + } + ], + "request_body_spec": "{\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"properties\": {\n \"external_issue_id\": {\n \"description\": \"The ID of the external issue in the source system.\",\n \"type\": \"string\",\n \"x-go-name\": \"ExternalIssueID\"\n },\n \"operation\": {\n \"description\": \"Operation to perform. Use \\\"link\\\" to link issues (default) or \\\"unlink\\\" to unlink issues.\",\n \"type\": \"string\",\n \"x-go-name\": \"Operation\"\n },\n \"source\": {\n \"description\": \"The source system of the external issue (e.g., \\\"linear\\\", \\\"asana\\\", \\\"jira\\\", \\\"github\\\").\",\n \"type\": \"string\",\n \"x-go-name\": \"Source\"\n }\n },\n \"required\": [\n \"external_issue_id\",\n \"source\"\n ],\n \"type\": \"object\",\n \"x-go-package\": \"pylon/api/apiserver/endpoints\"\n }\n }\n },\n \"required\": false\n}", + "use_request_body_schema_mode": true, + "validate_request_body_schema": true + } +} diff --git a/toolkits/pylon_api/pylon_api/wrapper_tools/ListCollectionsInKnowledgeBase.json b/toolkits/pylon_api/pylon_api/wrapper_tools/ListCollectionsInKnowledgeBase.json new file mode 100644 index 00000000..775c7bd4 --- /dev/null +++ b/toolkits/pylon_api/pylon_api/wrapper_tools/ListCollectionsInKnowledgeBase.json @@ -0,0 +1,104 @@ +{ + "name": "ListCollectionsInKnowledgeBase", + "fully_qualified_name": "PylonApi.ListCollectionsInKnowledgeBase@0.1.0", + "description": "List all collections in a knowledge base.\n\nUse this tool to retrieve all collections within a specific knowledge base. Useful for accessing organized information in structured formats.", + "toolkit": { + "name": "PylonApi", + "description": null, + "version": "0.1.0" + }, + "input": { + "parameters": [ + { + "name": "knowledge_base_id", + "required": true, + "description": "The ID of the knowledge base to list the collections from.", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The ID of the knowledge base" + }, + "inferrable": true, + "http_endpoint_parameter_name": "id" + } + ] + }, + "output": { + "description": "Response from the API endpoint 'GetCollections'.", + "available_modes": [ + "value", + "error", + "null" + ], + "value_schema": { + "val_type": "json", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": null + } + }, + "requirements": { + "authorization": null, + "secrets": [ + { + "key": "PYLON_SECRET_TOKEN" + } + ], + "metadata": null + }, + "deprecation_message": null, + "metadata": { + "object_type": "api_wrapper_tool", + "version": "1.1.0", + "description": "Tools that enable LLMs to interact directly with the pylon API." + }, + "http_endpoint": { + "metadata": { + "object_type": "http_endpoint", + "version": "1.2.0", + "description": "" + }, + "url": "https://api.usepylon.com/knowledge-bases/{id}/collections", + "http_method": "GET", + "headers": {}, + "parameters": [ + { + "name": "id", + "tool_parameter_name": "knowledge_base_id", + "description": "The ID of the knowledge base", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The ID of the knowledge base" + }, + "accepted_as": "path", + "required": true, + "deprecated": false, + "default": null, + "documentation_urls": [] + } + ], + "documentation_urls": [], + "secrets": [ + { + "arcade_key": "PYLON_SECRET_TOKEN", + "parameter_name": "Authorization", + "accepted_as": "header", + "formatted_value": "Bearer {authorization}", + "description": "", + "is_auth_token": false + } + ], + "request_body_spec": null, + "use_request_body_schema_mode": false, + "validate_request_body_schema": false + } +} diff --git a/toolkits/pylon_api/pylon_api/wrapper_tools/ListTrainingData.json b/toolkits/pylon_api/pylon_api/wrapper_tools/ListTrainingData.json new file mode 100644 index 00000000..c9827c7e --- /dev/null +++ b/toolkits/pylon_api/pylon_api/wrapper_tools/ListTrainingData.json @@ -0,0 +1,69 @@ +{ + "name": "ListTrainingData", + "fully_qualified_name": "PylonApi.ListTrainingData@0.1.0", + "description": "Fetches all training data configurations for the organization.\n\nUse this tool to retrieve a comprehensive list of training data configurations associated with the organization. Ideal for managing or reviewing training datasets.", + "toolkit": { + "name": "PylonApi", + "description": null, + "version": "0.1.0" + }, + "input": { + "parameters": [] + }, + "output": { + "description": "Response from the API endpoint 'ListTrainingData'.", + "available_modes": [ + "value", + "error", + "null" + ], + "value_schema": { + "val_type": "json", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": null + } + }, + "requirements": { + "authorization": null, + "secrets": [ + { + "key": "PYLON_SECRET_TOKEN" + } + ], + "metadata": null + }, + "deprecation_message": null, + "metadata": { + "object_type": "api_wrapper_tool", + "version": "1.1.0", + "description": "Tools that enable LLMs to interact directly with the pylon API." + }, + "http_endpoint": { + "metadata": { + "object_type": "http_endpoint", + "version": "1.2.0", + "description": "" + }, + "url": "https://api.usepylon.com/training-data", + "http_method": "GET", + "headers": {}, + "parameters": [], + "documentation_urls": [], + "secrets": [ + { + "arcade_key": "PYLON_SECRET_TOKEN", + "parameter_name": "Authorization", + "accepted_as": "header", + "formatted_value": "Bearer {authorization}", + "description": "", + "is_auth_token": false + } + ], + "request_body_spec": null, + "use_request_body_schema_mode": false, + "validate_request_body_schema": false + } +} diff --git a/toolkits/pylon_api/pylon_api/wrapper_tools/ListUsers.json b/toolkits/pylon_api/pylon_api/wrapper_tools/ListUsers.json new file mode 100644 index 00000000..442e608c --- /dev/null +++ b/toolkits/pylon_api/pylon_api/wrapper_tools/ListUsers.json @@ -0,0 +1,69 @@ +{ + "name": "ListUsers", + "fully_qualified_name": "PylonApi.ListUsers@0.1.0", + "description": "Fetches a list of users.\n\nUse this tool to retrieve a list of all users. It provides an overview of the users available in the system.", + "toolkit": { + "name": "PylonApi", + "description": null, + "version": "0.1.0" + }, + "input": { + "parameters": [] + }, + "output": { + "description": "Response from the API endpoint 'GetUsers'.", + "available_modes": [ + "value", + "error", + "null" + ], + "value_schema": { + "val_type": "json", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": null + } + }, + "requirements": { + "authorization": null, + "secrets": [ + { + "key": "PYLON_SECRET_TOKEN" + } + ], + "metadata": null + }, + "deprecation_message": null, + "metadata": { + "object_type": "api_wrapper_tool", + "version": "1.1.0", + "description": "Tools that enable LLMs to interact directly with the pylon API." + }, + "http_endpoint": { + "metadata": { + "object_type": "http_endpoint", + "version": "1.2.0", + "description": "" + }, + "url": "https://api.usepylon.com/users", + "http_method": "GET", + "headers": {}, + "parameters": [], + "documentation_urls": [], + "secrets": [ + { + "arcade_key": "PYLON_SECRET_TOKEN", + "parameter_name": "Authorization", + "accepted_as": "header", + "formatted_value": "Bearer {authorization}", + "description": "", + "is_auth_token": false + } + ], + "request_body_spec": null, + "use_request_body_schema_mode": false, + "validate_request_body_schema": false + } +} diff --git a/toolkits/pylon_api/pylon_api/wrapper_tools/RedactMessage.json b/toolkits/pylon_api/pylon_api/wrapper_tools/RedactMessage.json new file mode 100644 index 00000000..0f86c57f --- /dev/null +++ b/toolkits/pylon_api/pylon_api/wrapper_tools/RedactMessage.json @@ -0,0 +1,137 @@ +{ + "name": "RedactMessage", + "fully_qualified_name": "PylonApi.RedactMessage@0.1.0", + "description": "Removes or hides the content of a specified message.\n\nUse this tool to redact (remove or hide) the content of a message identified by a specific message ID within an issue. This is useful for maintaining privacy or correcting errors.", + "toolkit": { + "name": "PylonApi", + "description": null, + "version": "0.1.0" + }, + "input": { + "parameters": [ + { + "name": "issue_id", + "required": true, + "description": "The ID of the issue associated with the message to be redacted.", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The ID of the issue that the message belongs to." + }, + "inferrable": true, + "http_endpoint_parameter_name": "id" + }, + { + "name": "message_id", + "required": true, + "description": "The unique identifier of the message to be redacted.", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The ID of the message to redact." + }, + "inferrable": true, + "http_endpoint_parameter_name": "message_id" + } + ] + }, + "output": { + "description": "Response from the API endpoint 'RedactMessage'.", + "available_modes": [ + "value", + "error", + "null" + ], + "value_schema": { + "val_type": "json", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": null + } + }, + "requirements": { + "authorization": null, + "secrets": [ + { + "key": "PYLON_SECRET_TOKEN" + } + ], + "metadata": null + }, + "deprecation_message": null, + "metadata": { + "object_type": "api_wrapper_tool", + "version": "1.1.0", + "description": "Tools that enable LLMs to interact directly with the pylon API." + }, + "http_endpoint": { + "metadata": { + "object_type": "http_endpoint", + "version": "1.2.0", + "description": "" + }, + "url": "https://api.usepylon.com/issues/{id}/messages/{message_id}/redact", + "http_method": "POST", + "headers": {}, + "parameters": [ + { + "name": "id", + "tool_parameter_name": "issue_id", + "description": "The ID of the issue that the message belongs to.", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The ID of the issue that the message belongs to." + }, + "accepted_as": "path", + "required": true, + "deprecated": false, + "default": null, + "documentation_urls": [] + }, + { + "name": "message_id", + "tool_parameter_name": "message_id", + "description": "The ID of the message to redact.", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The ID of the message to redact." + }, + "accepted_as": "path", + "required": true, + "deprecated": false, + "default": null, + "documentation_urls": [] + } + ], + "documentation_urls": [], + "secrets": [ + { + "arcade_key": "PYLON_SECRET_TOKEN", + "parameter_name": "Authorization", + "accepted_as": "header", + "formatted_value": "Bearer {authorization}", + "description": "", + "is_auth_token": false + } + ], + "request_body_spec": null, + "use_request_body_schema_mode": false, + "validate_request_body_schema": false + } +} diff --git a/toolkits/pylon_api/pylon_api/wrapper_tools/RetrieveTrainingDataConfiguration.json b/toolkits/pylon_api/pylon_api/wrapper_tools/RetrieveTrainingDataConfiguration.json new file mode 100644 index 00000000..915ea42d --- /dev/null +++ b/toolkits/pylon_api/pylon_api/wrapper_tools/RetrieveTrainingDataConfiguration.json @@ -0,0 +1,104 @@ +{ + "name": "RetrieveTrainingDataConfiguration", + "fully_qualified_name": "PylonApi.RetrieveTrainingDataConfiguration@0.1.0", + "description": "Retrieve a training data configuration by ID.\n\nThis tool retrieves the details of a specific training data configuration using its unique ID. It should be called when you need to access the configuration settings or specifications for a particular training dataset.", + "toolkit": { + "name": "PylonApi", + "description": null, + "version": "0.1.0" + }, + "input": { + "parameters": [ + { + "name": "training_data_id", + "required": true, + "description": "The unique ID of the training data to retrieve its configuration.", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The ID of the training data." + }, + "inferrable": true, + "http_endpoint_parameter_name": "id" + } + ] + }, + "output": { + "description": "Response from the API endpoint 'GetTrainingData'.", + "available_modes": [ + "value", + "error", + "null" + ], + "value_schema": { + "val_type": "json", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": null + } + }, + "requirements": { + "authorization": null, + "secrets": [ + { + "key": "PYLON_SECRET_TOKEN" + } + ], + "metadata": null + }, + "deprecation_message": null, + "metadata": { + "object_type": "api_wrapper_tool", + "version": "1.1.0", + "description": "Tools that enable LLMs to interact directly with the pylon API." + }, + "http_endpoint": { + "metadata": { + "object_type": "http_endpoint", + "version": "1.2.0", + "description": "" + }, + "url": "https://api.usepylon.com/training-data/{id}", + "http_method": "GET", + "headers": {}, + "parameters": [ + { + "name": "id", + "tool_parameter_name": "training_data_id", + "description": "The ID of the training data.", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The ID of the training data." + }, + "accepted_as": "path", + "required": true, + "deprecated": false, + "default": null, + "documentation_urls": [] + } + ], + "documentation_urls": [], + "secrets": [ + { + "arcade_key": "PYLON_SECRET_TOKEN", + "parameter_name": "Authorization", + "accepted_as": "header", + "formatted_value": "Bearer {authorization}", + "description": "", + "is_auth_token": false + } + ], + "request_body_spec": null, + "use_request_body_schema_mode": false, + "validate_request_body_schema": false + } +} diff --git a/toolkits/pylon_api/pylon_api/wrapper_tools/SearchAccounts.json b/toolkits/pylon_api/pylon_api/wrapper_tools/SearchAccounts.json new file mode 100644 index 00000000..e9773754 --- /dev/null +++ b/toolkits/pylon_api/pylon_api/wrapper_tools/SearchAccounts.json @@ -0,0 +1,268 @@ +{ + "name": "SearchAccounts", + "fully_qualified_name": "PylonApi.SearchAccounts@0.1.0", + "description": "Search and filter accounts using various criteria.\n\nThis tool allows searching and filtering of accounts with specific criteria such as domains, tags, name, external IDs, and custom fields. It supports operators like 'contains', 'equals', 'in', 'not_in', and others, enabling detailed account queries.", + "toolkit": { + "name": "PylonApi", + "description": null, + "version": "0.1.0" + }, + "input": { + "parameters": [ + { + "name": "account_search_criteria", + "required": false, + "description": "JSON object specifying pagination, filters, and limit. Includes cursor, filter details like field, operator, value(s), and limit for number of accounts.", + "value_schema": { + "val_type": "json", + "inner_val_type": null, + "enum": null, + "properties": { + "cursor": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The cursor to use for pagination." + }, + "filter": { + "val_type": "json", + "inner_val_type": null, + "enum": null, + "properties": { + "field": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The field for this filter. For allowed fields, see the documentation for\n\nthe specific endpoint you are using.\n\nFor non-compound filters (any operators other than \"and\" or \"or\"),\n\nField must be set, along with either Value or Values, depending on the operator." + }, + "operator": { + "val_type": "string", + "inner_val_type": null, + "enum": [ + "equals", + "not_equals", + "contains", + "does_not_contain", + "in", + "not_in", + "and", + "or", + "time_is_after", + "time_is_before", + "time_range", + "string_contains", + "string_does_not_contain", + "is_set", + "is_unset" + ], + "properties": null, + "inner_properties": null, + "description": "The operator for this filter.\n\n* equals FilterOperatorEquals Matches objects that are exactly equal to the value in the field.\n\n* not_equals FilterOperatorNotEquals Matches objects that are not exactly equal to the value in the field.\n\n* contains FilterOperatorContains For a multi-valued field, such as tags, this operator will match objects that contain any of the values in the field.\n\n* does_not_contain FilterOperatorDoesNotContain For a multi-valued field, such as tags, this operator will match objects that do not contain any of the values in the field.\n\n* in FilterOperatorIn Matches objects if the field is one of several possible values, as specified in the values array.\n\n* not_in FilterOperatorNotIn Matches objects if the field is none of several possible values, as specified in the values array.\n\n* and FilterOperatorAnd Matches objects only if all subfilters match.\n\n* or FilterOperatorOr Matches objects if any subfilter matches.\n\n* time_is_after FilterOperatorTimeIsAfter Matches objects if the field is after the given time.\n\n* time_is_before FilterOperatorTimeIsBefore Matches objects if the field is before the given time.\n\n* time_range FilterOperatorTimeRange Matches objects if the field is between the given times.\n\n* string_contains FilterOperatorStringContains Matches objects if the field contains the given string.\n\n* string_does_not_contain FilterOperatorStringDoesNotContain Matches objects if the field does not contain the given string.\n\n* is_set FilterOperatorIsSet FilterOperatorIsSet matches objects if the field is set.\n\n* is_unset FilterOperatorIsUnset FilterOperatorIsUnset matches objects if the field is unset." + }, + "subfilters": { + "val_type": "array", + "inner_val_type": "json", + "enum": null, + "properties": null, + "inner_properties": {}, + "description": "Sub-filters for this filter. Valid only when operator is \"and\" or \"or\".\n\nThe maximum allowed depth for a tree of filters is 3." + }, + "value": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The value for this filter. Only used for single-valued operators\n\n(\"equals\", \"not_equals\", \"contains\", \"does_not_contain\")" + }, + "values": { + "val_type": "array", + "inner_val_type": "string", + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The values for this filter. Only used for multi-valued operators (\"in\", \"not_in\")." + } + }, + "inner_properties": null, + "description": null + }, + "limit": { + "val_type": "integer", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The number of accounts to fetch. Defaults to 100. Must be greater than 0 and less than 1000." + } + }, + "inner_properties": null, + "description": "" + }, + "inferrable": true, + "http_endpoint_parameter_name": "requestBody" + } + ] + }, + "output": { + "description": "Response from the API endpoint 'SearchAccounts'.", + "available_modes": [ + "value", + "error", + "null" + ], + "value_schema": { + "val_type": "json", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": null + } + }, + "requirements": { + "authorization": null, + "secrets": [ + { + "key": "PYLON_SECRET_TOKEN" + } + ], + "metadata": null + }, + "deprecation_message": null, + "metadata": { + "object_type": "api_wrapper_tool", + "version": "1.1.0", + "description": "Tools that enable LLMs to interact directly with the pylon API." + }, + "http_endpoint": { + "metadata": { + "object_type": "http_endpoint", + "version": "1.2.0", + "description": "" + }, + "url": "https://api.usepylon.com/accounts/search", + "http_method": "POST", + "headers": {}, + "parameters": [ + { + "name": "requestBody", + "tool_parameter_name": "account_search_criteria", + "description": "", + "value_schema": { + "val_type": "json", + "inner_val_type": null, + "enum": null, + "properties": { + "cursor": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The cursor to use for pagination." + }, + "filter": { + "val_type": "json", + "inner_val_type": null, + "enum": null, + "properties": { + "field": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The field for this filter. For allowed fields, see the documentation for\n\nthe specific endpoint you are using.\n\nFor non-compound filters (any operators other than \"and\" or \"or\"),\n\nField must be set, along with either Value or Values, depending on the operator." + }, + "operator": { + "val_type": "string", + "inner_val_type": null, + "enum": [ + "equals", + "not_equals", + "contains", + "does_not_contain", + "in", + "not_in", + "and", + "or", + "time_is_after", + "time_is_before", + "time_range", + "string_contains", + "string_does_not_contain", + "is_set", + "is_unset" + ], + "properties": null, + "inner_properties": null, + "description": "The operator for this filter.\n\n* equals FilterOperatorEquals Matches objects that are exactly equal to the value in the field.\n\n* not_equals FilterOperatorNotEquals Matches objects that are not exactly equal to the value in the field.\n\n* contains FilterOperatorContains For a multi-valued field, such as tags, this operator will match objects that contain any of the values in the field.\n\n* does_not_contain FilterOperatorDoesNotContain For a multi-valued field, such as tags, this operator will match objects that do not contain any of the values in the field.\n\n* in FilterOperatorIn Matches objects if the field is one of several possible values, as specified in the values array.\n\n* not_in FilterOperatorNotIn Matches objects if the field is none of several possible values, as specified in the values array.\n\n* and FilterOperatorAnd Matches objects only if all subfilters match.\n\n* or FilterOperatorOr Matches objects if any subfilter matches.\n\n* time_is_after FilterOperatorTimeIsAfter Matches objects if the field is after the given time.\n\n* time_is_before FilterOperatorTimeIsBefore Matches objects if the field is before the given time.\n\n* time_range FilterOperatorTimeRange Matches objects if the field is between the given times.\n\n* string_contains FilterOperatorStringContains Matches objects if the field contains the given string.\n\n* string_does_not_contain FilterOperatorStringDoesNotContain Matches objects if the field does not contain the given string.\n\n* is_set FilterOperatorIsSet FilterOperatorIsSet matches objects if the field is set.\n\n* is_unset FilterOperatorIsUnset FilterOperatorIsUnset matches objects if the field is unset." + }, + "subfilters": { + "val_type": "array", + "inner_val_type": "json", + "enum": null, + "properties": null, + "inner_properties": {}, + "description": "Sub-filters for this filter. Valid only when operator is \"and\" or \"or\".\n\nThe maximum allowed depth for a tree of filters is 3." + }, + "value": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The value for this filter. Only used for single-valued operators\n\n(\"equals\", \"not_equals\", \"contains\", \"does_not_contain\")" + }, + "values": { + "val_type": "array", + "inner_val_type": "string", + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The values for this filter. Only used for multi-valued operators (\"in\", \"not_in\")." + } + }, + "inner_properties": null, + "description": null + }, + "limit": { + "val_type": "integer", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The number of accounts to fetch. Defaults to 100. Must be greater than 0 and less than 1000." + } + }, + "inner_properties": null, + "description": "" + }, + "accepted_as": "body", + "required": false, + "deprecated": false, + "default": null, + "documentation_urls": [] + } + ], + "documentation_urls": [], + "secrets": [ + { + "arcade_key": "PYLON_SECRET_TOKEN", + "parameter_name": "Authorization", + "accepted_as": "header", + "formatted_value": "Bearer {authorization}", + "description": "", + "is_auth_token": false + } + ], + "request_body_spec": "{\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"properties\": {\n \"cursor\": {\n \"description\": \"The cursor to use for pagination.\",\n \"type\": \"string\",\n \"x-go-name\": \"Cursor\"\n },\n \"filter\": {\n \"properties\": {\n \"field\": {\n \"description\": \"The field for this filter. For allowed fields, see the documentation for\\n\\nthe specific endpoint you are using.\\n\\nFor non-compound filters (any operators other than \\\"and\\\" or \\\"or\\\"),\\n\\nField must be set, along with either Value or Values, depending on the operator.\",\n \"type\": \"string\",\n \"x-go-name\": \"Field\"\n },\n \"operator\": {\n \"description\": \"The operator for this filter.\\n\\n* equals FilterOperatorEquals Matches objects that are exactly equal to the value in the field.\\n\\n* not_equals FilterOperatorNotEquals Matches objects that are not exactly equal to the value in the field.\\n\\n* contains FilterOperatorContains For a multi-valued field, such as tags, this operator will match objects that contain any of the values in the field.\\n\\n* does_not_contain FilterOperatorDoesNotContain For a multi-valued field, such as tags, this operator will match objects that do not contain any of the values in the field.\\n\\n* in FilterOperatorIn Matches objects if the field is one of several possible values, as specified in the values array.\\n\\n* not_in FilterOperatorNotIn Matches objects if the field is none of several possible values, as specified in the values array.\\n\\n* and FilterOperatorAnd Matches objects only if all subfilters match.\\n\\n* or FilterOperatorOr Matches objects if any subfilter matches.\\n\\n* time_is_after FilterOperatorTimeIsAfter Matches objects if the field is after the given time.\\n\\n* time_is_before FilterOperatorTimeIsBefore Matches objects if the field is before the given time.\\n\\n* time_range FilterOperatorTimeRange Matches objects if the field is between the given times.\\n\\n* string_contains FilterOperatorStringContains Matches objects if the field contains the given string.\\n\\n* string_does_not_contain FilterOperatorStringDoesNotContain Matches objects if the field does not contain the given string.\\n\\n* is_set FilterOperatorIsSet FilterOperatorIsSet matches objects if the field is set.\\n\\n* is_unset FilterOperatorIsUnset FilterOperatorIsUnset matches objects if the field is unset.\",\n \"enum\": [\n \"equals\",\n \"not_equals\",\n \"contains\",\n \"does_not_contain\",\n \"in\",\n \"not_in\",\n \"and\",\n \"or\",\n \"time_is_after\",\n \"time_is_before\",\n \"time_range\",\n \"string_contains\",\n \"string_does_not_contain\",\n \"is_set\",\n \"is_unset\"\n ],\n \"type\": \"string\",\n \"x-go-enum-desc\": \"equals FilterOperatorEquals Matches objects that are exactly equal to the value in the field.\\nnot_equals FilterOperatorNotEquals Matches objects that are not exactly equal to the value in the field.\\ncontains FilterOperatorContains For a multi-valued field, such as tags, this operator will match objects that contain any of the values in the field.\\ndoes_not_contain FilterOperatorDoesNotContain For a multi-valued field, such as tags, this operator will match objects that do not contain any of the values in the field.\\nin FilterOperatorIn Matches objects if the field is one of several possible values, as specified in the values array.\\nnot_in FilterOperatorNotIn Matches objects if the field is none of several possible values, as specified in the values array.\\nand FilterOperatorAnd Matches objects only if all subfilters match.\\nor FilterOperatorOr Matches objects if any subfilter matches.\\ntime_is_after FilterOperatorTimeIsAfter Matches objects if the field is after the given time.\\ntime_is_before FilterOperatorTimeIsBefore Matches objects if the field is before the given time.\\ntime_range FilterOperatorTimeRange Matches objects if the field is between the given times.\\nstring_contains FilterOperatorStringContains Matches objects if the field contains the given string.\\nstring_does_not_contain FilterOperatorStringDoesNotContain Matches objects if the field does not contain the given string.\\nis_set FilterOperatorIsSet FilterOperatorIsSet matches objects if the field is set.\\nis_unset FilterOperatorIsUnset FilterOperatorIsUnset matches objects if the field is unset.\",\n \"x-go-name\": \"Operator\"\n },\n \"subfilters\": {\n \"description\": \"Sub-filters for this filter. Valid only when operator is \\\"and\\\" or \\\"or\\\".\\n\\nThe maximum allowed depth for a tree of filters is 3.\",\n \"items\": {\n \"$ref\": \"#/components/schemas/Filter\",\n \"has_circular_reference\": true\n },\n \"type\": \"array\",\n \"x-go-name\": \"Subfilters\"\n },\n \"value\": {\n \"description\": \"The value for this filter. Only used for single-valued operators\\n\\n(\\\"equals\\\", \\\"not_equals\\\", \\\"contains\\\", \\\"does_not_contain\\\")\",\n \"type\": \"string\",\n \"x-go-name\": \"Value\"\n },\n \"values\": {\n \"description\": \"The values for this filter. Only used for multi-valued operators (\\\"in\\\", \\\"not_in\\\").\",\n \"items\": {\n \"type\": \"string\"\n },\n \"type\": \"array\",\n \"x-go-name\": \"Values\"\n }\n },\n \"required\": [\n \"field\",\n \"operator\"\n ],\n \"type\": \"object\",\n \"x-go-package\": \"pylon/api/apiserver/apitypes\"\n },\n \"limit\": {\n \"description\": \"The number of accounts to fetch. Defaults to 100. Must be greater than 0 and less than 1000.\",\n \"format\": \"int64\",\n \"type\": \"integer\",\n \"x-go-name\": \"Limit\"\n }\n },\n \"required\": [\n \"filter\"\n ],\n \"type\": \"object\",\n \"x-go-package\": \"pylon/api/apiserver/endpoints\"\n }\n }\n },\n \"required\": false\n}", + "use_request_body_schema_mode": true, + "validate_request_body_schema": false + } +} diff --git a/toolkits/pylon_api/pylon_api/wrapper_tools/SearchContacts.json b/toolkits/pylon_api/pylon_api/wrapper_tools/SearchContacts.json new file mode 100644 index 00000000..2a9aa8e2 --- /dev/null +++ b/toolkits/pylon_api/pylon_api/wrapper_tools/SearchContacts.json @@ -0,0 +1,268 @@ +{ + "name": "SearchContacts", + "fully_qualified_name": "PylonApi.SearchContacts@0.1.0", + "description": "Search for contacts using various filter criteria.\n\nThis tool allows you to search for contacts by applying filters on fields such as id, email, custom fields, and account_id. Use it to find specific contacts based on these criteria.", + "toolkit": { + "name": "PylonApi", + "description": null, + "version": "0.1.0" + }, + "input": { + "parameters": [ + { + "name": "contact_search_filters", + "required": false, + "description": "A JSON object specifying the search filters for contacts, including pagination, filtering fields, operator types, and limits.", + "value_schema": { + "val_type": "json", + "inner_val_type": null, + "enum": null, + "properties": { + "cursor": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The cursor to use for pagination." + }, + "filter": { + "val_type": "json", + "inner_val_type": null, + "enum": null, + "properties": { + "field": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The field for this filter. For allowed fields, see the documentation for\n\nthe specific endpoint you are using.\n\nFor non-compound filters (any operators other than \"and\" or \"or\"),\n\nField must be set, along with either Value or Values, depending on the operator." + }, + "operator": { + "val_type": "string", + "inner_val_type": null, + "enum": [ + "equals", + "not_equals", + "contains", + "does_not_contain", + "in", + "not_in", + "and", + "or", + "time_is_after", + "time_is_before", + "time_range", + "string_contains", + "string_does_not_contain", + "is_set", + "is_unset" + ], + "properties": null, + "inner_properties": null, + "description": "The operator for this filter.\n\n* equals FilterOperatorEquals Matches objects that are exactly equal to the value in the field.\n\n* not_equals FilterOperatorNotEquals Matches objects that are not exactly equal to the value in the field.\n\n* contains FilterOperatorContains For a multi-valued field, such as tags, this operator will match objects that contain any of the values in the field.\n\n* does_not_contain FilterOperatorDoesNotContain For a multi-valued field, such as tags, this operator will match objects that do not contain any of the values in the field.\n\n* in FilterOperatorIn Matches objects if the field is one of several possible values, as specified in the values array.\n\n* not_in FilterOperatorNotIn Matches objects if the field is none of several possible values, as specified in the values array.\n\n* and FilterOperatorAnd Matches objects only if all subfilters match.\n\n* or FilterOperatorOr Matches objects if any subfilter matches.\n\n* time_is_after FilterOperatorTimeIsAfter Matches objects if the field is after the given time.\n\n* time_is_before FilterOperatorTimeIsBefore Matches objects if the field is before the given time.\n\n* time_range FilterOperatorTimeRange Matches objects if the field is between the given times.\n\n* string_contains FilterOperatorStringContains Matches objects if the field contains the given string.\n\n* string_does_not_contain FilterOperatorStringDoesNotContain Matches objects if the field does not contain the given string.\n\n* is_set FilterOperatorIsSet FilterOperatorIsSet matches objects if the field is set.\n\n* is_unset FilterOperatorIsUnset FilterOperatorIsUnset matches objects if the field is unset." + }, + "subfilters": { + "val_type": "array", + "inner_val_type": "json", + "enum": null, + "properties": null, + "inner_properties": {}, + "description": "Sub-filters for this filter. Valid only when operator is \"and\" or \"or\".\n\nThe maximum allowed depth for a tree of filters is 3." + }, + "value": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The value for this filter. Only used for single-valued operators\n\n(\"equals\", \"not_equals\", \"contains\", \"does_not_contain\")" + }, + "values": { + "val_type": "array", + "inner_val_type": "string", + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The values for this filter. Only used for multi-valued operators (\"in\", \"not_in\")." + } + }, + "inner_properties": null, + "description": null + }, + "limit": { + "val_type": "integer", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The number of contacts to fetch. Defaults to 100. Must be greater than 0 and less than 1000." + } + }, + "inner_properties": null, + "description": "" + }, + "inferrable": true, + "http_endpoint_parameter_name": "requestBody" + } + ] + }, + "output": { + "description": "Response from the API endpoint 'SearchContacts'.", + "available_modes": [ + "value", + "error", + "null" + ], + "value_schema": { + "val_type": "json", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": null + } + }, + "requirements": { + "authorization": null, + "secrets": [ + { + "key": "PYLON_SECRET_TOKEN" + } + ], + "metadata": null + }, + "deprecation_message": null, + "metadata": { + "object_type": "api_wrapper_tool", + "version": "1.1.0", + "description": "Tools that enable LLMs to interact directly with the pylon API." + }, + "http_endpoint": { + "metadata": { + "object_type": "http_endpoint", + "version": "1.2.0", + "description": "" + }, + "url": "https://api.usepylon.com/contacts/search", + "http_method": "POST", + "headers": {}, + "parameters": [ + { + "name": "requestBody", + "tool_parameter_name": "contact_search_filters", + "description": "", + "value_schema": { + "val_type": "json", + "inner_val_type": null, + "enum": null, + "properties": { + "cursor": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The cursor to use for pagination." + }, + "filter": { + "val_type": "json", + "inner_val_type": null, + "enum": null, + "properties": { + "field": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The field for this filter. For allowed fields, see the documentation for\n\nthe specific endpoint you are using.\n\nFor non-compound filters (any operators other than \"and\" or \"or\"),\n\nField must be set, along with either Value or Values, depending on the operator." + }, + "operator": { + "val_type": "string", + "inner_val_type": null, + "enum": [ + "equals", + "not_equals", + "contains", + "does_not_contain", + "in", + "not_in", + "and", + "or", + "time_is_after", + "time_is_before", + "time_range", + "string_contains", + "string_does_not_contain", + "is_set", + "is_unset" + ], + "properties": null, + "inner_properties": null, + "description": "The operator for this filter.\n\n* equals FilterOperatorEquals Matches objects that are exactly equal to the value in the field.\n\n* not_equals FilterOperatorNotEquals Matches objects that are not exactly equal to the value in the field.\n\n* contains FilterOperatorContains For a multi-valued field, such as tags, this operator will match objects that contain any of the values in the field.\n\n* does_not_contain FilterOperatorDoesNotContain For a multi-valued field, such as tags, this operator will match objects that do not contain any of the values in the field.\n\n* in FilterOperatorIn Matches objects if the field is one of several possible values, as specified in the values array.\n\n* not_in FilterOperatorNotIn Matches objects if the field is none of several possible values, as specified in the values array.\n\n* and FilterOperatorAnd Matches objects only if all subfilters match.\n\n* or FilterOperatorOr Matches objects if any subfilter matches.\n\n* time_is_after FilterOperatorTimeIsAfter Matches objects if the field is after the given time.\n\n* time_is_before FilterOperatorTimeIsBefore Matches objects if the field is before the given time.\n\n* time_range FilterOperatorTimeRange Matches objects if the field is between the given times.\n\n* string_contains FilterOperatorStringContains Matches objects if the field contains the given string.\n\n* string_does_not_contain FilterOperatorStringDoesNotContain Matches objects if the field does not contain the given string.\n\n* is_set FilterOperatorIsSet FilterOperatorIsSet matches objects if the field is set.\n\n* is_unset FilterOperatorIsUnset FilterOperatorIsUnset matches objects if the field is unset." + }, + "subfilters": { + "val_type": "array", + "inner_val_type": "json", + "enum": null, + "properties": null, + "inner_properties": {}, + "description": "Sub-filters for this filter. Valid only when operator is \"and\" or \"or\".\n\nThe maximum allowed depth for a tree of filters is 3." + }, + "value": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The value for this filter. Only used for single-valued operators\n\n(\"equals\", \"not_equals\", \"contains\", \"does_not_contain\")" + }, + "values": { + "val_type": "array", + "inner_val_type": "string", + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The values for this filter. Only used for multi-valued operators (\"in\", \"not_in\")." + } + }, + "inner_properties": null, + "description": null + }, + "limit": { + "val_type": "integer", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The number of contacts to fetch. Defaults to 100. Must be greater than 0 and less than 1000." + } + }, + "inner_properties": null, + "description": "" + }, + "accepted_as": "body", + "required": false, + "deprecated": false, + "default": null, + "documentation_urls": [] + } + ], + "documentation_urls": [], + "secrets": [ + { + "arcade_key": "PYLON_SECRET_TOKEN", + "parameter_name": "Authorization", + "accepted_as": "header", + "formatted_value": "Bearer {authorization}", + "description": "", + "is_auth_token": false + } + ], + "request_body_spec": "{\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"properties\": {\n \"cursor\": {\n \"description\": \"The cursor to use for pagination.\",\n \"type\": \"string\",\n \"x-go-name\": \"Cursor\"\n },\n \"filter\": {\n \"properties\": {\n \"field\": {\n \"description\": \"The field for this filter. For allowed fields, see the documentation for\\n\\nthe specific endpoint you are using.\\n\\nFor non-compound filters (any operators other than \\\"and\\\" or \\\"or\\\"),\\n\\nField must be set, along with either Value or Values, depending on the operator.\",\n \"type\": \"string\",\n \"x-go-name\": \"Field\"\n },\n \"operator\": {\n \"description\": \"The operator for this filter.\\n\\n* equals FilterOperatorEquals Matches objects that are exactly equal to the value in the field.\\n\\n* not_equals FilterOperatorNotEquals Matches objects that are not exactly equal to the value in the field.\\n\\n* contains FilterOperatorContains For a multi-valued field, such as tags, this operator will match objects that contain any of the values in the field.\\n\\n* does_not_contain FilterOperatorDoesNotContain For a multi-valued field, such as tags, this operator will match objects that do not contain any of the values in the field.\\n\\n* in FilterOperatorIn Matches objects if the field is one of several possible values, as specified in the values array.\\n\\n* not_in FilterOperatorNotIn Matches objects if the field is none of several possible values, as specified in the values array.\\n\\n* and FilterOperatorAnd Matches objects only if all subfilters match.\\n\\n* or FilterOperatorOr Matches objects if any subfilter matches.\\n\\n* time_is_after FilterOperatorTimeIsAfter Matches objects if the field is after the given time.\\n\\n* time_is_before FilterOperatorTimeIsBefore Matches objects if the field is before the given time.\\n\\n* time_range FilterOperatorTimeRange Matches objects if the field is between the given times.\\n\\n* string_contains FilterOperatorStringContains Matches objects if the field contains the given string.\\n\\n* string_does_not_contain FilterOperatorStringDoesNotContain Matches objects if the field does not contain the given string.\\n\\n* is_set FilterOperatorIsSet FilterOperatorIsSet matches objects if the field is set.\\n\\n* is_unset FilterOperatorIsUnset FilterOperatorIsUnset matches objects if the field is unset.\",\n \"enum\": [\n \"equals\",\n \"not_equals\",\n \"contains\",\n \"does_not_contain\",\n \"in\",\n \"not_in\",\n \"and\",\n \"or\",\n \"time_is_after\",\n \"time_is_before\",\n \"time_range\",\n \"string_contains\",\n \"string_does_not_contain\",\n \"is_set\",\n \"is_unset\"\n ],\n \"type\": \"string\",\n \"x-go-enum-desc\": \"equals FilterOperatorEquals Matches objects that are exactly equal to the value in the field.\\nnot_equals FilterOperatorNotEquals Matches objects that are not exactly equal to the value in the field.\\ncontains FilterOperatorContains For a multi-valued field, such as tags, this operator will match objects that contain any of the values in the field.\\ndoes_not_contain FilterOperatorDoesNotContain For a multi-valued field, such as tags, this operator will match objects that do not contain any of the values in the field.\\nin FilterOperatorIn Matches objects if the field is one of several possible values, as specified in the values array.\\nnot_in FilterOperatorNotIn Matches objects if the field is none of several possible values, as specified in the values array.\\nand FilterOperatorAnd Matches objects only if all subfilters match.\\nor FilterOperatorOr Matches objects if any subfilter matches.\\ntime_is_after FilterOperatorTimeIsAfter Matches objects if the field is after the given time.\\ntime_is_before FilterOperatorTimeIsBefore Matches objects if the field is before the given time.\\ntime_range FilterOperatorTimeRange Matches objects if the field is between the given times.\\nstring_contains FilterOperatorStringContains Matches objects if the field contains the given string.\\nstring_does_not_contain FilterOperatorStringDoesNotContain Matches objects if the field does not contain the given string.\\nis_set FilterOperatorIsSet FilterOperatorIsSet matches objects if the field is set.\\nis_unset FilterOperatorIsUnset FilterOperatorIsUnset matches objects if the field is unset.\",\n \"x-go-name\": \"Operator\"\n },\n \"subfilters\": {\n \"description\": \"Sub-filters for this filter. Valid only when operator is \\\"and\\\" or \\\"or\\\".\\n\\nThe maximum allowed depth for a tree of filters is 3.\",\n \"items\": {\n \"$ref\": \"#/components/schemas/Filter\",\n \"has_circular_reference\": true\n },\n \"type\": \"array\",\n \"x-go-name\": \"Subfilters\"\n },\n \"value\": {\n \"description\": \"The value for this filter. Only used for single-valued operators\\n\\n(\\\"equals\\\", \\\"not_equals\\\", \\\"contains\\\", \\\"does_not_contain\\\")\",\n \"type\": \"string\",\n \"x-go-name\": \"Value\"\n },\n \"values\": {\n \"description\": \"The values for this filter. Only used for multi-valued operators (\\\"in\\\", \\\"not_in\\\").\",\n \"items\": {\n \"type\": \"string\"\n },\n \"type\": \"array\",\n \"x-go-name\": \"Values\"\n }\n },\n \"required\": [\n \"field\",\n \"operator\"\n ],\n \"type\": \"object\",\n \"x-go-package\": \"pylon/api/apiserver/apitypes\"\n },\n \"limit\": {\n \"description\": \"The number of contacts to fetch. Defaults to 100. Must be greater than 0 and less than 1000.\",\n \"format\": \"int64\",\n \"type\": \"integer\",\n \"x-go-name\": \"Limit\"\n }\n },\n \"required\": [\n \"filter\"\n ],\n \"type\": \"object\",\n \"x-go-package\": \"pylon/api/apiserver/endpoints\"\n }\n }\n },\n \"required\": false\n}", + "use_request_body_schema_mode": true, + "validate_request_body_schema": false + } +} diff --git a/toolkits/pylon_api/pylon_api/wrapper_tools/SearchIssuesByFilters.json b/toolkits/pylon_api/pylon_api/wrapper_tools/SearchIssuesByFilters.json new file mode 100644 index 00000000..ab0bfc0f --- /dev/null +++ b/toolkits/pylon_api/pylon_api/wrapper_tools/SearchIssuesByFilters.json @@ -0,0 +1,268 @@ +{ + "name": "SearchIssuesByFilters", + "fully_qualified_name": "PylonApi.SearchIssuesByFilters@0.1.0", + "description": "Search for issues using various filters and criteria.\n\nUse this tool to search for issues by applying filters such as creation date, account ID, requester ID, status, tags, title, and more. Suitable for retrieving specific issues according to predefined criteria and operators.", + "toolkit": { + "name": "PylonApi", + "description": null, + "version": "0.1.0" + }, + "input": { + "parameters": [ + { + "name": "filter_parameters", + "required": false, + "description": "JSON object containing filter criteria such as field, operator, and value to search issues. Includes pagination cursor and limit.", + "value_schema": { + "val_type": "json", + "inner_val_type": null, + "enum": null, + "properties": { + "cursor": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The cursor to use for pagination." + }, + "filter": { + "val_type": "json", + "inner_val_type": null, + "enum": null, + "properties": { + "field": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The field for this filter. For allowed fields, see the documentation for\n\nthe specific endpoint you are using.\n\nFor non-compound filters (any operators other than \"and\" or \"or\"),\n\nField must be set, along with either Value or Values, depending on the operator." + }, + "operator": { + "val_type": "string", + "inner_val_type": null, + "enum": [ + "equals", + "not_equals", + "contains", + "does_not_contain", + "in", + "not_in", + "and", + "or", + "time_is_after", + "time_is_before", + "time_range", + "string_contains", + "string_does_not_contain", + "is_set", + "is_unset" + ], + "properties": null, + "inner_properties": null, + "description": "The operator for this filter.\n\n* equals FilterOperatorEquals Matches objects that are exactly equal to the value in the field.\n\n* not_equals FilterOperatorNotEquals Matches objects that are not exactly equal to the value in the field.\n\n* contains FilterOperatorContains For a multi-valued field, such as tags, this operator will match objects that contain any of the values in the field.\n\n* does_not_contain FilterOperatorDoesNotContain For a multi-valued field, such as tags, this operator will match objects that do not contain any of the values in the field.\n\n* in FilterOperatorIn Matches objects if the field is one of several possible values, as specified in the values array.\n\n* not_in FilterOperatorNotIn Matches objects if the field is none of several possible values, as specified in the values array.\n\n* and FilterOperatorAnd Matches objects only if all subfilters match.\n\n* or FilterOperatorOr Matches objects if any subfilter matches.\n\n* time_is_after FilterOperatorTimeIsAfter Matches objects if the field is after the given time.\n\n* time_is_before FilterOperatorTimeIsBefore Matches objects if the field is before the given time.\n\n* time_range FilterOperatorTimeRange Matches objects if the field is between the given times.\n\n* string_contains FilterOperatorStringContains Matches objects if the field contains the given string.\n\n* string_does_not_contain FilterOperatorStringDoesNotContain Matches objects if the field does not contain the given string.\n\n* is_set FilterOperatorIsSet FilterOperatorIsSet matches objects if the field is set.\n\n* is_unset FilterOperatorIsUnset FilterOperatorIsUnset matches objects if the field is unset." + }, + "subfilters": { + "val_type": "array", + "inner_val_type": "json", + "enum": null, + "properties": null, + "inner_properties": {}, + "description": "Sub-filters for this filter. Valid only when operator is \"and\" or \"or\".\n\nThe maximum allowed depth for a tree of filters is 3." + }, + "value": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The value for this filter. Only used for single-valued operators\n\n(\"equals\", \"not_equals\", \"contains\", \"does_not_contain\")" + }, + "values": { + "val_type": "array", + "inner_val_type": "string", + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The values for this filter. Only used for multi-valued operators (\"in\", \"not_in\")." + } + }, + "inner_properties": null, + "description": null + }, + "limit": { + "val_type": "integer", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The number of issues to fetch. Defaults to 100. Must be greater than 0 and less than 1000." + } + }, + "inner_properties": null, + "description": "" + }, + "inferrable": true, + "http_endpoint_parameter_name": "requestBody" + } + ] + }, + "output": { + "description": "Response from the API endpoint 'SearchIssues'.", + "available_modes": [ + "value", + "error", + "null" + ], + "value_schema": { + "val_type": "json", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": null + } + }, + "requirements": { + "authorization": null, + "secrets": [ + { + "key": "PYLON_SECRET_TOKEN" + } + ], + "metadata": null + }, + "deprecation_message": null, + "metadata": { + "object_type": "api_wrapper_tool", + "version": "1.1.0", + "description": "Tools that enable LLMs to interact directly with the pylon API." + }, + "http_endpoint": { + "metadata": { + "object_type": "http_endpoint", + "version": "1.2.0", + "description": "" + }, + "url": "https://api.usepylon.com/issues/search", + "http_method": "POST", + "headers": {}, + "parameters": [ + { + "name": "requestBody", + "tool_parameter_name": "filter_parameters", + "description": "", + "value_schema": { + "val_type": "json", + "inner_val_type": null, + "enum": null, + "properties": { + "cursor": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The cursor to use for pagination." + }, + "filter": { + "val_type": "json", + "inner_val_type": null, + "enum": null, + "properties": { + "field": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The field for this filter. For allowed fields, see the documentation for\n\nthe specific endpoint you are using.\n\nFor non-compound filters (any operators other than \"and\" or \"or\"),\n\nField must be set, along with either Value or Values, depending on the operator." + }, + "operator": { + "val_type": "string", + "inner_val_type": null, + "enum": [ + "equals", + "not_equals", + "contains", + "does_not_contain", + "in", + "not_in", + "and", + "or", + "time_is_after", + "time_is_before", + "time_range", + "string_contains", + "string_does_not_contain", + "is_set", + "is_unset" + ], + "properties": null, + "inner_properties": null, + "description": "The operator for this filter.\n\n* equals FilterOperatorEquals Matches objects that are exactly equal to the value in the field.\n\n* not_equals FilterOperatorNotEquals Matches objects that are not exactly equal to the value in the field.\n\n* contains FilterOperatorContains For a multi-valued field, such as tags, this operator will match objects that contain any of the values in the field.\n\n* does_not_contain FilterOperatorDoesNotContain For a multi-valued field, such as tags, this operator will match objects that do not contain any of the values in the field.\n\n* in FilterOperatorIn Matches objects if the field is one of several possible values, as specified in the values array.\n\n* not_in FilterOperatorNotIn Matches objects if the field is none of several possible values, as specified in the values array.\n\n* and FilterOperatorAnd Matches objects only if all subfilters match.\n\n* or FilterOperatorOr Matches objects if any subfilter matches.\n\n* time_is_after FilterOperatorTimeIsAfter Matches objects if the field is after the given time.\n\n* time_is_before FilterOperatorTimeIsBefore Matches objects if the field is before the given time.\n\n* time_range FilterOperatorTimeRange Matches objects if the field is between the given times.\n\n* string_contains FilterOperatorStringContains Matches objects if the field contains the given string.\n\n* string_does_not_contain FilterOperatorStringDoesNotContain Matches objects if the field does not contain the given string.\n\n* is_set FilterOperatorIsSet FilterOperatorIsSet matches objects if the field is set.\n\n* is_unset FilterOperatorIsUnset FilterOperatorIsUnset matches objects if the field is unset." + }, + "subfilters": { + "val_type": "array", + "inner_val_type": "json", + "enum": null, + "properties": null, + "inner_properties": {}, + "description": "Sub-filters for this filter. Valid only when operator is \"and\" or \"or\".\n\nThe maximum allowed depth for a tree of filters is 3." + }, + "value": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The value for this filter. Only used for single-valued operators\n\n(\"equals\", \"not_equals\", \"contains\", \"does_not_contain\")" + }, + "values": { + "val_type": "array", + "inner_val_type": "string", + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The values for this filter. Only used for multi-valued operators (\"in\", \"not_in\")." + } + }, + "inner_properties": null, + "description": null + }, + "limit": { + "val_type": "integer", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The number of issues to fetch. Defaults to 100. Must be greater than 0 and less than 1000." + } + }, + "inner_properties": null, + "description": "" + }, + "accepted_as": "body", + "required": false, + "deprecated": false, + "default": null, + "documentation_urls": [] + } + ], + "documentation_urls": [], + "secrets": [ + { + "arcade_key": "PYLON_SECRET_TOKEN", + "parameter_name": "Authorization", + "accepted_as": "header", + "formatted_value": "Bearer {authorization}", + "description": "", + "is_auth_token": false + } + ], + "request_body_spec": "{\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"properties\": {\n \"cursor\": {\n \"description\": \"The cursor to use for pagination.\",\n \"type\": \"string\",\n \"x-go-name\": \"Cursor\"\n },\n \"filter\": {\n \"properties\": {\n \"field\": {\n \"description\": \"The field for this filter. For allowed fields, see the documentation for\\n\\nthe specific endpoint you are using.\\n\\nFor non-compound filters (any operators other than \\\"and\\\" or \\\"or\\\"),\\n\\nField must be set, along with either Value or Values, depending on the operator.\",\n \"type\": \"string\",\n \"x-go-name\": \"Field\"\n },\n \"operator\": {\n \"description\": \"The operator for this filter.\\n\\n* equals FilterOperatorEquals Matches objects that are exactly equal to the value in the field.\\n\\n* not_equals FilterOperatorNotEquals Matches objects that are not exactly equal to the value in the field.\\n\\n* contains FilterOperatorContains For a multi-valued field, such as tags, this operator will match objects that contain any of the values in the field.\\n\\n* does_not_contain FilterOperatorDoesNotContain For a multi-valued field, such as tags, this operator will match objects that do not contain any of the values in the field.\\n\\n* in FilterOperatorIn Matches objects if the field is one of several possible values, as specified in the values array.\\n\\n* not_in FilterOperatorNotIn Matches objects if the field is none of several possible values, as specified in the values array.\\n\\n* and FilterOperatorAnd Matches objects only if all subfilters match.\\n\\n* or FilterOperatorOr Matches objects if any subfilter matches.\\n\\n* time_is_after FilterOperatorTimeIsAfter Matches objects if the field is after the given time.\\n\\n* time_is_before FilterOperatorTimeIsBefore Matches objects if the field is before the given time.\\n\\n* time_range FilterOperatorTimeRange Matches objects if the field is between the given times.\\n\\n* string_contains FilterOperatorStringContains Matches objects if the field contains the given string.\\n\\n* string_does_not_contain FilterOperatorStringDoesNotContain Matches objects if the field does not contain the given string.\\n\\n* is_set FilterOperatorIsSet FilterOperatorIsSet matches objects if the field is set.\\n\\n* is_unset FilterOperatorIsUnset FilterOperatorIsUnset matches objects if the field is unset.\",\n \"enum\": [\n \"equals\",\n \"not_equals\",\n \"contains\",\n \"does_not_contain\",\n \"in\",\n \"not_in\",\n \"and\",\n \"or\",\n \"time_is_after\",\n \"time_is_before\",\n \"time_range\",\n \"string_contains\",\n \"string_does_not_contain\",\n \"is_set\",\n \"is_unset\"\n ],\n \"type\": \"string\",\n \"x-go-enum-desc\": \"equals FilterOperatorEquals Matches objects that are exactly equal to the value in the field.\\nnot_equals FilterOperatorNotEquals Matches objects that are not exactly equal to the value in the field.\\ncontains FilterOperatorContains For a multi-valued field, such as tags, this operator will match objects that contain any of the values in the field.\\ndoes_not_contain FilterOperatorDoesNotContain For a multi-valued field, such as tags, this operator will match objects that do not contain any of the values in the field.\\nin FilterOperatorIn Matches objects if the field is one of several possible values, as specified in the values array.\\nnot_in FilterOperatorNotIn Matches objects if the field is none of several possible values, as specified in the values array.\\nand FilterOperatorAnd Matches objects only if all subfilters match.\\nor FilterOperatorOr Matches objects if any subfilter matches.\\ntime_is_after FilterOperatorTimeIsAfter Matches objects if the field is after the given time.\\ntime_is_before FilterOperatorTimeIsBefore Matches objects if the field is before the given time.\\ntime_range FilterOperatorTimeRange Matches objects if the field is between the given times.\\nstring_contains FilterOperatorStringContains Matches objects if the field contains the given string.\\nstring_does_not_contain FilterOperatorStringDoesNotContain Matches objects if the field does not contain the given string.\\nis_set FilterOperatorIsSet FilterOperatorIsSet matches objects if the field is set.\\nis_unset FilterOperatorIsUnset FilterOperatorIsUnset matches objects if the field is unset.\",\n \"x-go-name\": \"Operator\"\n },\n \"subfilters\": {\n \"description\": \"Sub-filters for this filter. Valid only when operator is \\\"and\\\" or \\\"or\\\".\\n\\nThe maximum allowed depth for a tree of filters is 3.\",\n \"items\": {\n \"$ref\": \"#/components/schemas/Filter\",\n \"has_circular_reference\": true\n },\n \"type\": \"array\",\n \"x-go-name\": \"Subfilters\"\n },\n \"value\": {\n \"description\": \"The value for this filter. Only used for single-valued operators\\n\\n(\\\"equals\\\", \\\"not_equals\\\", \\\"contains\\\", \\\"does_not_contain\\\")\",\n \"type\": \"string\",\n \"x-go-name\": \"Value\"\n },\n \"values\": {\n \"description\": \"The values for this filter. Only used for multi-valued operators (\\\"in\\\", \\\"not_in\\\").\",\n \"items\": {\n \"type\": \"string\"\n },\n \"type\": \"array\",\n \"x-go-name\": \"Values\"\n }\n },\n \"required\": [\n \"field\",\n \"operator\"\n ],\n \"type\": \"object\",\n \"x-go-package\": \"pylon/api/apiserver/apitypes\"\n },\n \"limit\": {\n \"description\": \"The number of issues to fetch. Defaults to 100. Must be greater than 0 and less than 1000.\",\n \"format\": \"int64\",\n \"type\": \"integer\",\n \"x-go-name\": \"Limit\"\n }\n },\n \"required\": [\n \"filter\"\n ],\n \"type\": \"object\",\n \"x-go-package\": \"pylon/api/apiserver/endpoints\"\n }\n }\n },\n \"required\": false\n}", + "use_request_body_schema_mode": true, + "validate_request_body_schema": false + } +} diff --git a/toolkits/pylon_api/pylon_api/wrapper_tools/SearchUsersByEmail.json b/toolkits/pylon_api/pylon_api/wrapper_tools/SearchUsersByEmail.json new file mode 100644 index 00000000..398d5eca --- /dev/null +++ b/toolkits/pylon_api/pylon_api/wrapper_tools/SearchUsersByEmail.json @@ -0,0 +1,268 @@ +{ + "name": "SearchUsersByEmail", + "fully_qualified_name": "PylonApi.SearchUsersByEmail@0.1.0", + "description": "Search for users by email with filter options.\n\nUse this tool to find users by filtering their email with options such as 'equals', 'in', or 'not_in'. It should be called when there's a need to retrieve user information based on specific email criteria.", + "toolkit": { + "name": "PylonApi", + "description": null, + "version": "0.1.0" + }, + "input": { + "parameters": [ + { + "name": "user_search_filter", + "required": false, + "description": "A JSON object defining the filter criteria for searching users by email. It includes fields for pagination, filtering, and limiting results.", + "value_schema": { + "val_type": "json", + "inner_val_type": null, + "enum": null, + "properties": { + "cursor": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The cursor to use for pagination." + }, + "filter": { + "val_type": "json", + "inner_val_type": null, + "enum": null, + "properties": { + "field": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The field for this filter. For allowed fields, see the documentation for\n\nthe specific endpoint you are using.\n\nFor non-compound filters (any operators other than \"and\" or \"or\"),\n\nField must be set, along with either Value or Values, depending on the operator." + }, + "operator": { + "val_type": "string", + "inner_val_type": null, + "enum": [ + "equals", + "not_equals", + "contains", + "does_not_contain", + "in", + "not_in", + "and", + "or", + "time_is_after", + "time_is_before", + "time_range", + "string_contains", + "string_does_not_contain", + "is_set", + "is_unset" + ], + "properties": null, + "inner_properties": null, + "description": "The operator for this filter.\n\n* equals FilterOperatorEquals Matches objects that are exactly equal to the value in the field.\n\n* not_equals FilterOperatorNotEquals Matches objects that are not exactly equal to the value in the field.\n\n* contains FilterOperatorContains For a multi-valued field, such as tags, this operator will match objects that contain any of the values in the field.\n\n* does_not_contain FilterOperatorDoesNotContain For a multi-valued field, such as tags, this operator will match objects that do not contain any of the values in the field.\n\n* in FilterOperatorIn Matches objects if the field is one of several possible values, as specified in the values array.\n\n* not_in FilterOperatorNotIn Matches objects if the field is none of several possible values, as specified in the values array.\n\n* and FilterOperatorAnd Matches objects only if all subfilters match.\n\n* or FilterOperatorOr Matches objects if any subfilter matches.\n\n* time_is_after FilterOperatorTimeIsAfter Matches objects if the field is after the given time.\n\n* time_is_before FilterOperatorTimeIsBefore Matches objects if the field is before the given time.\n\n* time_range FilterOperatorTimeRange Matches objects if the field is between the given times.\n\n* string_contains FilterOperatorStringContains Matches objects if the field contains the given string.\n\n* string_does_not_contain FilterOperatorStringDoesNotContain Matches objects if the field does not contain the given string.\n\n* is_set FilterOperatorIsSet FilterOperatorIsSet matches objects if the field is set.\n\n* is_unset FilterOperatorIsUnset FilterOperatorIsUnset matches objects if the field is unset." + }, + "subfilters": { + "val_type": "array", + "inner_val_type": "json", + "enum": null, + "properties": null, + "inner_properties": {}, + "description": "Sub-filters for this filter. Valid only when operator is \"and\" or \"or\".\n\nThe maximum allowed depth for a tree of filters is 3." + }, + "value": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The value for this filter. Only used for single-valued operators\n\n(\"equals\", \"not_equals\", \"contains\", \"does_not_contain\")" + }, + "values": { + "val_type": "array", + "inner_val_type": "string", + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The values for this filter. Only used for multi-valued operators (\"in\", \"not_in\")." + } + }, + "inner_properties": null, + "description": null + }, + "limit": { + "val_type": "integer", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The number of users to fetch. Defaults to 100. Must be greater than 0 and less than 1000." + } + }, + "inner_properties": null, + "description": "" + }, + "inferrable": true, + "http_endpoint_parameter_name": "requestBody" + } + ] + }, + "output": { + "description": "Response from the API endpoint 'SearchUsers'.", + "available_modes": [ + "value", + "error", + "null" + ], + "value_schema": { + "val_type": "json", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": null + } + }, + "requirements": { + "authorization": null, + "secrets": [ + { + "key": "PYLON_SECRET_TOKEN" + } + ], + "metadata": null + }, + "deprecation_message": null, + "metadata": { + "object_type": "api_wrapper_tool", + "version": "1.1.0", + "description": "Tools that enable LLMs to interact directly with the pylon API." + }, + "http_endpoint": { + "metadata": { + "object_type": "http_endpoint", + "version": "1.2.0", + "description": "" + }, + "url": "https://api.usepylon.com/users/search", + "http_method": "POST", + "headers": {}, + "parameters": [ + { + "name": "requestBody", + "tool_parameter_name": "user_search_filter", + "description": "", + "value_schema": { + "val_type": "json", + "inner_val_type": null, + "enum": null, + "properties": { + "cursor": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The cursor to use for pagination." + }, + "filter": { + "val_type": "json", + "inner_val_type": null, + "enum": null, + "properties": { + "field": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The field for this filter. For allowed fields, see the documentation for\n\nthe specific endpoint you are using.\n\nFor non-compound filters (any operators other than \"and\" or \"or\"),\n\nField must be set, along with either Value or Values, depending on the operator." + }, + "operator": { + "val_type": "string", + "inner_val_type": null, + "enum": [ + "equals", + "not_equals", + "contains", + "does_not_contain", + "in", + "not_in", + "and", + "or", + "time_is_after", + "time_is_before", + "time_range", + "string_contains", + "string_does_not_contain", + "is_set", + "is_unset" + ], + "properties": null, + "inner_properties": null, + "description": "The operator for this filter.\n\n* equals FilterOperatorEquals Matches objects that are exactly equal to the value in the field.\n\n* not_equals FilterOperatorNotEquals Matches objects that are not exactly equal to the value in the field.\n\n* contains FilterOperatorContains For a multi-valued field, such as tags, this operator will match objects that contain any of the values in the field.\n\n* does_not_contain FilterOperatorDoesNotContain For a multi-valued field, such as tags, this operator will match objects that do not contain any of the values in the field.\n\n* in FilterOperatorIn Matches objects if the field is one of several possible values, as specified in the values array.\n\n* not_in FilterOperatorNotIn Matches objects if the field is none of several possible values, as specified in the values array.\n\n* and FilterOperatorAnd Matches objects only if all subfilters match.\n\n* or FilterOperatorOr Matches objects if any subfilter matches.\n\n* time_is_after FilterOperatorTimeIsAfter Matches objects if the field is after the given time.\n\n* time_is_before FilterOperatorTimeIsBefore Matches objects if the field is before the given time.\n\n* time_range FilterOperatorTimeRange Matches objects if the field is between the given times.\n\n* string_contains FilterOperatorStringContains Matches objects if the field contains the given string.\n\n* string_does_not_contain FilterOperatorStringDoesNotContain Matches objects if the field does not contain the given string.\n\n* is_set FilterOperatorIsSet FilterOperatorIsSet matches objects if the field is set.\n\n* is_unset FilterOperatorIsUnset FilterOperatorIsUnset matches objects if the field is unset." + }, + "subfilters": { + "val_type": "array", + "inner_val_type": "json", + "enum": null, + "properties": null, + "inner_properties": {}, + "description": "Sub-filters for this filter. Valid only when operator is \"and\" or \"or\".\n\nThe maximum allowed depth for a tree of filters is 3." + }, + "value": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The value for this filter. Only used for single-valued operators\n\n(\"equals\", \"not_equals\", \"contains\", \"does_not_contain\")" + }, + "values": { + "val_type": "array", + "inner_val_type": "string", + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The values for this filter. Only used for multi-valued operators (\"in\", \"not_in\")." + } + }, + "inner_properties": null, + "description": null + }, + "limit": { + "val_type": "integer", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The number of users to fetch. Defaults to 100. Must be greater than 0 and less than 1000." + } + }, + "inner_properties": null, + "description": "" + }, + "accepted_as": "body", + "required": false, + "deprecated": false, + "default": null, + "documentation_urls": [] + } + ], + "documentation_urls": [], + "secrets": [ + { + "arcade_key": "PYLON_SECRET_TOKEN", + "parameter_name": "Authorization", + "accepted_as": "header", + "formatted_value": "Bearer {authorization}", + "description": "", + "is_auth_token": false + } + ], + "request_body_spec": "{\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"properties\": {\n \"cursor\": {\n \"description\": \"The cursor to use for pagination.\",\n \"type\": \"string\",\n \"x-go-name\": \"Cursor\"\n },\n \"filter\": {\n \"properties\": {\n \"field\": {\n \"description\": \"The field for this filter. For allowed fields, see the documentation for\\n\\nthe specific endpoint you are using.\\n\\nFor non-compound filters (any operators other than \\\"and\\\" or \\\"or\\\"),\\n\\nField must be set, along with either Value or Values, depending on the operator.\",\n \"type\": \"string\",\n \"x-go-name\": \"Field\"\n },\n \"operator\": {\n \"description\": \"The operator for this filter.\\n\\n* equals FilterOperatorEquals Matches objects that are exactly equal to the value in the field.\\n\\n* not_equals FilterOperatorNotEquals Matches objects that are not exactly equal to the value in the field.\\n\\n* contains FilterOperatorContains For a multi-valued field, such as tags, this operator will match objects that contain any of the values in the field.\\n\\n* does_not_contain FilterOperatorDoesNotContain For a multi-valued field, such as tags, this operator will match objects that do not contain any of the values in the field.\\n\\n* in FilterOperatorIn Matches objects if the field is one of several possible values, as specified in the values array.\\n\\n* not_in FilterOperatorNotIn Matches objects if the field is none of several possible values, as specified in the values array.\\n\\n* and FilterOperatorAnd Matches objects only if all subfilters match.\\n\\n* or FilterOperatorOr Matches objects if any subfilter matches.\\n\\n* time_is_after FilterOperatorTimeIsAfter Matches objects if the field is after the given time.\\n\\n* time_is_before FilterOperatorTimeIsBefore Matches objects if the field is before the given time.\\n\\n* time_range FilterOperatorTimeRange Matches objects if the field is between the given times.\\n\\n* string_contains FilterOperatorStringContains Matches objects if the field contains the given string.\\n\\n* string_does_not_contain FilterOperatorStringDoesNotContain Matches objects if the field does not contain the given string.\\n\\n* is_set FilterOperatorIsSet FilterOperatorIsSet matches objects if the field is set.\\n\\n* is_unset FilterOperatorIsUnset FilterOperatorIsUnset matches objects if the field is unset.\",\n \"enum\": [\n \"equals\",\n \"not_equals\",\n \"contains\",\n \"does_not_contain\",\n \"in\",\n \"not_in\",\n \"and\",\n \"or\",\n \"time_is_after\",\n \"time_is_before\",\n \"time_range\",\n \"string_contains\",\n \"string_does_not_contain\",\n \"is_set\",\n \"is_unset\"\n ],\n \"type\": \"string\",\n \"x-go-enum-desc\": \"equals FilterOperatorEquals Matches objects that are exactly equal to the value in the field.\\nnot_equals FilterOperatorNotEquals Matches objects that are not exactly equal to the value in the field.\\ncontains FilterOperatorContains For a multi-valued field, such as tags, this operator will match objects that contain any of the values in the field.\\ndoes_not_contain FilterOperatorDoesNotContain For a multi-valued field, such as tags, this operator will match objects that do not contain any of the values in the field.\\nin FilterOperatorIn Matches objects if the field is one of several possible values, as specified in the values array.\\nnot_in FilterOperatorNotIn Matches objects if the field is none of several possible values, as specified in the values array.\\nand FilterOperatorAnd Matches objects only if all subfilters match.\\nor FilterOperatorOr Matches objects if any subfilter matches.\\ntime_is_after FilterOperatorTimeIsAfter Matches objects if the field is after the given time.\\ntime_is_before FilterOperatorTimeIsBefore Matches objects if the field is before the given time.\\ntime_range FilterOperatorTimeRange Matches objects if the field is between the given times.\\nstring_contains FilterOperatorStringContains Matches objects if the field contains the given string.\\nstring_does_not_contain FilterOperatorStringDoesNotContain Matches objects if the field does not contain the given string.\\nis_set FilterOperatorIsSet FilterOperatorIsSet matches objects if the field is set.\\nis_unset FilterOperatorIsUnset FilterOperatorIsUnset matches objects if the field is unset.\",\n \"x-go-name\": \"Operator\"\n },\n \"subfilters\": {\n \"description\": \"Sub-filters for this filter. Valid only when operator is \\\"and\\\" or \\\"or\\\".\\n\\nThe maximum allowed depth for a tree of filters is 3.\",\n \"items\": {\n \"$ref\": \"#/components/schemas/Filter\",\n \"has_circular_reference\": true\n },\n \"type\": \"array\",\n \"x-go-name\": \"Subfilters\"\n },\n \"value\": {\n \"description\": \"The value for this filter. Only used for single-valued operators\\n\\n(\\\"equals\\\", \\\"not_equals\\\", \\\"contains\\\", \\\"does_not_contain\\\")\",\n \"type\": \"string\",\n \"x-go-name\": \"Value\"\n },\n \"values\": {\n \"description\": \"The values for this filter. Only used for multi-valued operators (\\\"in\\\", \\\"not_in\\\").\",\n \"items\": {\n \"type\": \"string\"\n },\n \"type\": \"array\",\n \"x-go-name\": \"Values\"\n }\n },\n \"required\": [\n \"field\",\n \"operator\"\n ],\n \"type\": \"object\",\n \"x-go-package\": \"pylon/api/apiserver/apitypes\"\n },\n \"limit\": {\n \"description\": \"The number of users to fetch. Defaults to 100. Must be greater than 0 and less than 1000.\",\n \"format\": \"int64\",\n \"type\": \"integer\",\n \"x-go-name\": \"Limit\"\n }\n },\n \"required\": [\n \"filter\"\n ],\n \"type\": \"object\",\n \"x-go-package\": \"pylon/api/apiserver/endpoints\"\n }\n }\n },\n \"required\": false\n}", + "use_request_body_schema_mode": true, + "validate_request_body_schema": false + } +} diff --git a/toolkits/pylon_api/pylon_api/wrapper_tools/SnoozeIssue.json b/toolkits/pylon_api/pylon_api/wrapper_tools/SnoozeIssue.json new file mode 100644 index 00000000..d67a3f33 --- /dev/null +++ b/toolkits/pylon_api/pylon_api/wrapper_tools/SnoozeIssue.json @@ -0,0 +1,155 @@ +{ + "name": "SnoozeIssue", + "fully_qualified_name": "PylonApi.SnoozeIssue@0.1.0", + "description": "Temporarily pause notifications for an issue.\n\nUse this tool to snooze notifications for a specific issue temporarily. It is helpful when you want to focus elsewhere without getting alerts for the issue.", + "toolkit": { + "name": "PylonApi", + "description": null, + "version": "0.1.0" + }, + "input": { + "parameters": [ + { + "name": "issue_id", + "required": true, + "description": "The ID or number of the issue to snooze.", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The ID or number of the issue to snooze." + }, + "inferrable": true, + "http_endpoint_parameter_name": "id" + }, + { + "name": "snooze_until_datetime", + "required": false, + "description": "The date and time to snooze the issue until, using the RFC3339 format.", + "value_schema": { + "val_type": "json", + "inner_val_type": null, + "enum": null, + "properties": { + "snooze_until": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The date and time to snooze the issue until. (RFC3339)" + } + }, + "inner_properties": null, + "description": "" + }, + "inferrable": true, + "http_endpoint_parameter_name": "requestBody" + } + ] + }, + "output": { + "description": "Response from the API endpoint 'SnoozeIssue'.", + "available_modes": [ + "value", + "error", + "null" + ], + "value_schema": { + "val_type": "json", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": null + } + }, + "requirements": { + "authorization": null, + "secrets": [ + { + "key": "PYLON_SECRET_TOKEN" + } + ], + "metadata": null + }, + "deprecation_message": null, + "metadata": { + "object_type": "api_wrapper_tool", + "version": "1.1.0", + "description": "Tools that enable LLMs to interact directly with the pylon API." + }, + "http_endpoint": { + "metadata": { + "object_type": "http_endpoint", + "version": "1.2.0", + "description": "" + }, + "url": "https://api.usepylon.com/issues/{id}/snooze", + "http_method": "POST", + "headers": {}, + "parameters": [ + { + "name": "id", + "tool_parameter_name": "issue_id", + "description": "The ID or number of the issue to snooze.", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The ID or number of the issue to snooze." + }, + "accepted_as": "path", + "required": true, + "deprecated": false, + "default": null, + "documentation_urls": [] + }, + { + "name": "requestBody", + "tool_parameter_name": "snooze_until_datetime", + "description": "", + "value_schema": { + "val_type": "json", + "inner_val_type": null, + "enum": null, + "properties": { + "snooze_until": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The date and time to snooze the issue until. (RFC3339)" + } + }, + "inner_properties": null, + "description": "" + }, + "accepted_as": "body", + "required": false, + "deprecated": false, + "default": null, + "documentation_urls": [] + } + ], + "documentation_urls": [], + "secrets": [ + { + "arcade_key": "PYLON_SECRET_TOKEN", + "parameter_name": "Authorization", + "accepted_as": "header", + "formatted_value": "Bearer {authorization}", + "description": "", + "is_auth_token": false + } + ], + "request_body_spec": "{\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"properties\": {\n \"snooze_until\": {\n \"description\": \"The date and time to snooze the issue until. (RFC3339)\",\n \"type\": \"string\",\n \"x-go-name\": \"SnoozeUntil\"\n }\n },\n \"required\": [\n \"snooze_until\"\n ],\n \"type\": \"object\",\n \"x-go-package\": \"pylon/api/apiserver/endpoints\"\n }\n }\n },\n \"required\": false\n}", + "use_request_body_schema_mode": true, + "validate_request_body_schema": true + } +} diff --git a/toolkits/pylon_api/pylon_api/wrapper_tools/UpdateAccount.json b/toolkits/pylon_api/pylon_api/wrapper_tools/UpdateAccount.json new file mode 100644 index 00000000..f5ed1e2c --- /dev/null +++ b/toolkits/pylon_api/pylon_api/wrapper_tools/UpdateAccount.json @@ -0,0 +1,467 @@ +{ + "name": "UpdateAccount", + "fully_qualified_name": "PylonApi.UpdateAccount@0.1.0", + "description": "Update details of an existing account.\n\nUse this tool to modify the information of an existing account by providing the account ID and new details. It should be called when account information needs to be updated.", + "toolkit": { + "name": "PylonApi", + "description": null, + "version": "0.1.0" + }, + "input": { + "parameters": [ + { + "name": "account_id", + "required": true, + "description": "The ID or external ID of the account to update.", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The ID or external ID of the account to update." + }, + "inferrable": true, + "http_endpoint_parameter_name": "id" + }, + { + "name": "account_update_details", + "required": false, + "description": "JSON containing details to update an account like channels, custom fields, domains, etc.", + "value_schema": { + "val_type": "json", + "inner_val_type": null, + "enum": null, + "properties": { + "channels": { + "val_type": "array", + "inner_val_type": "json", + "enum": null, + "properties": null, + "inner_properties": { + "channel_id": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The ID of the channel. If this is a Microsoft Teams channel, the ID must be in the format of `{team_id}|{channel_id}`." + }, + "is_primary": { + "val_type": "boolean", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "Whether this channel is the primary channel for the account." + }, + "mirror_to": { + "val_type": "json", + "inner_val_type": null, + "enum": null, + "properties": { + "channel_id": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The ID of the channel. If this is a Microsoft Teams channel, the ID must be in the format of `{team_id}|{channel_id}`." + }, + "source": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The source, which can be one of `[\"slack\", \"microsoft_teams\", \"discord\"]`." + } + }, + "inner_properties": null, + "description": null + }, + "source": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The source, which can be one of `[\"slack\", \"microsoft_teams\", \"discord\"]`." + } + }, + "description": "An array of channels to be linked to this account." + }, + "custom_fields": { + "val_type": "array", + "inner_val_type": "json", + "enum": null, + "properties": null, + "inner_properties": { + "slug": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The slug of the custom field." + }, + "value": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The value of the custom field. Only to be used for single-valued custom fields. If unset, the custom field will be unset. If the custom field is a select field, the value must be the select option slug, which you can find from the GET /custom-fields endpoint." + }, + "values": { + "val_type": "array", + "inner_val_type": "string", + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The values of the custom field. Only to be used for multi-valued custom fields (ex. multiselect). If unset, the custom field will be unset. If the custom field is a multiselect field, the values must be the select option slugs which you can find from the GET /custom-fields endpoint." + } + }, + "description": "An array of custom fields to be used on this account." + }, + "domains": { + "val_type": "array", + "inner_val_type": "string", + "enum": null, + "properties": null, + "inner_properties": null, + "description": "Domains of the account. Must specify one domain as primary." + }, + "external_ids": { + "val_type": "array", + "inner_val_type": "json", + "enum": null, + "properties": null, + "inner_properties": { + "external_id": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The external ID. Must be unique per object type (ex. account)." + }, + "label": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The label of the external ID. Must be unique per object." + } + }, + "description": "An array of external IDs to be used on this account. If provided, the accounts external IDs will be updated to the given external IDs." + }, + "logo_url": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "Logo URL of the account." + }, + "name": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The name of the account." + }, + "owner_id": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The ID of the owner of the account." + }, + "primary_domain": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "Must be in the list of domains. If there are any domains, there must be exactly one primary domain." + }, + "tags": { + "val_type": "array", + "inner_val_type": "string", + "enum": null, + "properties": null, + "inner_properties": null, + "description": "An array of strings to use as tags on this account. If provided, the accounts tags will be updated to the given tags." + } + }, + "inner_properties": null, + "description": "" + }, + "inferrable": true, + "http_endpoint_parameter_name": "requestBody" + } + ] + }, + "output": { + "description": "Response from the API endpoint 'UpdateAccount'.", + "available_modes": [ + "value", + "error", + "null" + ], + "value_schema": { + "val_type": "json", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": null + } + }, + "requirements": { + "authorization": null, + "secrets": [ + { + "key": "PYLON_SECRET_TOKEN" + } + ], + "metadata": null + }, + "deprecation_message": null, + "metadata": { + "object_type": "api_wrapper_tool", + "version": "1.1.0", + "description": "Tools that enable LLMs to interact directly with the pylon API." + }, + "http_endpoint": { + "metadata": { + "object_type": "http_endpoint", + "version": "1.2.0", + "description": "" + }, + "url": "https://api.usepylon.com/accounts/{id}", + "http_method": "PATCH", + "headers": {}, + "parameters": [ + { + "name": "id", + "tool_parameter_name": "account_id", + "description": "The ID or external ID of the account to update.", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The ID or external ID of the account to update." + }, + "accepted_as": "path", + "required": true, + "deprecated": false, + "default": null, + "documentation_urls": [] + }, + { + "name": "requestBody", + "tool_parameter_name": "account_update_details", + "description": "", + "value_schema": { + "val_type": "json", + "inner_val_type": null, + "enum": null, + "properties": { + "channels": { + "val_type": "array", + "inner_val_type": "json", + "enum": null, + "properties": null, + "inner_properties": { + "channel_id": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The ID of the channel. If this is a Microsoft Teams channel, the ID must be in the format of `{team_id}|{channel_id}`." + }, + "is_primary": { + "val_type": "boolean", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "Whether this channel is the primary channel for the account." + }, + "mirror_to": { + "val_type": "json", + "inner_val_type": null, + "enum": null, + "properties": { + "channel_id": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The ID of the channel. If this is a Microsoft Teams channel, the ID must be in the format of `{team_id}|{channel_id}`." + }, + "source": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The source, which can be one of `[\"slack\", \"microsoft_teams\", \"discord\"]`." + } + }, + "inner_properties": null, + "description": null + }, + "source": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The source, which can be one of `[\"slack\", \"microsoft_teams\", \"discord\"]`." + } + }, + "description": "An array of channels to be linked to this account." + }, + "custom_fields": { + "val_type": "array", + "inner_val_type": "json", + "enum": null, + "properties": null, + "inner_properties": { + "slug": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The slug of the custom field." + }, + "value": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The value of the custom field. Only to be used for single-valued custom fields. If unset, the custom field will be unset. If the custom field is a select field, the value must be the select option slug, which you can find from the GET /custom-fields endpoint." + }, + "values": { + "val_type": "array", + "inner_val_type": "string", + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The values of the custom field. Only to be used for multi-valued custom fields (ex. multiselect). If unset, the custom field will be unset. If the custom field is a multiselect field, the values must be the select option slugs which you can find from the GET /custom-fields endpoint." + } + }, + "description": "An array of custom fields to be used on this account." + }, + "domains": { + "val_type": "array", + "inner_val_type": "string", + "enum": null, + "properties": null, + "inner_properties": null, + "description": "Domains of the account. Must specify one domain as primary." + }, + "external_ids": { + "val_type": "array", + "inner_val_type": "json", + "enum": null, + "properties": null, + "inner_properties": { + "external_id": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The external ID. Must be unique per object type (ex. account)." + }, + "label": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The label of the external ID. Must be unique per object." + } + }, + "description": "An array of external IDs to be used on this account. If provided, the accounts external IDs will be updated to the given external IDs." + }, + "logo_url": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "Logo URL of the account." + }, + "name": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The name of the account." + }, + "owner_id": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The ID of the owner of the account." + }, + "primary_domain": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "Must be in the list of domains. If there are any domains, there must be exactly one primary domain." + }, + "tags": { + "val_type": "array", + "inner_val_type": "string", + "enum": null, + "properties": null, + "inner_properties": null, + "description": "An array of strings to use as tags on this account. If provided, the accounts tags will be updated to the given tags." + } + }, + "inner_properties": null, + "description": "" + }, + "accepted_as": "body", + "required": false, + "deprecated": false, + "default": null, + "documentation_urls": [] + } + ], + "documentation_urls": [], + "secrets": [ + { + "arcade_key": "PYLON_SECRET_TOKEN", + "parameter_name": "Authorization", + "accepted_as": "header", + "formatted_value": "Bearer {authorization}", + "description": "", + "is_auth_token": false + } + ], + "request_body_spec": "{\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"properties\": {\n \"channels\": {\n \"description\": \"An array of channels to be linked to this account.\",\n \"items\": {\n \"properties\": {\n \"channel_id\": {\n \"description\": \"The ID of the channel. If this is a Microsoft Teams channel, the ID must be in the format of `{team_id}|{channel_id}`.\",\n \"type\": \"string\",\n \"x-go-name\": \"ChannelID\"\n },\n \"is_primary\": {\n \"description\": \"Whether this channel is the primary channel for the account.\",\n \"type\": \"boolean\",\n \"x-go-name\": \"IsPrimary\"\n },\n \"mirror_to\": {\n \"properties\": {\n \"channel_id\": {\n \"description\": \"The ID of the channel. If this is a Microsoft Teams channel, the ID must be in the format of `{team_id}|{channel_id}`.\",\n \"type\": \"string\",\n \"x-go-name\": \"ChannelID\"\n },\n \"source\": {\n \"description\": \"The source, which can be one of `[\\\"slack\\\", \\\"microsoft_teams\\\", \\\"discord\\\"]`.\",\n \"type\": \"string\",\n \"x-go-name\": \"Source\"\n }\n },\n \"type\": \"object\",\n \"x-go-package\": \"pylon/api/apiserver/apitypes\"\n },\n \"source\": {\n \"description\": \"The source, which can be one of `[\\\"slack\\\", \\\"microsoft_teams\\\", \\\"discord\\\"]`.\",\n \"type\": \"string\",\n \"x-go-name\": \"Source\"\n }\n },\n \"type\": \"object\",\n \"x-go-package\": \"pylon/api/apiserver/apitypes\"\n },\n \"type\": \"array\",\n \"x-go-name\": \"Channels\"\n },\n \"custom_fields\": {\n \"description\": \"An array of custom fields to be used on this account.\",\n \"items\": {\n \"properties\": {\n \"slug\": {\n \"description\": \"The slug of the custom field.\",\n \"type\": \"string\",\n \"x-go-name\": \"Slug\"\n },\n \"value\": {\n \"description\": \"The value of the custom field. Only to be used for single-valued custom fields. If unset, the custom field will be unset. If the custom field is a select field, the value must be the select option slug, which you can find from the GET /custom-fields endpoint.\",\n \"type\": \"string\",\n \"x-go-name\": \"Value\"\n },\n \"values\": {\n \"description\": \"The values of the custom field. Only to be used for multi-valued custom fields (ex. multiselect). If unset, the custom field will be unset. If the custom field is a multiselect field, the values must be the select option slugs which you can find from the GET /custom-fields endpoint.\",\n \"items\": {\n \"type\": \"string\"\n },\n \"type\": \"array\",\n \"x-go-name\": \"Values\"\n }\n },\n \"type\": \"object\",\n \"x-go-package\": \"pylon/api/apiserver/apitypes\"\n },\n \"type\": \"array\",\n \"x-go-name\": \"CustomFields\"\n },\n \"domains\": {\n \"description\": \"Domains of the account. Must specify one domain as primary.\",\n \"items\": {\n \"type\": \"string\"\n },\n \"type\": \"array\",\n \"x-go-name\": \"Domains\"\n },\n \"external_ids\": {\n \"description\": \"An array of external IDs to be used on this account. If provided, the accounts external IDs will be updated to the given external IDs.\",\n \"items\": {\n \"properties\": {\n \"external_id\": {\n \"description\": \"The external ID. Must be unique per object type (ex. account).\",\n \"type\": \"string\",\n \"x-go-name\": \"ExternalID\"\n },\n \"label\": {\n \"description\": \"The label of the external ID. Must be unique per object.\",\n \"type\": \"string\",\n \"x-go-name\": \"Label\"\n }\n },\n \"type\": \"object\",\n \"x-go-package\": \"pylon/api/apiserver/apitypes\"\n },\n \"type\": \"array\",\n \"x-go-name\": \"ExternalIDs\"\n },\n \"logo_url\": {\n \"description\": \"Logo URL of the account.\",\n \"type\": \"string\",\n \"x-go-name\": \"LogoURL\"\n },\n \"name\": {\n \"description\": \"The name of the account.\",\n \"type\": \"string\",\n \"x-go-name\": \"Name\"\n },\n \"owner_id\": {\n \"description\": \"The ID of the owner of the account.\",\n \"type\": \"string\",\n \"x-go-name\": \"OwnerID\"\n },\n \"primary_domain\": {\n \"description\": \"Must be in the list of domains. If there are any domains, there must be exactly one primary domain.\",\n \"type\": \"string\",\n \"x-go-name\": \"PrimaryDomain\"\n },\n \"tags\": {\n \"description\": \"An array of strings to use as tags on this account. If provided, the accounts tags will be updated to the given tags.\",\n \"items\": {\n \"type\": \"string\"\n },\n \"type\": \"array\",\n \"x-go-name\": \"Tags\"\n }\n },\n \"type\": \"object\",\n \"x-go-package\": \"pylon/api/apiserver/endpoints\"\n }\n }\n },\n \"required\": false\n}", + "use_request_body_schema_mode": true, + "validate_request_body_schema": true + } +} diff --git a/toolkits/pylon_api/pylon_api/wrapper_tools/UpdateAccountHighlight.json b/toolkits/pylon_api/pylon_api/wrapper_tools/UpdateAccountHighlight.json new file mode 100644 index 00000000..16030889 --- /dev/null +++ b/toolkits/pylon_api/pylon_api/wrapper_tools/UpdateAccountHighlight.json @@ -0,0 +1,203 @@ +{ + "name": "UpdateAccountHighlight", + "fully_qualified_name": "PylonApi.UpdateAccountHighlight@0.1.0", + "description": "Updates the highlight for a specified account.\n\nUse this tool to update the highlight information for a given account by specifying either the internal account ID or an external ID. Appropriate when modifications to account highlights are needed.", + "toolkit": { + "name": "PylonApi", + "description": null, + "version": "0.1.0" + }, + "input": { + "parameters": [ + { + "name": "highlight_id", + "required": true, + "description": "The unique identifier of the highlight you wish to update. Ensure this accurately corresponds to the highlight needing modification.", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The ID of the highlight to update." + }, + "inferrable": true, + "http_endpoint_parameter_name": "highlight_id" + }, + { + "name": "account_identifier", + "required": true, + "description": "The internal account ID (UUID) or external ID (any string) of the account associated with the highlight.", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The ID or external ID of the account that the highlight belongs to." + }, + "inferrable": true, + "http_endpoint_parameter_name": "account_id" + }, + { + "name": "updated_html_content", + "required": false, + "description": "The updated HTML content for the account highlight.", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The updated HTML content for this highlight." + }, + "inferrable": true, + "http_endpoint_parameter_name": "content_html" + }, + { + "name": "updated_expiration_timestamp", + "required": false, + "description": "The new expiration timestamp for the highlight in RFC3339 format.", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The updated expires at timestamp (RFC3339)." + }, + "inferrable": true, + "http_endpoint_parameter_name": "expires_at" + } + ] + }, + "output": { + "description": "Response from the API endpoint 'UpdateAccountHighlight'.", + "available_modes": [ + "value", + "error", + "null" + ], + "value_schema": { + "val_type": "json", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": null + } + }, + "requirements": { + "authorization": null, + "secrets": [ + { + "key": "PYLON_SECRET_TOKEN" + } + ], + "metadata": null + }, + "deprecation_message": null, + "metadata": { + "object_type": "api_wrapper_tool", + "version": "1.1.0", + "description": "Tools that enable LLMs to interact directly with the pylon API." + }, + "http_endpoint": { + "metadata": { + "object_type": "http_endpoint", + "version": "1.2.0", + "description": "" + }, + "url": "https://api.usepylon.com/accounts/{account_id}/highlights/{highlight_id}", + "http_method": "PATCH", + "headers": {}, + "parameters": [ + { + "name": "highlight_id", + "tool_parameter_name": "highlight_id", + "description": "The ID of the highlight to update.", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The ID of the highlight to update." + }, + "accepted_as": "path", + "required": true, + "deprecated": false, + "default": null, + "documentation_urls": [] + }, + { + "name": "account_id", + "tool_parameter_name": "account_identifier", + "description": "The ID or external ID of the account that the highlight belongs to.", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The ID or external ID of the account that the highlight belongs to." + }, + "accepted_as": "path", + "required": true, + "deprecated": false, + "default": null, + "documentation_urls": [] + }, + { + "name": "content_html", + "tool_parameter_name": "updated_html_content", + "description": "The updated HTML content for this highlight.", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The updated HTML content for this highlight." + }, + "accepted_as": "body", + "required": false, + "deprecated": false, + "default": null, + "documentation_urls": [] + }, + { + "name": "expires_at", + "tool_parameter_name": "updated_expiration_timestamp", + "description": "The updated expires at timestamp (RFC3339).", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The updated expires at timestamp (RFC3339)." + }, + "accepted_as": "body", + "required": false, + "deprecated": false, + "default": null, + "documentation_urls": [] + } + ], + "documentation_urls": [], + "secrets": [ + { + "arcade_key": "PYLON_SECRET_TOKEN", + "parameter_name": "Authorization", + "accepted_as": "header", + "formatted_value": "Bearer {authorization}", + "description": "", + "is_auth_token": false + } + ], + "request_body_spec": "{\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"properties\": {\n \"content_html\": {\n \"description\": \"The updated HTML content for this highlight.\",\n \"type\": \"string\",\n \"x-go-name\": \"ContentHTML\"\n },\n \"expires_at\": {\n \"description\": \"The updated expires at timestamp (RFC3339).\",\n \"type\": \"string\",\n \"x-go-name\": \"ExpiresAt\"\n }\n },\n \"type\": \"object\",\n \"x-go-package\": \"pylon/api/apiserver/endpoints\"\n }\n }\n },\n \"required\": false\n}", + "use_request_body_schema_mode": false, + "validate_request_body_schema": false + } +} diff --git a/toolkits/pylon_api/pylon_api/wrapper_tools/UpdateArticle.json b/toolkits/pylon_api/pylon_api/wrapper_tools/UpdateArticle.json new file mode 100644 index 00000000..68bc90ec --- /dev/null +++ b/toolkits/pylon_api/pylon_api/wrapper_tools/UpdateArticle.json @@ -0,0 +1,448 @@ +{ + "name": "UpdateArticle", + "fully_qualified_name": "PylonApi.UpdateArticle@0.1.0", + "description": "Update the content of an existing article.\n\nUse this tool to modify the content or details of an existing article in a knowledge base when updates are needed.", + "toolkit": { + "name": "PylonApi", + "description": null, + "version": "0.1.0" + }, + "input": { + "parameters": [ + { + "name": "knowledge_base_id", + "required": true, + "description": "The identifier for the knowledge base where the article to be updated is located.", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The KnowledgeBaseID of the article to update." + }, + "inferrable": true, + "http_endpoint_parameter_name": "id" + }, + { + "name": "article_id", + "required": true, + "description": "Specify the unique identifier of the article you want to update in the knowledge base.", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The ID of the article to update." + }, + "inferrable": true, + "http_endpoint_parameter_name": "article_id" + }, + { + "name": "article_update_details", + "required": false, + "description": "A JSON object containing details such as body HTML, title, language, visibility settings, AI agent access, and publication status for updating the article.", + "value_schema": { + "val_type": "json", + "inner_val_type": null, + "enum": null, + "properties": { + "body_html": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The HTML body of the article." + }, + "language": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The language code of the translation to update. If not provided, the default language (original article) will be updated." + }, + "publish_updated_body_html": { + "val_type": "boolean", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "Whether the changes to the article should be published. Defaults to false." + }, + "title": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The title of the article." + }, + "visibility_config": { + "val_type": "json", + "inner_val_type": null, + "enum": null, + "properties": { + "ai_agent_access": { + "val_type": "string", + "inner_val_type": null, + "enum": [ + "inherit", + "none", + "specific_agents" + ], + "properties": null, + "inner_properties": null, + "description": "AI agent access control for the article. Defaults to inherit from the parent scope when omitted.\n\n* inherit KnowledgeBaseArticleAIAgentAccessInherit Defers the access check to the parent object (Collection or KnowledgeBase).\n\n* none KnowledgeBaseArticleAIAgentAccessNone No AI agents have access to this article.\n\n* specific_agents KnowledgeBaseArticleAIAgentAccessSpecificAgents Only specific AI agents enumerated in the allowlist have access." + }, + "allowed_agent_ids": { + "val_type": "array", + "inner_val_type": "string", + "enum": null, + "properties": null, + "inner_properties": null, + "description": "List of AI agent IDs that may access this article when ai_agent_access is set to \"specific_agents\"." + }, + "customer_visibility_condition": { + "val_type": "json", + "inner_val_type": null, + "enum": null, + "properties": { + "field": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The field for this filter. For allowed fields, see the documentation for\n\nthe specific endpoint you are using.\n\nFor non-compound filters (any operators other than \"and\" or \"or\"),\n\nField must be set, along with either Value or Values, depending on the operator." + }, + "operator": { + "val_type": "string", + "inner_val_type": null, + "enum": [ + "equals", + "not_equals", + "contains", + "does_not_contain", + "in", + "not_in", + "and", + "or", + "time_is_after", + "time_is_before", + "time_range", + "string_contains", + "string_does_not_contain", + "is_set", + "is_unset" + ], + "properties": null, + "inner_properties": null, + "description": "The operator for this filter.\n\n* equals FilterOperatorEquals Matches objects that are exactly equal to the value in the field.\n\n* not_equals FilterOperatorNotEquals Matches objects that are not exactly equal to the value in the field.\n\n* contains FilterOperatorContains For a multi-valued field, such as tags, this operator will match objects that contain any of the values in the field.\n\n* does_not_contain FilterOperatorDoesNotContain For a multi-valued field, such as tags, this operator will match objects that do not contain any of the values in the field.\n\n* in FilterOperatorIn Matches objects if the field is one of several possible values, as specified in the values array.\n\n* not_in FilterOperatorNotIn Matches objects if the field is none of several possible values, as specified in the values array.\n\n* and FilterOperatorAnd Matches objects only if all subfilters match.\n\n* or FilterOperatorOr Matches objects if any subfilter matches.\n\n* time_is_after FilterOperatorTimeIsAfter Matches objects if the field is after the given time.\n\n* time_is_before FilterOperatorTimeIsBefore Matches objects if the field is before the given time.\n\n* time_range FilterOperatorTimeRange Matches objects if the field is between the given times.\n\n* string_contains FilterOperatorStringContains Matches objects if the field contains the given string.\n\n* string_does_not_contain FilterOperatorStringDoesNotContain Matches objects if the field does not contain the given string.\n\n* is_set FilterOperatorIsSet FilterOperatorIsSet matches objects if the field is set.\n\n* is_unset FilterOperatorIsUnset FilterOperatorIsUnset matches objects if the field is unset." + }, + "subfilters": { + "val_type": "array", + "inner_val_type": "json", + "enum": null, + "properties": null, + "inner_properties": {}, + "description": "Sub-filters for this filter. Valid only when operator is \"and\" or \"or\".\n\nThe maximum allowed depth for a tree of filters is 3." + }, + "value": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The value for this filter. Only used for single-valued operators\n\n(\"equals\", \"not_equals\", \"contains\", \"does_not_contain\")" + }, + "values": { + "val_type": "array", + "inner_val_type": "string", + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The values for this filter. Only used for multi-valued operators (\"in\", \"not_in\")." + } + }, + "inner_properties": null, + "description": null + }, + "visibility": { + "val_type": "string", + "inner_val_type": null, + "enum": [ + "public", + "customer", + "internal_only" + ], + "properties": null, + "inner_properties": null, + "description": "The visibility setting of the article.\n\n* public KnowledgeBaseArticleVisibilityPublic\n\n* customer KnowledgeBaseArticleVisibilityCustomer\n\n* internal_only KnowledgeBaseArticleVisibilityInternalOnly" + } + }, + "inner_properties": null, + "description": null + } + }, + "inner_properties": null, + "description": "" + }, + "inferrable": true, + "http_endpoint_parameter_name": "requestBody" + } + ] + }, + "output": { + "description": "Response from the API endpoint 'UpdateArticle'.", + "available_modes": [ + "value", + "error", + "null" + ], + "value_schema": { + "val_type": "json", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": null + } + }, + "requirements": { + "authorization": null, + "secrets": [ + { + "key": "PYLON_SECRET_TOKEN" + } + ], + "metadata": null + }, + "deprecation_message": null, + "metadata": { + "object_type": "api_wrapper_tool", + "version": "1.1.0", + "description": "Tools that enable LLMs to interact directly with the pylon API." + }, + "http_endpoint": { + "metadata": { + "object_type": "http_endpoint", + "version": "1.2.0", + "description": "" + }, + "url": "https://api.usepylon.com/knowledge-bases/{id}/articles/{article_id}", + "http_method": "PATCH", + "headers": {}, + "parameters": [ + { + "name": "id", + "tool_parameter_name": "knowledge_base_id", + "description": "The KnowledgeBaseID of the article to update.", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The KnowledgeBaseID of the article to update." + }, + "accepted_as": "path", + "required": true, + "deprecated": false, + "default": null, + "documentation_urls": [] + }, + { + "name": "article_id", + "tool_parameter_name": "article_id", + "description": "The ID of the article to update.", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The ID of the article to update." + }, + "accepted_as": "path", + "required": true, + "deprecated": false, + "default": null, + "documentation_urls": [] + }, + { + "name": "requestBody", + "tool_parameter_name": "article_update_details", + "description": "", + "value_schema": { + "val_type": "json", + "inner_val_type": null, + "enum": null, + "properties": { + "body_html": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The HTML body of the article." + }, + "language": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The language code of the translation to update. If not provided, the default language (original article) will be updated." + }, + "publish_updated_body_html": { + "val_type": "boolean", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "Whether the changes to the article should be published. Defaults to false." + }, + "title": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The title of the article." + }, + "visibility_config": { + "val_type": "json", + "inner_val_type": null, + "enum": null, + "properties": { + "ai_agent_access": { + "val_type": "string", + "inner_val_type": null, + "enum": [ + "inherit", + "none", + "specific_agents" + ], + "properties": null, + "inner_properties": null, + "description": "AI agent access control for the article. Defaults to inherit from the parent scope when omitted.\n\n* inherit KnowledgeBaseArticleAIAgentAccessInherit Defers the access check to the parent object (Collection or KnowledgeBase).\n\n* none KnowledgeBaseArticleAIAgentAccessNone No AI agents have access to this article.\n\n* specific_agents KnowledgeBaseArticleAIAgentAccessSpecificAgents Only specific AI agents enumerated in the allowlist have access." + }, + "allowed_agent_ids": { + "val_type": "array", + "inner_val_type": "string", + "enum": null, + "properties": null, + "inner_properties": null, + "description": "List of AI agent IDs that may access this article when ai_agent_access is set to \"specific_agents\"." + }, + "customer_visibility_condition": { + "val_type": "json", + "inner_val_type": null, + "enum": null, + "properties": { + "field": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The field for this filter. For allowed fields, see the documentation for\n\nthe specific endpoint you are using.\n\nFor non-compound filters (any operators other than \"and\" or \"or\"),\n\nField must be set, along with either Value or Values, depending on the operator." + }, + "operator": { + "val_type": "string", + "inner_val_type": null, + "enum": [ + "equals", + "not_equals", + "contains", + "does_not_contain", + "in", + "not_in", + "and", + "or", + "time_is_after", + "time_is_before", + "time_range", + "string_contains", + "string_does_not_contain", + "is_set", + "is_unset" + ], + "properties": null, + "inner_properties": null, + "description": "The operator for this filter.\n\n* equals FilterOperatorEquals Matches objects that are exactly equal to the value in the field.\n\n* not_equals FilterOperatorNotEquals Matches objects that are not exactly equal to the value in the field.\n\n* contains FilterOperatorContains For a multi-valued field, such as tags, this operator will match objects that contain any of the values in the field.\n\n* does_not_contain FilterOperatorDoesNotContain For a multi-valued field, such as tags, this operator will match objects that do not contain any of the values in the field.\n\n* in FilterOperatorIn Matches objects if the field is one of several possible values, as specified in the values array.\n\n* not_in FilterOperatorNotIn Matches objects if the field is none of several possible values, as specified in the values array.\n\n* and FilterOperatorAnd Matches objects only if all subfilters match.\n\n* or FilterOperatorOr Matches objects if any subfilter matches.\n\n* time_is_after FilterOperatorTimeIsAfter Matches objects if the field is after the given time.\n\n* time_is_before FilterOperatorTimeIsBefore Matches objects if the field is before the given time.\n\n* time_range FilterOperatorTimeRange Matches objects if the field is between the given times.\n\n* string_contains FilterOperatorStringContains Matches objects if the field contains the given string.\n\n* string_does_not_contain FilterOperatorStringDoesNotContain Matches objects if the field does not contain the given string.\n\n* is_set FilterOperatorIsSet FilterOperatorIsSet matches objects if the field is set.\n\n* is_unset FilterOperatorIsUnset FilterOperatorIsUnset matches objects if the field is unset." + }, + "subfilters": { + "val_type": "array", + "inner_val_type": "json", + "enum": null, + "properties": null, + "inner_properties": {}, + "description": "Sub-filters for this filter. Valid only when operator is \"and\" or \"or\".\n\nThe maximum allowed depth for a tree of filters is 3." + }, + "value": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The value for this filter. Only used for single-valued operators\n\n(\"equals\", \"not_equals\", \"contains\", \"does_not_contain\")" + }, + "values": { + "val_type": "array", + "inner_val_type": "string", + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The values for this filter. Only used for multi-valued operators (\"in\", \"not_in\")." + } + }, + "inner_properties": null, + "description": null + }, + "visibility": { + "val_type": "string", + "inner_val_type": null, + "enum": [ + "public", + "customer", + "internal_only" + ], + "properties": null, + "inner_properties": null, + "description": "The visibility setting of the article.\n\n* public KnowledgeBaseArticleVisibilityPublic\n\n* customer KnowledgeBaseArticleVisibilityCustomer\n\n* internal_only KnowledgeBaseArticleVisibilityInternalOnly" + } + }, + "inner_properties": null, + "description": null + } + }, + "inner_properties": null, + "description": "" + }, + "accepted_as": "body", + "required": false, + "deprecated": false, + "default": null, + "documentation_urls": [] + } + ], + "documentation_urls": [], + "secrets": [ + { + "arcade_key": "PYLON_SECRET_TOKEN", + "parameter_name": "Authorization", + "accepted_as": "header", + "formatted_value": "Bearer {authorization}", + "description": "", + "is_auth_token": false + } + ], + "request_body_spec": "{\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"properties\": {\n \"body_html\": {\n \"description\": \"The HTML body of the article.\",\n \"type\": \"string\",\n \"x-go-name\": \"BodyHTML\"\n },\n \"language\": {\n \"description\": \"The language code of the translation to update. If not provided, the default language (original article) will be updated.\",\n \"type\": \"string\",\n \"x-go-name\": \"Language\"\n },\n \"publish_updated_body_html\": {\n \"description\": \"Whether the changes to the article should be published. Defaults to false.\",\n \"type\": \"boolean\",\n \"x-go-name\": \"PublishUpdatedBodyHTML\"\n },\n \"title\": {\n \"description\": \"The title of the article.\",\n \"type\": \"string\",\n \"x-go-name\": \"Title\"\n },\n \"visibility_config\": {\n \"properties\": {\n \"ai_agent_access\": {\n \"description\": \"AI agent access control for the article. Defaults to inherit from the parent scope when omitted.\\n\\n* inherit KnowledgeBaseArticleAIAgentAccessInherit Defers the access check to the parent object (Collection or KnowledgeBase).\\n\\n* none KnowledgeBaseArticleAIAgentAccessNone No AI agents have access to this article.\\n\\n* specific_agents KnowledgeBaseArticleAIAgentAccessSpecificAgents Only specific AI agents enumerated in the allowlist have access.\",\n \"enum\": [\n \"inherit\",\n \"none\",\n \"specific_agents\"\n ],\n \"type\": \"string\",\n \"x-go-enum-desc\": \"inherit KnowledgeBaseArticleAIAgentAccessInherit Defers the access check to the parent object (Collection or KnowledgeBase).\\nnone KnowledgeBaseArticleAIAgentAccessNone No AI agents have access to this article.\\nspecific_agents KnowledgeBaseArticleAIAgentAccessSpecificAgents Only specific AI agents enumerated in the allowlist have access.\",\n \"x-go-name\": \"AiAgentAccess\"\n },\n \"allowed_agent_ids\": {\n \"description\": \"List of AI agent IDs that may access this article when ai_agent_access is set to \\\"specific_agents\\\".\",\n \"items\": {\n \"type\": \"string\"\n },\n \"type\": \"array\",\n \"x-go-name\": \"AllowedAgentIDs\"\n },\n \"customer_visibility_condition\": {\n \"properties\": {\n \"field\": {\n \"description\": \"The field for this filter. For allowed fields, see the documentation for\\n\\nthe specific endpoint you are using.\\n\\nFor non-compound filters (any operators other than \\\"and\\\" or \\\"or\\\"),\\n\\nField must be set, along with either Value or Values, depending on the operator.\",\n \"type\": \"string\",\n \"x-go-name\": \"Field\"\n },\n \"operator\": {\n \"description\": \"The operator for this filter.\\n\\n* equals FilterOperatorEquals Matches objects that are exactly equal to the value in the field.\\n\\n* not_equals FilterOperatorNotEquals Matches objects that are not exactly equal to the value in the field.\\n\\n* contains FilterOperatorContains For a multi-valued field, such as tags, this operator will match objects that contain any of the values in the field.\\n\\n* does_not_contain FilterOperatorDoesNotContain For a multi-valued field, such as tags, this operator will match objects that do not contain any of the values in the field.\\n\\n* in FilterOperatorIn Matches objects if the field is one of several possible values, as specified in the values array.\\n\\n* not_in FilterOperatorNotIn Matches objects if the field is none of several possible values, as specified in the values array.\\n\\n* and FilterOperatorAnd Matches objects only if all subfilters match.\\n\\n* or FilterOperatorOr Matches objects if any subfilter matches.\\n\\n* time_is_after FilterOperatorTimeIsAfter Matches objects if the field is after the given time.\\n\\n* time_is_before FilterOperatorTimeIsBefore Matches objects if the field is before the given time.\\n\\n* time_range FilterOperatorTimeRange Matches objects if the field is between the given times.\\n\\n* string_contains FilterOperatorStringContains Matches objects if the field contains the given string.\\n\\n* string_does_not_contain FilterOperatorStringDoesNotContain Matches objects if the field does not contain the given string.\\n\\n* is_set FilterOperatorIsSet FilterOperatorIsSet matches objects if the field is set.\\n\\n* is_unset FilterOperatorIsUnset FilterOperatorIsUnset matches objects if the field is unset.\",\n \"enum\": [\n \"equals\",\n \"not_equals\",\n \"contains\",\n \"does_not_contain\",\n \"in\",\n \"not_in\",\n \"and\",\n \"or\",\n \"time_is_after\",\n \"time_is_before\",\n \"time_range\",\n \"string_contains\",\n \"string_does_not_contain\",\n \"is_set\",\n \"is_unset\"\n ],\n \"type\": \"string\",\n \"x-go-enum-desc\": \"equals FilterOperatorEquals Matches objects that are exactly equal to the value in the field.\\nnot_equals FilterOperatorNotEquals Matches objects that are not exactly equal to the value in the field.\\ncontains FilterOperatorContains For a multi-valued field, such as tags, this operator will match objects that contain any of the values in the field.\\ndoes_not_contain FilterOperatorDoesNotContain For a multi-valued field, such as tags, this operator will match objects that do not contain any of the values in the field.\\nin FilterOperatorIn Matches objects if the field is one of several possible values, as specified in the values array.\\nnot_in FilterOperatorNotIn Matches objects if the field is none of several possible values, as specified in the values array.\\nand FilterOperatorAnd Matches objects only if all subfilters match.\\nor FilterOperatorOr Matches objects if any subfilter matches.\\ntime_is_after FilterOperatorTimeIsAfter Matches objects if the field is after the given time.\\ntime_is_before FilterOperatorTimeIsBefore Matches objects if the field is before the given time.\\ntime_range FilterOperatorTimeRange Matches objects if the field is between the given times.\\nstring_contains FilterOperatorStringContains Matches objects if the field contains the given string.\\nstring_does_not_contain FilterOperatorStringDoesNotContain Matches objects if the field does not contain the given string.\\nis_set FilterOperatorIsSet FilterOperatorIsSet matches objects if the field is set.\\nis_unset FilterOperatorIsUnset FilterOperatorIsUnset matches objects if the field is unset.\",\n \"x-go-name\": \"Operator\"\n },\n \"subfilters\": {\n \"description\": \"Sub-filters for this filter. Valid only when operator is \\\"and\\\" or \\\"or\\\".\\n\\nThe maximum allowed depth for a tree of filters is 3.\",\n \"items\": {\n \"$ref\": \"#/components/schemas/Filter\",\n \"has_circular_reference\": true\n },\n \"type\": \"array\",\n \"x-go-name\": \"Subfilters\"\n },\n \"value\": {\n \"description\": \"The value for this filter. Only used for single-valued operators\\n\\n(\\\"equals\\\", \\\"not_equals\\\", \\\"contains\\\", \\\"does_not_contain\\\")\",\n \"type\": \"string\",\n \"x-go-name\": \"Value\"\n },\n \"values\": {\n \"description\": \"The values for this filter. Only used for multi-valued operators (\\\"in\\\", \\\"not_in\\\").\",\n \"items\": {\n \"type\": \"string\"\n },\n \"type\": \"array\",\n \"x-go-name\": \"Values\"\n }\n },\n \"required\": [\n \"field\",\n \"operator\"\n ],\n \"type\": \"object\",\n \"x-go-package\": \"pylon/api/apiserver/apitypes\"\n },\n \"visibility\": {\n \"description\": \"The visibility setting of the article.\\n\\n* public KnowledgeBaseArticleVisibilityPublic\\n\\n* customer KnowledgeBaseArticleVisibilityCustomer\\n\\n* internal_only KnowledgeBaseArticleVisibilityInternalOnly\",\n \"enum\": [\n \"public\",\n \"customer\",\n \"internal_only\"\n ],\n \"type\": \"string\",\n \"x-go-enum-desc\": \"public KnowledgeBaseArticleVisibilityPublic\\ncustomer KnowledgeBaseArticleVisibilityCustomer\\ninternal_only KnowledgeBaseArticleVisibilityInternalOnly\",\n \"x-go-name\": \"Visibility\"\n }\n },\n \"type\": \"object\",\n \"x-go-package\": \"pylon/api/apiserver/apitypes\"\n }\n },\n \"type\": \"object\",\n \"x-go-package\": \"pylon/api/apiserver/endpoints\"\n }\n }\n },\n \"required\": false\n}", + "use_request_body_schema_mode": true, + "validate_request_body_schema": false + } +} diff --git a/toolkits/pylon_api/pylon_api/wrapper_tools/UpdateContactInfo.json b/toolkits/pylon_api/pylon_api/wrapper_tools/UpdateContactInfo.json new file mode 100644 index 00000000..49589ec3 --- /dev/null +++ b/toolkits/pylon_api/pylon_api/wrapper_tools/UpdateContactInfo.json @@ -0,0 +1,309 @@ +{ + "name": "UpdateContactInfo", + "fully_qualified_name": "PylonApi.UpdateContactInfo@0.1.0", + "description": "Updates an existing contact's information.\n\nUse this tool to update the details of an existing contact when modifications are needed.", + "toolkit": { + "name": "PylonApi", + "description": null, + "version": "0.1.0" + }, + "input": { + "parameters": [ + { + "name": "contact_id", + "required": true, + "description": "The unique identifier of the contact to be updated. This should match the existing contact's ID in the system.", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The ID of the contact to update." + }, + "inferrable": true, + "http_endpoint_parameter_name": "id" + }, + { + "name": "contact_update_details", + "required": false, + "description": "JSON object with updated contact details, including account ID, avatar URL, custom fields, email, name, and portal role. Use either 'account_id' or 'account_external_id', not both.", + "value_schema": { + "val_type": "json", + "inner_val_type": null, + "enum": null, + "properties": { + "account_external_id": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The external ID of the account to move the contact to. Cannot be used together with account_id." + }, + "account_id": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The account to move the contact to." + }, + "avatar_url": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The avatar URL of the contact. Must be a square .png, .jpg or .jpeg." + }, + "custom_fields": { + "val_type": "array", + "inner_val_type": "json", + "enum": null, + "properties": null, + "inner_properties": { + "slug": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The slug of the custom field." + }, + "value": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The value of the custom field. Only to be used for single-valued custom fields. If unset, the custom field will be unset. If the custom field is a select field, the value must be the select option slug, which you can find from the GET /custom-fields endpoint." + }, + "values": { + "val_type": "array", + "inner_val_type": "string", + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The values of the custom field. Only to be used for multi-valued custom fields (ex. multiselect). If unset, the custom field will be unset. If the custom field is a multiselect field, the values must be the select option slugs which you can find from the GET /custom-fields endpoint." + } + }, + "description": "An array of custom fields to be applied to this contact." + }, + "email": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The email of the contact." + }, + "name": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "in: body\n\nThe name of the contact." + }, + "portal_role": { + "val_type": "string", + "inner_val_type": null, + "enum": [ + "no_access", + "member", + "admin" + ], + "properties": null, + "inner_properties": null, + "description": "The portal role to assign to the contact. Can be one of `no_access`, `member`, or `admin`.\n\n* no_access PortalRoleNoAccess\n\n* member PortalRoleMember\n\n* admin PortalRoleAdmin" + } + }, + "inner_properties": null, + "description": "" + }, + "inferrable": true, + "http_endpoint_parameter_name": "requestBody" + } + ] + }, + "output": { + "description": "Response from the API endpoint 'UpdateContact'.", + "available_modes": [ + "value", + "error", + "null" + ], + "value_schema": { + "val_type": "json", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": null + } + }, + "requirements": { + "authorization": null, + "secrets": [ + { + "key": "PYLON_SECRET_TOKEN" + } + ], + "metadata": null + }, + "deprecation_message": null, + "metadata": { + "object_type": "api_wrapper_tool", + "version": "1.1.0", + "description": "Tools that enable LLMs to interact directly with the pylon API." + }, + "http_endpoint": { + "metadata": { + "object_type": "http_endpoint", + "version": "1.2.0", + "description": "" + }, + "url": "https://api.usepylon.com/contacts/{id}", + "http_method": "PATCH", + "headers": {}, + "parameters": [ + { + "name": "id", + "tool_parameter_name": "contact_id", + "description": "The ID of the contact to update.", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The ID of the contact to update." + }, + "accepted_as": "path", + "required": true, + "deprecated": false, + "default": null, + "documentation_urls": [] + }, + { + "name": "requestBody", + "tool_parameter_name": "contact_update_details", + "description": "", + "value_schema": { + "val_type": "json", + "inner_val_type": null, + "enum": null, + "properties": { + "account_external_id": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The external ID of the account to move the contact to. Cannot be used together with account_id." + }, + "account_id": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The account to move the contact to." + }, + "avatar_url": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The avatar URL of the contact. Must be a square .png, .jpg or .jpeg." + }, + "custom_fields": { + "val_type": "array", + "inner_val_type": "json", + "enum": null, + "properties": null, + "inner_properties": { + "slug": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The slug of the custom field." + }, + "value": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The value of the custom field. Only to be used for single-valued custom fields. If unset, the custom field will be unset. If the custom field is a select field, the value must be the select option slug, which you can find from the GET /custom-fields endpoint." + }, + "values": { + "val_type": "array", + "inner_val_type": "string", + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The values of the custom field. Only to be used for multi-valued custom fields (ex. multiselect). If unset, the custom field will be unset. If the custom field is a multiselect field, the values must be the select option slugs which you can find from the GET /custom-fields endpoint." + } + }, + "description": "An array of custom fields to be applied to this contact." + }, + "email": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The email of the contact." + }, + "name": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "in: body\n\nThe name of the contact." + }, + "portal_role": { + "val_type": "string", + "inner_val_type": null, + "enum": [ + "no_access", + "member", + "admin" + ], + "properties": null, + "inner_properties": null, + "description": "The portal role to assign to the contact. Can be one of `no_access`, `member`, or `admin`.\n\n* no_access PortalRoleNoAccess\n\n* member PortalRoleMember\n\n* admin PortalRoleAdmin" + } + }, + "inner_properties": null, + "description": "" + }, + "accepted_as": "body", + "required": false, + "deprecated": false, + "default": null, + "documentation_urls": [] + } + ], + "documentation_urls": [], + "secrets": [ + { + "arcade_key": "PYLON_SECRET_TOKEN", + "parameter_name": "Authorization", + "accepted_as": "header", + "formatted_value": "Bearer {authorization}", + "description": "", + "is_auth_token": false + } + ], + "request_body_spec": "{\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"properties\": {\n \"account_external_id\": {\n \"description\": \"The external ID of the account to move the contact to. Cannot be used together with account_id.\",\n \"type\": \"string\",\n \"x-go-name\": \"AccountExternalID\"\n },\n \"account_id\": {\n \"description\": \"The account to move the contact to.\",\n \"type\": \"string\",\n \"x-go-name\": \"AccountID\"\n },\n \"avatar_url\": {\n \"description\": \"The avatar URL of the contact. Must be a square .png, .jpg or .jpeg.\",\n \"type\": \"string\",\n \"x-go-name\": \"AvatarUrl\"\n },\n \"custom_fields\": {\n \"description\": \"An array of custom fields to be applied to this contact.\",\n \"items\": {\n \"properties\": {\n \"slug\": {\n \"description\": \"The slug of the custom field.\",\n \"type\": \"string\",\n \"x-go-name\": \"Slug\"\n },\n \"value\": {\n \"description\": \"The value of the custom field. Only to be used for single-valued custom fields. If unset, the custom field will be unset. If the custom field is a select field, the value must be the select option slug, which you can find from the GET /custom-fields endpoint.\",\n \"type\": \"string\",\n \"x-go-name\": \"Value\"\n },\n \"values\": {\n \"description\": \"The values of the custom field. Only to be used for multi-valued custom fields (ex. multiselect). If unset, the custom field will be unset. If the custom field is a multiselect field, the values must be the select option slugs which you can find from the GET /custom-fields endpoint.\",\n \"items\": {\n \"type\": \"string\"\n },\n \"type\": \"array\",\n \"x-go-name\": \"Values\"\n }\n },\n \"type\": \"object\",\n \"x-go-package\": \"pylon/api/apiserver/apitypes\"\n },\n \"type\": \"array\",\n \"x-go-name\": \"CustomFields\"\n },\n \"email\": {\n \"description\": \"The email of the contact.\",\n \"type\": \"string\",\n \"x-go-name\": \"Email\"\n },\n \"name\": {\n \"description\": \"in: body\\n\\nThe name of the contact.\",\n \"type\": \"string\",\n \"x-go-name\": \"Name\"\n },\n \"portal_role\": {\n \"description\": \"The portal role to assign to the contact. Can be one of `no_access`, `member`, or `admin`.\\n\\n* no_access PortalRoleNoAccess\\n\\n* member PortalRoleMember\\n\\n* admin PortalRoleAdmin\",\n \"enum\": [\n \"no_access\",\n \"member\",\n \"admin\"\n ],\n \"type\": \"string\",\n \"x-go-enum-desc\": \"no_access PortalRoleNoAccess\\nmember PortalRoleMember\\nadmin PortalRoleAdmin\",\n \"x-go-name\": \"PortalRole\"\n }\n },\n \"type\": \"object\",\n \"x-go-package\": \"pylon/api/apiserver/endpoints\"\n }\n }\n },\n \"required\": false\n}", + "use_request_body_schema_mode": true, + "validate_request_body_schema": true + } +} diff --git a/toolkits/pylon_api/pylon_api/wrapper_tools/UpdateCustomField.json b/toolkits/pylon_api/pylon_api/wrapper_tools/UpdateCustomField.json new file mode 100644 index 00000000..165e846f --- /dev/null +++ b/toolkits/pylon_api/pylon_api/wrapper_tools/UpdateCustomField.json @@ -0,0 +1,269 @@ +{ + "name": "UpdateCustomField", + "fully_qualified_name": "PylonApi.UpdateCustomField@0.1.0", + "description": "Update a custom field in a record.\n\n", + "toolkit": { + "name": "PylonApi", + "description": null, + "version": "0.1.0" + }, + "input": { + "parameters": [ + { + "name": "custom_field_id", + "required": true, + "description": "The unique identifier for the custom field to be updated.", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The ID of the custom field." + }, + "inferrable": true, + "http_endpoint_parameter_name": "id" + }, + { + "name": "custom_field_update_data", + "required": false, + "description": "JSON object containing details for updating the custom field, including 'default_value', 'default_values', 'description', 'label', 'select_options', and 'slug'.", + "value_schema": { + "val_type": "json", + "inner_val_type": null, + "enum": null, + "properties": { + "default_value": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The default value for single-valued custom fields." + }, + "default_values": { + "val_type": "array", + "inner_val_type": "string", + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The default values for multi-valued custom fields." + }, + "description": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The description of the custom field." + }, + "label": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The label of the custom field." + }, + "select_options": { + "val_type": "array", + "inner_val_type": "json", + "enum": null, + "properties": null, + "inner_properties": { + "label": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The label of the option." + }, + "slug": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The slug of the option." + } + }, + "description": "The list options of the select custom field. This is only present for select and multiselect custom fields." + }, + "slug": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The slug of the custom field." + } + }, + "inner_properties": null, + "description": "" + }, + "inferrable": true, + "http_endpoint_parameter_name": "requestBody" + } + ] + }, + "output": { + "description": "Response from the API endpoint 'UpdateCustomField'.", + "available_modes": [ + "value", + "error", + "null" + ], + "value_schema": { + "val_type": "json", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": null + } + }, + "requirements": { + "authorization": null, + "secrets": [ + { + "key": "PYLON_SECRET_TOKEN" + } + ], + "metadata": null + }, + "deprecation_message": null, + "metadata": { + "object_type": "api_wrapper_tool", + "version": "1.1.0", + "description": "Tools that enable LLMs to interact directly with the pylon API." + }, + "http_endpoint": { + "metadata": { + "object_type": "http_endpoint", + "version": "1.2.0", + "description": "" + }, + "url": "https://api.usepylon.com/custom-fields/{id}", + "http_method": "PATCH", + "headers": {}, + "parameters": [ + { + "name": "id", + "tool_parameter_name": "custom_field_id", + "description": "The ID of the custom field.", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The ID of the custom field." + }, + "accepted_as": "path", + "required": true, + "deprecated": false, + "default": null, + "documentation_urls": [] + }, + { + "name": "requestBody", + "tool_parameter_name": "custom_field_update_data", + "description": "", + "value_schema": { + "val_type": "json", + "inner_val_type": null, + "enum": null, + "properties": { + "default_value": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The default value for single-valued custom fields." + }, + "default_values": { + "val_type": "array", + "inner_val_type": "string", + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The default values for multi-valued custom fields." + }, + "description": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The description of the custom field." + }, + "label": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The label of the custom field." + }, + "select_options": { + "val_type": "array", + "inner_val_type": "json", + "enum": null, + "properties": null, + "inner_properties": { + "label": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The label of the option." + }, + "slug": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The slug of the option." + } + }, + "description": "The list options of the select custom field. This is only present for select and multiselect custom fields." + }, + "slug": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The slug of the custom field." + } + }, + "inner_properties": null, + "description": "" + }, + "accepted_as": "body", + "required": false, + "deprecated": false, + "default": null, + "documentation_urls": [] + } + ], + "documentation_urls": [], + "secrets": [ + { + "arcade_key": "PYLON_SECRET_TOKEN", + "parameter_name": "Authorization", + "accepted_as": "header", + "formatted_value": "Bearer {authorization}", + "description": "", + "is_auth_token": false + } + ], + "request_body_spec": "{\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"properties\": {\n \"default_value\": {\n \"description\": \"The default value for single-valued custom fields.\",\n \"type\": \"string\",\n \"x-go-name\": \"DefaultValue\"\n },\n \"default_values\": {\n \"description\": \"The default values for multi-valued custom fields.\",\n \"items\": {\n \"type\": \"string\"\n },\n \"type\": \"array\",\n \"x-go-name\": \"DefaultValues\"\n },\n \"description\": {\n \"description\": \"The description of the custom field.\",\n \"type\": \"string\",\n \"x-go-name\": \"Description\"\n },\n \"label\": {\n \"description\": \"The label of the custom field.\",\n \"type\": \"string\",\n \"x-go-name\": \"Label\"\n },\n \"select_options\": {\n \"description\": \"The list options of the select custom field. This is only present for select and multiselect custom fields.\",\n \"items\": {\n \"properties\": {\n \"label\": {\n \"description\": \"The label of the option.\",\n \"type\": \"string\",\n \"x-go-name\": \"Label\"\n },\n \"slug\": {\n \"description\": \"The slug of the option.\",\n \"type\": \"string\",\n \"x-go-name\": \"Slug\"\n }\n },\n \"type\": \"object\",\n \"x-go-package\": \"pylon/api/apiserver/apitypes\"\n },\n \"type\": \"array\",\n \"x-go-name\": \"SelectOptions\"\n },\n \"slug\": {\n \"description\": \"The slug of the custom field.\",\n \"type\": \"string\",\n \"x-go-name\": \"Slug\"\n }\n },\n \"type\": \"object\",\n \"x-go-package\": \"pylon/api/apiserver/endpoints\"\n }\n }\n },\n \"required\": false\n}", + "use_request_body_schema_mode": true, + "validate_request_body_schema": true + } +} diff --git a/toolkits/pylon_api/pylon_api/wrapper_tools/UpdateExistingTag.json b/toolkits/pylon_api/pylon_api/wrapper_tools/UpdateExistingTag.json new file mode 100644 index 00000000..7b718760 --- /dev/null +++ b/toolkits/pylon_api/pylon_api/wrapper_tools/UpdateExistingTag.json @@ -0,0 +1,170 @@ +{ + "name": "UpdateExistingTag", + "fully_qualified_name": "PylonApi.UpdateExistingTag@0.1.0", + "description": "Update an existing tag's information.\n\nUse this tool to modify the details of an already existing tag. It should be called when changes to tag attributes are needed.", + "toolkit": { + "name": "PylonApi", + "description": null, + "version": "0.1.0" + }, + "input": { + "parameters": [ + { + "name": "tag_id", + "required": true, + "description": "The unique identifier of the tag that needs to be updated.", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The ID of the tag to update." + }, + "inferrable": true, + "http_endpoint_parameter_name": "id" + }, + { + "name": "tag_hex_color", + "required": false, + "description": "The hex code representing the tag's color. Must be a valid six-digit hexadecimal value prefixed with '#'.", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The hex code of the tag's color." + }, + "inferrable": true, + "http_endpoint_parameter_name": "hex_color" + }, + { + "name": "tag_name", + "required": false, + "description": "The new name for the tag to be updated.", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "in: body\n\nThe name of the tag." + }, + "inferrable": true, + "http_endpoint_parameter_name": "value" + } + ] + }, + "output": { + "description": "Response from the API endpoint 'UpdateTag'.", + "available_modes": [ + "value", + "error", + "null" + ], + "value_schema": { + "val_type": "json", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": null + } + }, + "requirements": { + "authorization": null, + "secrets": [ + { + "key": "PYLON_SECRET_TOKEN" + } + ], + "metadata": null + }, + "deprecation_message": null, + "metadata": { + "object_type": "api_wrapper_tool", + "version": "1.1.0", + "description": "Tools that enable LLMs to interact directly with the pylon API." + }, + "http_endpoint": { + "metadata": { + "object_type": "http_endpoint", + "version": "1.2.0", + "description": "" + }, + "url": "https://api.usepylon.com/tags/{id}", + "http_method": "PATCH", + "headers": {}, + "parameters": [ + { + "name": "id", + "tool_parameter_name": "tag_id", + "description": "The ID of the tag to update.", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The ID of the tag to update." + }, + "accepted_as": "path", + "required": true, + "deprecated": false, + "default": null, + "documentation_urls": [] + }, + { + "name": "hex_color", + "tool_parameter_name": "tag_hex_color", + "description": "The hex code of the tag's color.", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The hex code of the tag's color." + }, + "accepted_as": "body", + "required": false, + "deprecated": false, + "default": null, + "documentation_urls": [] + }, + { + "name": "value", + "tool_parameter_name": "tag_name", + "description": "in: body\n\nThe name of the tag.", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "in: body\n\nThe name of the tag." + }, + "accepted_as": "body", + "required": false, + "deprecated": false, + "default": null, + "documentation_urls": [] + } + ], + "documentation_urls": [], + "secrets": [ + { + "arcade_key": "PYLON_SECRET_TOKEN", + "parameter_name": "Authorization", + "accepted_as": "header", + "formatted_value": "Bearer {authorization}", + "description": "", + "is_auth_token": false + } + ], + "request_body_spec": "{\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"properties\": {\n \"hex_color\": {\n \"description\": \"The hex code of the tag's color.\",\n \"type\": \"string\",\n \"x-go-name\": \"HexColor\"\n },\n \"value\": {\n \"description\": \"in: body\\n\\nThe name of the tag.\",\n \"type\": \"string\",\n \"x-go-name\": \"Value\"\n }\n },\n \"type\": \"object\",\n \"x-go-package\": \"pylon/api/apiserver/endpoints\"\n }\n }\n },\n \"required\": false\n}", + "use_request_body_schema_mode": false, + "validate_request_body_schema": false + } +} diff --git a/toolkits/pylon_api/pylon_api/wrapper_tools/UpdateExistingTeam.json b/toolkits/pylon_api/pylon_api/wrapper_tools/UpdateExistingTeam.json new file mode 100644 index 00000000..39d4e760 --- /dev/null +++ b/toolkits/pylon_api/pylon_api/wrapper_tools/UpdateExistingTeam.json @@ -0,0 +1,170 @@ +{ + "name": "UpdateExistingTeam", + "fully_qualified_name": "PylonApi.UpdateExistingTeam@0.1.0", + "description": "Update details of an existing team.\n\nUse this tool to modify the information of an existing team. Ideal for updating team names, members, or other details.", + "toolkit": { + "name": "PylonApi", + "description": null, + "version": "0.1.0" + }, + "input": { + "parameters": [ + { + "name": "team_id", + "required": true, + "description": "The ID of the team to update.", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The ID of the team to update." + }, + "inferrable": true, + "http_endpoint_parameter_name": "id" + }, + { + "name": "team_name", + "required": false, + "description": "The new name for the team to be updated.", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The name of the team." + }, + "inferrable": true, + "http_endpoint_parameter_name": "name" + }, + { + "name": "team_member_user_ids", + "required": false, + "description": "The list of user IDs to set as team members. This updates the team to include only these users.", + "value_schema": { + "val_type": "array", + "inner_val_type": "string", + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The list of user IDs to add to the team. If provided, the team members will be updated to be exactly the given users." + }, + "inferrable": true, + "http_endpoint_parameter_name": "user_ids" + } + ] + }, + "output": { + "description": "Response from the API endpoint 'UpdateTeam'.", + "available_modes": [ + "value", + "error", + "null" + ], + "value_schema": { + "val_type": "json", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": null + } + }, + "requirements": { + "authorization": null, + "secrets": [ + { + "key": "PYLON_SECRET_TOKEN" + } + ], + "metadata": null + }, + "deprecation_message": null, + "metadata": { + "object_type": "api_wrapper_tool", + "version": "1.1.0", + "description": "Tools that enable LLMs to interact directly with the pylon API." + }, + "http_endpoint": { + "metadata": { + "object_type": "http_endpoint", + "version": "1.2.0", + "description": "" + }, + "url": "https://api.usepylon.com/teams/{id}", + "http_method": "PATCH", + "headers": {}, + "parameters": [ + { + "name": "id", + "tool_parameter_name": "team_id", + "description": "The ID of the team to update.", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The ID of the team to update." + }, + "accepted_as": "path", + "required": true, + "deprecated": false, + "default": null, + "documentation_urls": [] + }, + { + "name": "name", + "tool_parameter_name": "team_name", + "description": "The name of the team.", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The name of the team." + }, + "accepted_as": "body", + "required": false, + "deprecated": false, + "default": null, + "documentation_urls": [] + }, + { + "name": "user_ids", + "tool_parameter_name": "team_member_user_ids", + "description": "The list of user IDs to add to the team. If provided, the team members will be updated to be exactly the given users.", + "value_schema": { + "val_type": "array", + "inner_val_type": "string", + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The list of user IDs to add to the team. If provided, the team members will be updated to be exactly the given users." + }, + "accepted_as": "body", + "required": false, + "deprecated": false, + "default": null, + "documentation_urls": [] + } + ], + "documentation_urls": [], + "secrets": [ + { + "arcade_key": "PYLON_SECRET_TOKEN", + "parameter_name": "Authorization", + "accepted_as": "header", + "formatted_value": "Bearer {authorization}", + "description": "", + "is_auth_token": false + } + ], + "request_body_spec": "{\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"properties\": {\n \"name\": {\n \"description\": \"The name of the team.\",\n \"type\": \"string\",\n \"x-go-name\": \"Name\"\n },\n \"user_ids\": {\n \"description\": \"The list of user IDs to add to the team. If provided, the team members will be updated to be exactly the given users.\",\n \"items\": {\n \"type\": \"string\"\n },\n \"type\": \"array\",\n \"x-go-name\": \"UserIDs\"\n }\n },\n \"type\": \"object\",\n \"x-go-package\": \"pylon/api/apiserver/endpoints\"\n }\n }\n },\n \"required\": false\n}", + "use_request_body_schema_mode": false, + "validate_request_body_schema": false + } +} diff --git a/toolkits/pylon_api/pylon_api/wrapper_tools/UpdateIssue.json b/toolkits/pylon_api/pylon_api/wrapper_tools/UpdateIssue.json new file mode 100644 index 00000000..f2ff2d9c --- /dev/null +++ b/toolkits/pylon_api/pylon_api/wrapper_tools/UpdateIssue.json @@ -0,0 +1,333 @@ +{ + "name": "UpdateIssue", + "fully_qualified_name": "PylonApi.UpdateIssue@0.1.0", + "description": "Update details of an existing issue.\n\nUse this tool to modify information for an already existing issue when changes or corrections are needed.", + "toolkit": { + "name": "PylonApi", + "description": null, + "version": "0.1.0" + }, + "input": { + "parameters": [ + { + "name": "issue_id", + "required": true, + "description": "The ID of the issue to update. This should be a string representing the unique identifier for the issue.", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The ID of the issue to update." + }, + "inferrable": true, + "http_endpoint_parameter_name": "id" + }, + { + "name": "issue_update_details", + "required": false, + "description": "JSON object containing details to update an issue such as account_id, assignee_id, custom_fields, customer_portal_visible, requester_id, state, tags, and team_id.", + "value_schema": { + "val_type": "json", + "inner_val_type": null, + "enum": null, + "properties": { + "account_id": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The ID of the account that this issue belongs to. Only supported on issues with source: [\"manual\", \"form\", \"email\"]." + }, + "assignee_id": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The ID of the user who should be assigned to this issue. If empty string is passed in, the issue assignee will be removed." + }, + "custom_fields": { + "val_type": "array", + "inner_val_type": "json", + "enum": null, + "properties": null, + "inner_properties": { + "slug": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The slug of the custom field." + }, + "value": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The value of the custom field. Only to be used for single-valued custom fields. If unset, the custom field will be unset. If the custom field is a select field, the value must be the select option slug, which you can find from the GET /custom-fields endpoint." + }, + "values": { + "val_type": "array", + "inner_val_type": "string", + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The values of the custom field. Only to be used for multi-valued custom fields (ex. multiselect). If unset, the custom field will be unset. If the custom field is a multiselect field, the values must be the select option slugs which you can find from the GET /custom-fields endpoint." + } + }, + "description": "An array of custom fields to be used on this issue. Only passed in fields will be modified." + }, + "customer_portal_visible": { + "val_type": "boolean", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "Whether the issue should be visible in the customer portal." + }, + "requester_id": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The ID of the requester that this issue is on behalf of." + }, + "requestor_id": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "Deprecated: Use requester_id instead." + }, + "state": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The state this issue should be moved to. Can be one of new, waiting_on_you, waiting_on_customer, on_hold, closed, or a custom status." + }, + "tags": { + "val_type": "array", + "inner_val_type": "string", + "enum": null, + "properties": null, + "inner_properties": null, + "description": "An array of strings to use as tags on this issue. If provided, the issue tags will be updated to be exactly the given tags." + }, + "team_id": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The ID of the team this issue should be assigned to. If empty string is passed in, any assigned team will be removed." + } + }, + "inner_properties": null, + "description": "" + }, + "inferrable": true, + "http_endpoint_parameter_name": "requestBody" + } + ] + }, + "output": { + "description": "Response from the API endpoint 'UpdateIssue'.", + "available_modes": [ + "value", + "error", + "null" + ], + "value_schema": { + "val_type": "json", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": null + } + }, + "requirements": { + "authorization": null, + "secrets": [ + { + "key": "PYLON_SECRET_TOKEN" + } + ], + "metadata": null + }, + "deprecation_message": null, + "metadata": { + "object_type": "api_wrapper_tool", + "version": "1.1.0", + "description": "Tools that enable LLMs to interact directly with the pylon API." + }, + "http_endpoint": { + "metadata": { + "object_type": "http_endpoint", + "version": "1.2.0", + "description": "" + }, + "url": "https://api.usepylon.com/issues/{id}", + "http_method": "PATCH", + "headers": {}, + "parameters": [ + { + "name": "id", + "tool_parameter_name": "issue_id", + "description": "The ID of the issue to update.", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The ID of the issue to update." + }, + "accepted_as": "path", + "required": true, + "deprecated": false, + "default": null, + "documentation_urls": [] + }, + { + "name": "requestBody", + "tool_parameter_name": "issue_update_details", + "description": "", + "value_schema": { + "val_type": "json", + "inner_val_type": null, + "enum": null, + "properties": { + "account_id": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The ID of the account that this issue belongs to. Only supported on issues with source: [\"manual\", \"form\", \"email\"]." + }, + "assignee_id": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The ID of the user who should be assigned to this issue. If empty string is passed in, the issue assignee will be removed." + }, + "custom_fields": { + "val_type": "array", + "inner_val_type": "json", + "enum": null, + "properties": null, + "inner_properties": { + "slug": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The slug of the custom field." + }, + "value": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The value of the custom field. Only to be used for single-valued custom fields. If unset, the custom field will be unset. If the custom field is a select field, the value must be the select option slug, which you can find from the GET /custom-fields endpoint." + }, + "values": { + "val_type": "array", + "inner_val_type": "string", + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The values of the custom field. Only to be used for multi-valued custom fields (ex. multiselect). If unset, the custom field will be unset. If the custom field is a multiselect field, the values must be the select option slugs which you can find from the GET /custom-fields endpoint." + } + }, + "description": "An array of custom fields to be used on this issue. Only passed in fields will be modified." + }, + "customer_portal_visible": { + "val_type": "boolean", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "Whether the issue should be visible in the customer portal." + }, + "requester_id": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The ID of the requester that this issue is on behalf of." + }, + "requestor_id": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "Deprecated: Use requester_id instead." + }, + "state": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The state this issue should be moved to. Can be one of new, waiting_on_you, waiting_on_customer, on_hold, closed, or a custom status." + }, + "tags": { + "val_type": "array", + "inner_val_type": "string", + "enum": null, + "properties": null, + "inner_properties": null, + "description": "An array of strings to use as tags on this issue. If provided, the issue tags will be updated to be exactly the given tags." + }, + "team_id": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The ID of the team this issue should be assigned to. If empty string is passed in, any assigned team will be removed." + } + }, + "inner_properties": null, + "description": "" + }, + "accepted_as": "body", + "required": false, + "deprecated": false, + "default": null, + "documentation_urls": [] + } + ], + "documentation_urls": [], + "secrets": [ + { + "arcade_key": "PYLON_SECRET_TOKEN", + "parameter_name": "Authorization", + "accepted_as": "header", + "formatted_value": "Bearer {authorization}", + "description": "", + "is_auth_token": false + } + ], + "request_body_spec": "{\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"properties\": {\n \"account_id\": {\n \"description\": \"The ID of the account that this issue belongs to. Only supported on issues with source: [\\\"manual\\\", \\\"form\\\", \\\"email\\\"].\",\n \"type\": \"string\",\n \"x-go-name\": \"AccountID\"\n },\n \"assignee_id\": {\n \"description\": \"The ID of the user who should be assigned to this issue. If empty string is passed in, the issue assignee will be removed.\",\n \"type\": \"string\",\n \"x-go-name\": \"AssigneeID\"\n },\n \"custom_fields\": {\n \"description\": \"An array of custom fields to be used on this issue. Only passed in fields will be modified.\",\n \"items\": {\n \"properties\": {\n \"slug\": {\n \"description\": \"The slug of the custom field.\",\n \"type\": \"string\",\n \"x-go-name\": \"Slug\"\n },\n \"value\": {\n \"description\": \"The value of the custom field. Only to be used for single-valued custom fields. If unset, the custom field will be unset. If the custom field is a select field, the value must be the select option slug, which you can find from the GET /custom-fields endpoint.\",\n \"type\": \"string\",\n \"x-go-name\": \"Value\"\n },\n \"values\": {\n \"description\": \"The values of the custom field. Only to be used for multi-valued custom fields (ex. multiselect). If unset, the custom field will be unset. If the custom field is a multiselect field, the values must be the select option slugs which you can find from the GET /custom-fields endpoint.\",\n \"items\": {\n \"type\": \"string\"\n },\n \"type\": \"array\",\n \"x-go-name\": \"Values\"\n }\n },\n \"type\": \"object\",\n \"x-go-package\": \"pylon/api/apiserver/apitypes\"\n },\n \"type\": \"array\",\n \"x-go-name\": \"CustomFields\"\n },\n \"customer_portal_visible\": {\n \"description\": \"Whether the issue should be visible in the customer portal.\",\n \"type\": \"boolean\",\n \"x-go-name\": \"CustomerPortalVisible\"\n },\n \"requester_id\": {\n \"description\": \"The ID of the requester that this issue is on behalf of.\",\n \"type\": \"string\",\n \"x-go-name\": \"RequesterID\"\n },\n \"requestor_id\": {\n \"description\": \"Deprecated: Use requester_id instead.\",\n \"type\": \"string\",\n \"x-go-name\": \"RequestorID\"\n },\n \"state\": {\n \"description\": \"The state this issue should be moved to. Can be one of new, waiting_on_you, waiting_on_customer, on_hold, closed, or a custom status.\",\n \"type\": \"string\",\n \"x-go-name\": \"State\"\n },\n \"tags\": {\n \"description\": \"An array of strings to use as tags on this issue. If provided, the issue tags will be updated to be exactly the given tags.\",\n \"items\": {\n \"type\": \"string\"\n },\n \"type\": \"array\",\n \"x-go-name\": \"Tags\"\n },\n \"team_id\": {\n \"description\": \"The ID of the team this issue should be assigned to. If empty string is passed in, any assigned team will be removed.\",\n \"type\": \"string\",\n \"x-go-name\": \"TeamID\"\n }\n },\n \"type\": \"object\",\n \"x-go-package\": \"pylon/api/apiserver/endpoints\"\n }\n }\n },\n \"required\": false\n}", + "use_request_body_schema_mode": true, + "validate_request_body_schema": true + } +} diff --git a/toolkits/pylon_api/pylon_api/wrapper_tools/UpdateIssueFollowers.json b/toolkits/pylon_api/pylon_api/wrapper_tools/UpdateIssueFollowers.json new file mode 100644 index 00000000..07f5574d --- /dev/null +++ b/toolkits/pylon_api/pylon_api/wrapper_tools/UpdateIssueFollowers.json @@ -0,0 +1,203 @@ +{ + "name": "UpdateIssueFollowers", + "fully_qualified_name": "PylonApi.UpdateIssueFollowers@0.1.0", + "description": "Add or remove followers for an issue.\n\nThis tool allows you to add or remove followers to a specific issue. Use it when managing the users who should receive notifications about updates on an issue. Set the operation field to \"remove\" to remove followers.", + "toolkit": { + "name": "PylonApi", + "description": null, + "version": "0.1.0" + }, + "input": { + "parameters": [ + { + "name": "issue_id", + "required": true, + "description": "The ID or number of the issue to add or remove followers from.", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The ID or number of the issue to add followers to." + }, + "inferrable": true, + "http_endpoint_parameter_name": "id" + }, + { + "name": "contact_ids_to_add", + "required": false, + "description": "An array of contact IDs to add as followers to the issue. Each ID should be a string.", + "value_schema": { + "val_type": "array", + "inner_val_type": "string", + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The IDs of contacts to add as followers." + }, + "inferrable": true, + "http_endpoint_parameter_name": "contact_ids" + }, + { + "name": "update_operation", + "required": false, + "description": "Specify 'add' to add followers or 'remove' to remove them.", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "Operation to perform. Use \"add\" to add followers (default) or \"remove\" to remove followers." + }, + "inferrable": true, + "http_endpoint_parameter_name": "operation" + }, + { + "name": "user_ids_to_add_as_followers", + "required": false, + "description": "List of user IDs to add as followers to a specific issue.", + "value_schema": { + "val_type": "array", + "inner_val_type": "string", + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The IDs of users to add as followers." + }, + "inferrable": true, + "http_endpoint_parameter_name": "user_ids" + } + ] + }, + "output": { + "description": "Response from the API endpoint 'AddIssueFollowers'.", + "available_modes": [ + "value", + "error", + "null" + ], + "value_schema": { + "val_type": "json", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": null + } + }, + "requirements": { + "authorization": null, + "secrets": [ + { + "key": "PYLON_SECRET_TOKEN" + } + ], + "metadata": null + }, + "deprecation_message": null, + "metadata": { + "object_type": "api_wrapper_tool", + "version": "1.1.0", + "description": "Tools that enable LLMs to interact directly with the pylon API." + }, + "http_endpoint": { + "metadata": { + "object_type": "http_endpoint", + "version": "1.2.0", + "description": "" + }, + "url": "https://api.usepylon.com/issues/{id}/followers", + "http_method": "POST", + "headers": {}, + "parameters": [ + { + "name": "id", + "tool_parameter_name": "issue_id", + "description": "The ID or number of the issue to add followers to.", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The ID or number of the issue to add followers to." + }, + "accepted_as": "path", + "required": true, + "deprecated": false, + "default": null, + "documentation_urls": [] + }, + { + "name": "contact_ids", + "tool_parameter_name": "contact_ids_to_add", + "description": "The IDs of contacts to add as followers.", + "value_schema": { + "val_type": "array", + "inner_val_type": "string", + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The IDs of contacts to add as followers." + }, + "accepted_as": "body", + "required": false, + "deprecated": false, + "default": null, + "documentation_urls": [] + }, + { + "name": "operation", + "tool_parameter_name": "update_operation", + "description": "Operation to perform. Use \"add\" to add followers (default) or \"remove\" to remove followers.", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "Operation to perform. Use \"add\" to add followers (default) or \"remove\" to remove followers." + }, + "accepted_as": "body", + "required": false, + "deprecated": false, + "default": null, + "documentation_urls": [] + }, + { + "name": "user_ids", + "tool_parameter_name": "user_ids_to_add_as_followers", + "description": "The IDs of users to add as followers.", + "value_schema": { + "val_type": "array", + "inner_val_type": "string", + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The IDs of users to add as followers." + }, + "accepted_as": "body", + "required": false, + "deprecated": false, + "default": null, + "documentation_urls": [] + } + ], + "documentation_urls": [], + "secrets": [ + { + "arcade_key": "PYLON_SECRET_TOKEN", + "parameter_name": "Authorization", + "accepted_as": "header", + "formatted_value": "Bearer {authorization}", + "description": "", + "is_auth_token": false + } + ], + "request_body_spec": "{\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"properties\": {\n \"contact_ids\": {\n \"description\": \"The IDs of contacts to add as followers.\",\n \"items\": {\n \"type\": \"string\"\n },\n \"type\": \"array\",\n \"x-go-name\": \"ContactIDs\"\n },\n \"operation\": {\n \"description\": \"Operation to perform. Use \\\"add\\\" to add followers (default) or \\\"remove\\\" to remove followers.\",\n \"type\": \"string\",\n \"x-go-name\": \"Operation\"\n },\n \"user_ids\": {\n \"description\": \"The IDs of users to add as followers.\",\n \"items\": {\n \"type\": \"string\"\n },\n \"type\": \"array\",\n \"x-go-name\": \"UserIDs\"\n }\n },\n \"type\": \"object\",\n \"x-go-package\": \"pylon/api/apiserver/endpoints\"\n }\n }\n },\n \"required\": false\n}", + "use_request_body_schema_mode": false, + "validate_request_body_schema": false + } +} diff --git a/toolkits/pylon_api/pylon_api/wrapper_tools/UpdateMilestone.json b/toolkits/pylon_api/pylon_api/wrapper_tools/UpdateMilestone.json new file mode 100644 index 00000000..ce5bfdee --- /dev/null +++ b/toolkits/pylon_api/pylon_api/wrapper_tools/UpdateMilestone.json @@ -0,0 +1,170 @@ +{ + "name": "UpdateMilestone", + "fully_qualified_name": "PylonApi.UpdateMilestone@0.1.0", + "description": "Updates the details of a specific milestone.\n\nThis tool is used to update information for a specific milestone in a project, identified by its ID.", + "toolkit": { + "name": "PylonApi", + "description": null, + "version": "0.1.0" + }, + "input": { + "parameters": [ + { + "name": "milestone_id", + "required": true, + "description": "The unique ID of the milestone to update.", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The ID of the milestone to update." + }, + "inferrable": true, + "http_endpoint_parameter_name": "id" + }, + { + "name": "milestone_due_date", + "required": false, + "description": "The due date for the milestone in RFC 3339 format (e.g., 2023-10-21T00:00:00Z).", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "Due date for this milestone, in RFC 3339 format" + }, + "inferrable": true, + "http_endpoint_parameter_name": "due_date" + }, + { + "name": "milestone_name", + "required": false, + "description": "The new name for the milestone you want to update.", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "Name for this milestone" + }, + "inferrable": true, + "http_endpoint_parameter_name": "name" + } + ] + }, + "output": { + "description": "Response from the API endpoint 'UpdateMilestone'.", + "available_modes": [ + "value", + "error", + "null" + ], + "value_schema": { + "val_type": "json", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": null + } + }, + "requirements": { + "authorization": null, + "secrets": [ + { + "key": "PYLON_SECRET_TOKEN" + } + ], + "metadata": null + }, + "deprecation_message": null, + "metadata": { + "object_type": "api_wrapper_tool", + "version": "1.1.0", + "description": "Tools that enable LLMs to interact directly with the pylon API." + }, + "http_endpoint": { + "metadata": { + "object_type": "http_endpoint", + "version": "1.2.0", + "description": "" + }, + "url": "https://api.usepylon.com/milestones/{id}", + "http_method": "PATCH", + "headers": {}, + "parameters": [ + { + "name": "id", + "tool_parameter_name": "milestone_id", + "description": "The ID of the milestone to update.", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The ID of the milestone to update." + }, + "accepted_as": "path", + "required": true, + "deprecated": false, + "default": null, + "documentation_urls": [] + }, + { + "name": "due_date", + "tool_parameter_name": "milestone_due_date", + "description": "Due date for this milestone, in RFC 3339 format", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "Due date for this milestone, in RFC 3339 format" + }, + "accepted_as": "body", + "required": false, + "deprecated": false, + "default": null, + "documentation_urls": [] + }, + { + "name": "name", + "tool_parameter_name": "milestone_name", + "description": "Name for this milestone", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "Name for this milestone" + }, + "accepted_as": "body", + "required": false, + "deprecated": false, + "default": null, + "documentation_urls": [] + } + ], + "documentation_urls": [], + "secrets": [ + { + "arcade_key": "PYLON_SECRET_TOKEN", + "parameter_name": "Authorization", + "accepted_as": "header", + "formatted_value": "Bearer {authorization}", + "description": "", + "is_auth_token": false + } + ], + "request_body_spec": "{\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"properties\": {\n \"due_date\": {\n \"description\": \"Due date for this milestone, in RFC 3339 format\",\n \"type\": \"string\",\n \"x-go-name\": \"DueDate\"\n },\n \"name\": {\n \"description\": \"Name for this milestone\",\n \"type\": \"string\",\n \"x-go-name\": \"Name\"\n }\n },\n \"type\": \"object\",\n \"x-go-package\": \"pylon/api/apiserver/endpoints\"\n }\n }\n },\n \"required\": false\n}", + "use_request_body_schema_mode": false, + "validate_request_body_schema": false + } +} diff --git a/toolkits/pylon_api/pylon_api/wrapper_tools/UpdateMultipleAccounts.json b/toolkits/pylon_api/pylon_api/wrapper_tools/UpdateMultipleAccounts.json new file mode 100644 index 00000000..7bc543fb --- /dev/null +++ b/toolkits/pylon_api/pylon_api/wrapper_tools/UpdateMultipleAccounts.json @@ -0,0 +1,236 @@ +{ + "name": "UpdateMultipleAccounts", + "fully_qualified_name": "PylonApi.UpdateMultipleAccounts@0.1.0", + "description": "Update multiple accounts simultaneously.\n\nUse this tool to update details for multiple accounts in one request. It is helpful for batch processing of account modifications.", + "toolkit": { + "name": "PylonApi", + "description": null, + "version": "0.1.0" + }, + "input": { + "parameters": [ + { + "name": "update_accounts_request_body", + "required": false, + "description": "JSON object containing account IDs, custom fields, owner ID, tags, and tags apply mode for updating multiple accounts.", + "value_schema": { + "val_type": "json", + "inner_val_type": null, + "enum": null, + "properties": { + "account_ids": { + "val_type": "array", + "inner_val_type": "string", + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The account IDs to update. The number of accounts to update must be between 1 and 100." + }, + "custom_fields": { + "val_type": "array", + "inner_val_type": "json", + "enum": null, + "properties": null, + "inner_properties": { + "slug": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The slug of the custom field." + }, + "value": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The value of the custom field. Only to be used for single-valued custom fields. If unset, the custom field will be unset. If the custom field is a select field, the value must be the select option slug, which you can find from the GET /custom-fields endpoint." + }, + "values": { + "val_type": "array", + "inner_val_type": "string", + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The values of the custom field. Only to be used for multi-valued custom fields (ex. multiselect). If unset, the custom field will be unset. If the custom field is a multiselect field, the values must be the select option slugs which you can find from the GET /custom-fields endpoint." + } + }, + "description": "An array of custom fields to be updated on the accounts." + }, + "owner_id": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The ID of the new owner. If empty string is passed in, the owner will be removed." + }, + "tags": { + "val_type": "array", + "inner_val_type": "string", + "enum": null, + "properties": null, + "inner_properties": null, + "description": "An array of tags to be updated on the accounts." + }, + "tags_apply_mode": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The mode for applying tags. Valid values: \"append_only\", \"remove_only\", \"replace\". Defaults to \"replace\"." + } + }, + "inner_properties": null, + "description": "" + }, + "inferrable": true, + "http_endpoint_parameter_name": "requestBody" + } + ] + }, + "output": { + "description": "Response from the API endpoint 'UpdateAccounts'.", + "available_modes": [ + "value", + "error", + "null" + ], + "value_schema": { + "val_type": "json", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": null + } + }, + "requirements": { + "authorization": null, + "secrets": [ + { + "key": "PYLON_SECRET_TOKEN" + } + ], + "metadata": null + }, + "deprecation_message": null, + "metadata": { + "object_type": "api_wrapper_tool", + "version": "1.1.0", + "description": "Tools that enable LLMs to interact directly with the pylon API." + }, + "http_endpoint": { + "metadata": { + "object_type": "http_endpoint", + "version": "1.2.0", + "description": "" + }, + "url": "https://api.usepylon.com/accounts", + "http_method": "PATCH", + "headers": {}, + "parameters": [ + { + "name": "requestBody", + "tool_parameter_name": "update_accounts_request_body", + "description": "", + "value_schema": { + "val_type": "json", + "inner_val_type": null, + "enum": null, + "properties": { + "account_ids": { + "val_type": "array", + "inner_val_type": "string", + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The account IDs to update. The number of accounts to update must be between 1 and 100." + }, + "custom_fields": { + "val_type": "array", + "inner_val_type": "json", + "enum": null, + "properties": null, + "inner_properties": { + "slug": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The slug of the custom field." + }, + "value": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The value of the custom field. Only to be used for single-valued custom fields. If unset, the custom field will be unset. If the custom field is a select field, the value must be the select option slug, which you can find from the GET /custom-fields endpoint." + }, + "values": { + "val_type": "array", + "inner_val_type": "string", + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The values of the custom field. Only to be used for multi-valued custom fields (ex. multiselect). If unset, the custom field will be unset. If the custom field is a multiselect field, the values must be the select option slugs which you can find from the GET /custom-fields endpoint." + } + }, + "description": "An array of custom fields to be updated on the accounts." + }, + "owner_id": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The ID of the new owner. If empty string is passed in, the owner will be removed." + }, + "tags": { + "val_type": "array", + "inner_val_type": "string", + "enum": null, + "properties": null, + "inner_properties": null, + "description": "An array of tags to be updated on the accounts." + }, + "tags_apply_mode": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The mode for applying tags. Valid values: \"append_only\", \"remove_only\", \"replace\". Defaults to \"replace\"." + } + }, + "inner_properties": null, + "description": "" + }, + "accepted_as": "body", + "required": false, + "deprecated": false, + "default": null, + "documentation_urls": [] + } + ], + "documentation_urls": [], + "secrets": [ + { + "arcade_key": "PYLON_SECRET_TOKEN", + "parameter_name": "Authorization", + "accepted_as": "header", + "formatted_value": "Bearer {authorization}", + "description": "", + "is_auth_token": false + } + ], + "request_body_spec": "{\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"properties\": {\n \"account_ids\": {\n \"description\": \"The account IDs to update. The number of accounts to update must be between 1 and 100.\",\n \"items\": {\n \"type\": \"string\"\n },\n \"type\": \"array\",\n \"x-go-name\": \"AccountIDs\"\n },\n \"custom_fields\": {\n \"description\": \"An array of custom fields to be updated on the accounts.\",\n \"items\": {\n \"properties\": {\n \"slug\": {\n \"description\": \"The slug of the custom field.\",\n \"type\": \"string\",\n \"x-go-name\": \"Slug\"\n },\n \"value\": {\n \"description\": \"The value of the custom field. Only to be used for single-valued custom fields. If unset, the custom field will be unset. If the custom field is a select field, the value must be the select option slug, which you can find from the GET /custom-fields endpoint.\",\n \"type\": \"string\",\n \"x-go-name\": \"Value\"\n },\n \"values\": {\n \"description\": \"The values of the custom field. Only to be used for multi-valued custom fields (ex. multiselect). If unset, the custom field will be unset. If the custom field is a multiselect field, the values must be the select option slugs which you can find from the GET /custom-fields endpoint.\",\n \"items\": {\n \"type\": \"string\"\n },\n \"type\": \"array\",\n \"x-go-name\": \"Values\"\n }\n },\n \"type\": \"object\",\n \"x-go-package\": \"pylon/api/apiserver/apitypes\"\n },\n \"type\": \"array\",\n \"x-go-name\": \"CustomFields\"\n },\n \"owner_id\": {\n \"description\": \"The ID of the new owner. If empty string is passed in, the owner will be removed.\",\n \"type\": \"string\",\n \"x-go-name\": \"OwnerID\"\n },\n \"tags\": {\n \"description\": \"An array of tags to be updated on the accounts.\",\n \"items\": {\n \"type\": \"string\"\n },\n \"type\": \"array\",\n \"x-go-name\": \"Tags\"\n },\n \"tags_apply_mode\": {\n \"description\": \"The mode for applying tags. Valid values: \\\"append_only\\\", \\\"remove_only\\\", \\\"replace\\\". Defaults to \\\"replace\\\".\",\n \"type\": \"string\",\n \"x-go-name\": \"TagsApplyMode\"\n }\n },\n \"required\": [\n \"account_ids\"\n ],\n \"type\": \"object\",\n \"x-go-package\": \"pylon/api/apiserver/endpoints\"\n }\n }\n },\n \"required\": false\n}", + "use_request_body_schema_mode": true, + "validate_request_body_schema": true + } +} diff --git a/toolkits/pylon_api/pylon_api/wrapper_tools/UpdateProject.json b/toolkits/pylon_api/pylon_api/wrapper_tools/UpdateProject.json new file mode 100644 index 00000000..d625e7f7 --- /dev/null +++ b/toolkits/pylon_api/pylon_api/wrapper_tools/UpdateProject.json @@ -0,0 +1,482 @@ +{ + "name": "UpdateProject", + "fully_qualified_name": "PylonApi.UpdateProject@0.1.0", + "description": "Update the details of an existing project.\n\nUse this tool to modify the information of an existing project by providing the project ID and necessary updates.", + "toolkit": { + "name": "PylonApi", + "description": null, + "version": "0.1.0" + }, + "input": { + "parameters": [ + { + "name": "project_id", + "required": true, + "description": "The unique identifier of the project to update.", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The ID of the project to update." + }, + "inferrable": true, + "http_endpoint_parameter_name": "id" + }, + { + "name": "project_name", + "required": false, + "description": "The new name for this project. Provide a descriptive title to identify the project.", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "Name for this project" + }, + "inferrable": true, + "http_endpoint_parameter_name": "name" + }, + { + "name": "project_description_html", + "required": false, + "description": "HTML formatted description for the project.", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "Description HTML for this project" + }, + "inferrable": true, + "http_endpoint_parameter_name": "description_html" + }, + { + "name": "start_date_rfc3339", + "required": false, + "description": "The start date for the project, formatted in RFC 3339. This specifies when the project begins.", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "Start date for this project, in RFC 3339 format" + }, + "inferrable": true, + "http_endpoint_parameter_name": "start_date" + }, + { + "name": "project_end_date", + "required": false, + "description": "The end date for the project in RFC 3339 format.", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "End date for this project, in RFC 3339 format" + }, + "inferrable": true, + "http_endpoint_parameter_name": "end_date" + }, + { + "name": "project_owner_id", + "required": false, + "description": "The unique identifier of the owner of this project. Required to assign an owner when updating a project.", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "Owner ID for this project" + }, + "inferrable": true, + "http_endpoint_parameter_name": "owner_id" + }, + { + "name": "project_update_details", + "required": false, + "description": "A JSON object containing the project's update details such as name, description, visibility, dates, owner ID, and archive status.", + "value_schema": { + "val_type": "json", + "inner_val_type": null, + "enum": null, + "properties": { + "customer_portal_visible": { + "val_type": "boolean", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "Customer portal visible for this project" + }, + "description_html": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "Description HTML for this project" + }, + "end_date": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "End date for this project, in RFC 3339 format" + }, + "is_archived": { + "val_type": "boolean", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "Whether the project is archived" + }, + "name": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "Name for this project" + }, + "owner_id": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "Owner ID for this project" + }, + "start_date": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "Start date for this project, in RFC 3339 format" + } + }, + "inner_properties": null, + "description": "" + }, + "inferrable": true, + "http_endpoint_parameter_name": "requestBody" + }, + { + "name": "is_customer_portal_visible", + "required": false, + "description": "Indicate if the project should be visible in the customer portal (true for visible, false for hidden).", + "value_schema": { + "val_type": "boolean", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "Customer portal visible for this project" + }, + "inferrable": true, + "http_endpoint_parameter_name": "customer_portal_visible" + }, + { + "name": "is_project_archived", + "required": false, + "description": "Set to True if the project is archived, False if it is active.", + "value_schema": { + "val_type": "boolean", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "Whether the project is archived" + }, + "inferrable": true, + "http_endpoint_parameter_name": "is_archived" + } + ] + }, + "output": { + "description": "Response from the API endpoint 'UpdateProject'.", + "available_modes": [ + "value", + "error", + "null" + ], + "value_schema": { + "val_type": "json", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": null + } + }, + "requirements": { + "authorization": null, + "secrets": [ + { + "key": "PYLON_SECRET_TOKEN" + } + ], + "metadata": null + }, + "deprecation_message": null, + "metadata": { + "object_type": "api_wrapper_tool", + "version": "1.1.0", + "description": "Tools that enable LLMs to interact directly with the pylon API." + }, + "http_endpoint": { + "metadata": { + "object_type": "http_endpoint", + "version": "1.2.0", + "description": "" + }, + "url": "https://api.usepylon.com/projects/{id}", + "http_method": "PATCH", + "headers": {}, + "parameters": [ + { + "name": "name", + "tool_parameter_name": "project_name", + "description": "Name for this project", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "Name for this project" + }, + "accepted_as": "query", + "required": false, + "deprecated": false, + "default": null, + "documentation_urls": [] + }, + { + "name": "description_html", + "tool_parameter_name": "project_description_html", + "description": "Description HTML for this project", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "Description HTML for this project" + }, + "accepted_as": "query", + "required": false, + "deprecated": false, + "default": null, + "documentation_urls": [] + }, + { + "name": "customer_portal_visible", + "tool_parameter_name": "is_customer_portal_visible", + "description": "Customer portal visible for this project", + "value_schema": { + "val_type": "boolean", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "Customer portal visible for this project" + }, + "accepted_as": "query", + "required": false, + "deprecated": false, + "default": null, + "documentation_urls": [] + }, + { + "name": "start_date", + "tool_parameter_name": "start_date_rfc3339", + "description": "Start date for this project, in RFC 3339 format", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "Start date for this project, in RFC 3339 format" + }, + "accepted_as": "query", + "required": false, + "deprecated": false, + "default": null, + "documentation_urls": [] + }, + { + "name": "end_date", + "tool_parameter_name": "project_end_date", + "description": "End date for this project, in RFC 3339 format", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "End date for this project, in RFC 3339 format" + }, + "accepted_as": "query", + "required": false, + "deprecated": false, + "default": null, + "documentation_urls": [] + }, + { + "name": "owner_id", + "tool_parameter_name": "project_owner_id", + "description": "Owner ID for this project", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "Owner ID for this project" + }, + "accepted_as": "query", + "required": false, + "deprecated": false, + "default": null, + "documentation_urls": [] + }, + { + "name": "is_archived", + "tool_parameter_name": "is_project_archived", + "description": "Whether the project is archived", + "value_schema": { + "val_type": "boolean", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "Whether the project is archived" + }, + "accepted_as": "query", + "required": false, + "deprecated": false, + "default": null, + "documentation_urls": [] + }, + { + "name": "id", + "tool_parameter_name": "project_id", + "description": "The ID of the project to update.", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The ID of the project to update." + }, + "accepted_as": "path", + "required": true, + "deprecated": false, + "default": null, + "documentation_urls": [] + }, + { + "name": "requestBody", + "tool_parameter_name": "project_update_details", + "description": "", + "value_schema": { + "val_type": "json", + "inner_val_type": null, + "enum": null, + "properties": { + "customer_portal_visible": { + "val_type": "boolean", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "Customer portal visible for this project" + }, + "description_html": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "Description HTML for this project" + }, + "end_date": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "End date for this project, in RFC 3339 format" + }, + "is_archived": { + "val_type": "boolean", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "Whether the project is archived" + }, + "name": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "Name for this project" + }, + "owner_id": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "Owner ID for this project" + }, + "start_date": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "Start date for this project, in RFC 3339 format" + } + }, + "inner_properties": null, + "description": "" + }, + "accepted_as": "body", + "required": false, + "deprecated": false, + "default": null, + "documentation_urls": [] + } + ], + "documentation_urls": [], + "secrets": [ + { + "arcade_key": "PYLON_SECRET_TOKEN", + "parameter_name": "Authorization", + "accepted_as": "header", + "formatted_value": "Bearer {authorization}", + "description": "", + "is_auth_token": false + } + ], + "request_body_spec": "{\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"properties\": {\n \"customer_portal_visible\": {\n \"description\": \"Customer portal visible for this project\",\n \"type\": \"boolean\",\n \"x-go-name\": \"CustomerPortalVisible\"\n },\n \"description_html\": {\n \"description\": \"Description HTML for this project\",\n \"type\": \"string\",\n \"x-go-name\": \"DescriptionHTML\"\n },\n \"end_date\": {\n \"description\": \"End date for this project, in RFC 3339 format\",\n \"type\": \"string\",\n \"x-go-name\": \"EndDate\"\n },\n \"is_archived\": {\n \"description\": \"Whether the project is archived\",\n \"type\": \"boolean\",\n \"x-go-name\": \"IsArchived\"\n },\n \"name\": {\n \"description\": \"Name for this project\",\n \"type\": \"string\",\n \"x-go-name\": \"Name\"\n },\n \"owner_id\": {\n \"description\": \"Owner ID for this project\",\n \"type\": \"string\",\n \"x-go-name\": \"OwnerID\"\n },\n \"start_date\": {\n \"description\": \"Start date for this project, in RFC 3339 format\",\n \"type\": \"string\",\n \"x-go-name\": \"StartDate\"\n }\n },\n \"type\": \"object\",\n \"x-go-package\": \"pylon/api/apiserver/endpoints\"\n }\n }\n },\n \"required\": false\n}", + "use_request_body_schema_mode": true, + "validate_request_body_schema": true + } +} diff --git a/toolkits/pylon_api/pylon_api/wrapper_tools/UpdateTask.json b/toolkits/pylon_api/pylon_api/wrapper_tools/UpdateTask.json new file mode 100644 index 00000000..b9507993 --- /dev/null +++ b/toolkits/pylon_api/pylon_api/wrapper_tools/UpdateTask.json @@ -0,0 +1,376 @@ +{ + "name": "UpdateTask", + "fully_qualified_name": "PylonApi.UpdateTask@0.1.0", + "description": "Update the details of an existing task.\n\nUse this tool to modify the information of a specific task by providing its ID. Ideal for updating any details like status, description, or due date.", + "toolkit": { + "name": "PylonApi", + "description": null, + "version": "0.1.0" + }, + "input": { + "parameters": [ + { + "name": "task_id", + "required": true, + "description": "The unique ID of the task you want to update.", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The ID of the task to update." + }, + "inferrable": true, + "http_endpoint_parameter_name": "id" + }, + { + "name": "assignee_id", + "required": false, + "description": "The ID of the person assigned to this task. It should be a string representing a valid user ID within the system.", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "Assignee ID for this task" + }, + "inferrable": true, + "http_endpoint_parameter_name": "assignee_id" + }, + { + "name": "task_body_html", + "required": false, + "description": "HTML content for the task's body. This defines the main description or details of the task.", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "Body HTML for this task" + }, + "inferrable": true, + "http_endpoint_parameter_name": "body_html" + }, + { + "name": "task_due_date", + "required": false, + "description": "Due date for the task in RFC 3339 format, e.g., '2023-12-31T23:59:59Z'.", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "Due date for this task, in RFC 3339 format" + }, + "inferrable": true, + "http_endpoint_parameter_name": "due_date" + }, + { + "name": "milestone_identifier", + "required": false, + "description": "Specify the Milestone ID associated with the task to update its milestone.", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "Milestone ID for this task" + }, + "inferrable": true, + "http_endpoint_parameter_name": "milestone_id" + }, + { + "name": "project_id", + "required": false, + "description": "The unique identifier of the project associated with this task. Required to specify which project's task is being updated.", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "Project ID for this task" + }, + "inferrable": true, + "http_endpoint_parameter_name": "project_id" + }, + { + "name": "task_status", + "required": false, + "description": "Specify the task status: `not_started`, `in_progress`, or `completed`.", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": [ + "not_started", + "in_progress", + "completed" + ], + "properties": null, + "inner_properties": null, + "description": "Status for this task\n\n* not_started TaskStatusNotStarted\n\n* in_progress TaskStatusInProgress\n\n* completed TaskStatusCompleted" + }, + "inferrable": true, + "http_endpoint_parameter_name": "status" + }, + { + "name": "task_title", + "required": false, + "description": "The new title for the task. Provide a clear and concise title for better understanding.", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "Title for this task" + }, + "inferrable": true, + "http_endpoint_parameter_name": "title" + }, + { + "name": "customer_portal_visible", + "required": false, + "description": "Set to true to make the task visible on the customer portal. Accepts a boolean.", + "value_schema": { + "val_type": "boolean", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "Customer portal visible for this task" + }, + "inferrable": true, + "http_endpoint_parameter_name": "customer_portal_visible" + } + ] + }, + "output": { + "description": "Response from the API endpoint 'UpdateTask'.", + "available_modes": [ + "value", + "error", + "null" + ], + "value_schema": { + "val_type": "json", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": null + } + }, + "requirements": { + "authorization": null, + "secrets": [ + { + "key": "PYLON_SECRET_TOKEN" + } + ], + "metadata": null + }, + "deprecation_message": null, + "metadata": { + "object_type": "api_wrapper_tool", + "version": "1.1.0", + "description": "Tools that enable LLMs to interact directly with the pylon API." + }, + "http_endpoint": { + "metadata": { + "object_type": "http_endpoint", + "version": "1.2.0", + "description": "" + }, + "url": "https://api.usepylon.com/tasks/{id}", + "http_method": "PATCH", + "headers": {}, + "parameters": [ + { + "name": "id", + "tool_parameter_name": "task_id", + "description": "The ID of the task to update.", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The ID of the task to update." + }, + "accepted_as": "path", + "required": true, + "deprecated": false, + "default": null, + "documentation_urls": [] + }, + { + "name": "assignee_id", + "tool_parameter_name": "assignee_id", + "description": "Assignee ID for this task", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "Assignee ID for this task" + }, + "accepted_as": "body", + "required": false, + "deprecated": false, + "default": null, + "documentation_urls": [] + }, + { + "name": "body_html", + "tool_parameter_name": "task_body_html", + "description": "Body HTML for this task", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "Body HTML for this task" + }, + "accepted_as": "body", + "required": false, + "deprecated": false, + "default": null, + "documentation_urls": [] + }, + { + "name": "customer_portal_visible", + "tool_parameter_name": "customer_portal_visible", + "description": "Customer portal visible for this task", + "value_schema": { + "val_type": "boolean", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "Customer portal visible for this task" + }, + "accepted_as": "body", + "required": false, + "deprecated": false, + "default": null, + "documentation_urls": [] + }, + { + "name": "due_date", + "tool_parameter_name": "task_due_date", + "description": "Due date for this task, in RFC 3339 format", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "Due date for this task, in RFC 3339 format" + }, + "accepted_as": "body", + "required": false, + "deprecated": false, + "default": null, + "documentation_urls": [] + }, + { + "name": "milestone_id", + "tool_parameter_name": "milestone_identifier", + "description": "Milestone ID for this task", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "Milestone ID for this task" + }, + "accepted_as": "body", + "required": false, + "deprecated": false, + "default": null, + "documentation_urls": [] + }, + { + "name": "project_id", + "tool_parameter_name": "project_id", + "description": "Project ID for this task", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "Project ID for this task" + }, + "accepted_as": "body", + "required": false, + "deprecated": false, + "default": null, + "documentation_urls": [] + }, + { + "name": "status", + "tool_parameter_name": "task_status", + "description": "Status for this task\n\n* not_started TaskStatusNotStarted\n\n* in_progress TaskStatusInProgress\n\n* completed TaskStatusCompleted", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": [ + "not_started", + "in_progress", + "completed" + ], + "properties": null, + "inner_properties": null, + "description": "Status for this task\n\n* not_started TaskStatusNotStarted\n\n* in_progress TaskStatusInProgress\n\n* completed TaskStatusCompleted" + }, + "accepted_as": "body", + "required": false, + "deprecated": false, + "default": null, + "documentation_urls": [] + }, + { + "name": "title", + "tool_parameter_name": "task_title", + "description": "Title for this task", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "Title for this task" + }, + "accepted_as": "body", + "required": false, + "deprecated": false, + "default": null, + "documentation_urls": [] + } + ], + "documentation_urls": [], + "secrets": [ + { + "arcade_key": "PYLON_SECRET_TOKEN", + "parameter_name": "Authorization", + "accepted_as": "header", + "formatted_value": "Bearer {authorization}", + "description": "", + "is_auth_token": false + } + ], + "request_body_spec": "{\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"properties\": {\n \"assignee_id\": {\n \"description\": \"Assignee ID for this task\",\n \"type\": \"string\",\n \"x-go-name\": \"AssigneeID\"\n },\n \"body_html\": {\n \"description\": \"Body HTML for this task\",\n \"type\": \"string\",\n \"x-go-name\": \"BodyHTML\"\n },\n \"customer_portal_visible\": {\n \"description\": \"Customer portal visible for this task\",\n \"type\": \"boolean\",\n \"x-go-name\": \"CustomerPortalVisible\"\n },\n \"due_date\": {\n \"description\": \"Due date for this task, in RFC 3339 format\",\n \"type\": \"string\",\n \"x-go-name\": \"DueDate\"\n },\n \"milestone_id\": {\n \"description\": \"Milestone ID for this task\",\n \"type\": \"string\",\n \"x-go-name\": \"MilestoneID\"\n },\n \"project_id\": {\n \"description\": \"Project ID for this task\",\n \"type\": \"string\",\n \"x-go-name\": \"ProjectID\"\n },\n \"status\": {\n \"description\": \"Status for this task\\n\\n* not_started TaskStatusNotStarted\\n\\n* in_progress TaskStatusInProgress\\n\\n* completed TaskStatusCompleted\",\n \"enum\": [\n \"not_started\",\n \"in_progress\",\n \"completed\"\n ],\n \"type\": \"string\",\n \"x-go-enum-desc\": \"not_started TaskStatusNotStarted\\nin_progress TaskStatusInProgress\\ncompleted TaskStatusCompleted\",\n \"x-go-name\": \"Status\"\n },\n \"title\": {\n \"description\": \"Title for this task\",\n \"type\": \"string\",\n \"x-go-name\": \"Title\"\n }\n },\n \"type\": \"object\",\n \"x-go-package\": \"pylon/api/apiserver/endpoints\"\n }\n }\n },\n \"required\": false\n}", + "use_request_body_schema_mode": false, + "validate_request_body_schema": false + } +} diff --git a/toolkits/pylon_api/pylon_api/wrapper_tools/UpdateUserProfile.json b/toolkits/pylon_api/pylon_api/wrapper_tools/UpdateUserProfile.json new file mode 100644 index 00000000..42e97a2f --- /dev/null +++ b/toolkits/pylon_api/pylon_api/wrapper_tools/UpdateUserProfile.json @@ -0,0 +1,170 @@ +{ + "name": "UpdateUserProfile", + "fully_qualified_name": "PylonApi.UpdateUserProfile@0.1.0", + "description": "Update a user's profile information.\n\nThis tool updates the information of a user identified by a specific ID. It should be called when changes to a user's profile are needed, such as updating personal details or contact information.", + "toolkit": { + "name": "PylonApi", + "description": null, + "version": "0.1.0" + }, + "input": { + "parameters": [ + { + "name": "user_id", + "required": true, + "description": "The unique identifier of the user to be updated.", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The ID of the user to update." + }, + "inferrable": true, + "http_endpoint_parameter_name": "id" + }, + { + "name": "user_role_id", + "required": false, + "description": "The role ID to assign to the user.", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The role_id of the user." + }, + "inferrable": true, + "http_endpoint_parameter_name": "role_id" + }, + { + "name": "user_status", + "required": false, + "description": "The updated status for the user. Options: `active`, `away`, or `out_of_office`.", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The new user status for the user. Can be one of `active`, `away`, or `out_of_office`." + }, + "inferrable": true, + "http_endpoint_parameter_name": "status" + } + ] + }, + "output": { + "description": "Response from the API endpoint 'UpdateUser'.", + "available_modes": [ + "value", + "error", + "null" + ], + "value_schema": { + "val_type": "json", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": null + } + }, + "requirements": { + "authorization": null, + "secrets": [ + { + "key": "PYLON_SECRET_TOKEN" + } + ], + "metadata": null + }, + "deprecation_message": null, + "metadata": { + "object_type": "api_wrapper_tool", + "version": "1.1.0", + "description": "Tools that enable LLMs to interact directly with the pylon API." + }, + "http_endpoint": { + "metadata": { + "object_type": "http_endpoint", + "version": "1.2.0", + "description": "" + }, + "url": "https://api.usepylon.com/users/{id}", + "http_method": "PATCH", + "headers": {}, + "parameters": [ + { + "name": "id", + "tool_parameter_name": "user_id", + "description": "The ID of the user to update.", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The ID of the user to update." + }, + "accepted_as": "path", + "required": true, + "deprecated": false, + "default": null, + "documentation_urls": [] + }, + { + "name": "role_id", + "tool_parameter_name": "user_role_id", + "description": "The role_id of the user.", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The role_id of the user." + }, + "accepted_as": "body", + "required": false, + "deprecated": false, + "default": null, + "documentation_urls": [] + }, + { + "name": "status", + "tool_parameter_name": "user_status", + "description": "The new user status for the user. Can be one of `active`, `away`, or `out_of_office`.", + "value_schema": { + "val_type": "string", + "inner_val_type": null, + "enum": null, + "properties": null, + "inner_properties": null, + "description": "The new user status for the user. Can be one of `active`, `away`, or `out_of_office`." + }, + "accepted_as": "body", + "required": false, + "deprecated": false, + "default": null, + "documentation_urls": [] + } + ], + "documentation_urls": [], + "secrets": [ + { + "arcade_key": "PYLON_SECRET_TOKEN", + "parameter_name": "Authorization", + "accepted_as": "header", + "formatted_value": "Bearer {authorization}", + "description": "", + "is_auth_token": false + } + ], + "request_body_spec": "{\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"properties\": {\n \"role_id\": {\n \"description\": \"The role_id of the user.\",\n \"type\": \"string\",\n \"x-go-name\": \"RoleID\"\n },\n \"status\": {\n \"description\": \"The new user status for the user. Can be one of `active`, `away`, or `out_of_office`.\",\n \"type\": \"string\",\n \"x-go-name\": \"Status\"\n }\n },\n \"type\": \"object\",\n \"x-go-package\": \"pylon/api/apiserver/endpoints\"\n }\n }\n },\n \"required\": false\n}", + "use_request_body_schema_mode": false, + "validate_request_body_schema": false + } +} diff --git a/toolkits/pylon_api/pyproject.toml b/toolkits/pylon_api/pyproject.toml new file mode 100644 index 00000000..e224e100 --- /dev/null +++ b/toolkits/pylon_api/pyproject.toml @@ -0,0 +1,60 @@ +[build-system] +requires = [ "hatchling",] +build-backend = "hatchling.build" + +[project] +name = "pylon_api" +version = "0.1.0" +description = "Tools that enable LLMs to interact directly with the pylon API." +requires-python = ">=3.10" +dependencies = [ + "arcade-tdk>=3.0.0,<4.0.0", + "httpx[http2]>=0.27.2,<1.0.0", + "jsonschema>=4.0.0,<5.0.0", +] +[[project.authors]] +email = "support@arcade.dev" + +[project.optional-dependencies] +dev = [ + "arcade-mcp[all]>=1.2.0,<2.0.0", + "arcade-serve>=3.0.0,<4.0.0", + "pytest>=8.3.0,<8.4.0", + "pytest-cov>=4.0.0,<4.1.0", + "pytest-mock>=3.11.1,<3.12.0", + "pytest-asyncio>=0.24.0,<0.25.0", + "mypy>=1.5.1,<1.6.0", + "pre-commit>=3.4.0,<3.5.0", + "tox>=4.11.1,<4.12.0", + "ruff>=0.7.4,<0.8.0", +] + +# Use local path sources for arcade libs when working locally +[tool.uv.sources] +arcade-mcp = { path = "../../", editable = true } +arcade-serve = { path = "../../libs/arcade-serve/", editable = true } +arcade-tdk = { path = "../../libs/arcade-tdk/", editable = true } +# Tell Arcade.dev that this package is a toolkit +[project.entry-points.arcade_toolkits] +toolkit_name = "pylon_api" + +[tool.mypy] +files = [ "pylon_api/**/*.py",] +python_version = "3.10" +disallow_untyped_defs = true +disallow_any_unimported = true +no_implicit_optional = true +check_untyped_defs = true +warn_return_any = true +warn_unused_ignores = true +show_error_codes = true +ignore_missing_imports = true + +[tool.pytest.ini_options] +testpaths = [ "tests",] + +[tool.coverage.report] +skip_empty = true + +[tool.hatch.build.targets.wheel] +packages = [ "pylon_api",] diff --git a/toolkits/pylon_api/tests/__init__.py b/toolkits/pylon_api/tests/__init__.py new file mode 100644 index 00000000..e69de29b