Skip to main content
Version: v5.0

Tools

The Tools API allows you to list, create, update, retrieve, and delete tools.

List tools#

Endpoints#

GET aisvc/api/v1/tools

Request#

Query parameters#

ParameterTypeDescriptionRequired
_offsetIntegerNumber of results to skipOptional
_pageSizeIntegerNumber of results per pageOptional
_userTypeStringFilter by the tool's unique identifier (_userType)Optional
_typeStringFilter by the tool type (user_tool or system_tool)Optional
queryStringWildcard search on the name and description of toolsOptional
Request example#

None

Response#

Codes#

CodeDescription
200Success
400Bad Request
404Not Found

Response body#

{  "_list": [    {      "_name": "AggregateReadingsTool",      "_description": "Helps to execute an aggregation query on Reading objects.",      "_userType": "AggregateReadingsTool",      "_namespaces": [        "default"      ],      "_id": "77b7f4db-c8e7-40a2-bac0-9e964c5620e9",      "_type": "system_tool",      "_irn": "aisvc:tool:77b7f4db-c8e7-40a2-bac0-9e964c5620e9",      "_metadata": {}    },    {      "_name": "Get Assets Tool",      "_description": "Get assets",      "_userType": "GetAssetsTool",      "_namespaces": [        "autotesting1_leT0AMOg"      ],      "_id": "6b2991be-7d9f-4203-8578-b8e9545f1700",      "_toolClass": "GetAssetsTool",      "_type": "user_tool",      "_irn": "aisvc:tool:6b2991be-7d9f-4203-8578-b8e9545f1700",      "_metadata": {        "_createdAt": "1757178319536",        "_updatedById": "70699091-77de-4ee3-8a3f-034ec8746a3b",        "_createdById": "70699091-77de-4ee3-8a3f-034ec8746a3b",        "_updatedAt": "1757178319536"      }    }  ],  "_offset": 0,  "_pageSize": 25,  "_total": 50}

Create tool#

Endpoints#

POST aisvc/api/v1/tools

Request#

Request body#

ParameterTypeDescriptionRequired
_namespacesArray of StringThe namespace(s) of the tool resourceRequired
_nameStringThe tool nameRequired
_descriptionStringA short description of what the tool doesOptional
_userTypeStringUnique identifier of the toolRequired
_toolClassStringClass name of the custom tool implementationOptional
Request body example#
[  {    "_name": "Get Assets Tool",    "_description": "Get assets",    "_userType": "GetAssetsTool",    "_namespaces": [      "autotesting1_leT0AMOg"    ],    "_toolClass": "GetAssetsTool"  }]

Response#

Codes#

CodeDescription
200Success
400Bad Request
404Not Found

Response body#

{  "_offset": 0,  "_pageSize": 1,  "_total": 1,  "_list": [    {      "_name": "Get Assets Tool",      "_description": "Get sasets",      "_userType": "GetAssetsTool",      "_namespaces": [        "autotesting1_leT0AMOg"      ],      "_id": "6b2991be-7d9f-4203-8578-b8e9545f1700",      "_toolClass": "GetAssetsTool",      "_type": "user_tool",      "_irn": "aisvc:tool:6b2991be-7d9f-4203-8578-b8e9545f1700",      "_metadata": {        "_createdAt": "1757178319536",        "_updatedById": "70699091-77de-4ee3-8a3f-034ec8746a3b",        "_createdById": "70699091-77de-4ee3-8a3f-034ec8746a3b",        "_updatedAt": "1757178319536"      }    }  ]}

Get tool by ID#

Endpoints#

GET aisvc/api/v1/tools/{id}

Response#

Codes#

CodeDescription
200Success
400Bad Request
404Not Found

Response body#

    {      "_name": "Get Assets Tool",      "_description": "Get assets",      "_userType": "GetAssetsTool",      "_namespaces": [        "autotesting1_leT0AMOg"      ],      "_id": "6b2991be-7d9f-4203-8578-b8e9545f1700",      "_toolClass": "GetAssetsTool",      "_type": "user_tool",      "_irn": "aisvc:tool:6b2991be-7d9f-4203-8578-b8e9545f1700",      "_metadata": {        "_createdAt": "1757178319536",        "_updatedById": "70699091-77de-4ee3-8a3f-034ec8746a3b",        "_createdById": "70699091-77de-4ee3-8a3f-034ec8746a3b",        "_updatedAt": "1757178319536"      }    }

Update tool by ID#

Endpoints#

PUT aisvc/api/v1/tools/{id}

Request#

Request body#

ParameterTypeDescriptionRequired
_nameStringThe tool nameRequired
_descriptionStringA short description of what the tool doesOptional
_userTypeStringUnique identifier of the toolRequired
_toolClassStringClass name of the custom tool implementationOptional
Request body example#
    {      "_name": "Get Assets Tool",      "_description": "Get assets",      "_userType": "GetAssetsTool",      "_namespaces": [        "autotesting1_leT0AMOg"      ],      "_toolClass": "GetAssetsTool",    }

Response#

Codes#

CodeDescription
200Success
400Bad Request
404Not Found

Response body#

{  "_name": "Get Assets Tool",  "_description": "Get assets",  "_userType": "GetAssetsTool",  "_namespaces": [    "autotesting1_leT0AMOg"  ],  "_id": "6b2991be-7d9f-4203-8578-b8e9545f1700",  "_toolClass": "GetAssetsTool",  "_type": "user_tool",  "_irn": "aisvc:tool:6b2991be-7d9f-4203-8578-b8e9545f1700",  "_metadata": {    "_createdAt": "1757178319536",    "_updatedById": "70699091-77de-4ee3-8a3f-034ec8746a3b",    "_createdById": "70699091-77de-4ee3-8a3f-034ec8746a3b",    "_updatedAt": "1757178319536"  }}

Delete tool by ID#

Endpoints#

DELETE aisvc/api/v1/tools/{id}

Response#

Codes#

CodeDescription
200Success
400Bad Request
404Not Found

Response body#

// empty response body

Upload Tool Source Code#

Endpoints#

PUT aisvc/api/v1/tools/{id}/sourcecodes

Request#

Request body#

{    "_content":"import { AbstractTool } from '@dtplatform/agent-core';\nimport * as PlatformAPI from '@dtplatform/platform-api';\nconst { IafItemSvc } = PlatformAPI;\nimport { z } from 'zod';\n\nconst toolSchema = z.object({\n  name: z.string().optional().nullable().describe('Filter by asset name. Supports regex'),\n  dtCategory: z.string().optional().nullable().describe('Filter by the dtCategory property. Supports regex'),\n  dtType: z.string().optional().nullable().describe('Filter by dtType property. Supports regex'),\n  _pageSize: z.string().optional().nullable().describe('Sets the number of results to return per Page in the response'),\n  _offset: z.string().optional().nullable().describe('Sets the number of results to skip in the Page response. For example, set to `10` to skip the first 10 results.')\n});\n\nexport default class GetAssetsTool extends AbstractTool {\n  name: string = 'GetAssetsTool';\n  description: string = 'Helps to retrieve Assets based on the provided criteria.';\n  requestContext: any = {};\n  schema: any = toolSchema;\n\n  constructor(...args: any[]) {\n    super(...args);\n    const [{ requestContext }] = args;\n    this.requestContext = requestContext;\n  }\n\n  async _call(args: z.infer<typeof toolSchema>) {\n    let criteria: any = { '$or': [] };\n    let options: any = {};\n    let response: any = {};\n\n    if (args.name || args.dtCategory || args.dtType) {\n      if (args.name) {\n        criteria['$or'].push({\n          'Asset Name': {\n            '$regex': this.toRegexString(args.name),\n            '$options': 'i'\n          }\n        });\n      }\n      if (args.dtCategory) {\n        criteria['$or'].push({\n          'properties.dtCategory.val': {\n            '$regex': this.toRegexString(args.dtCategory),\n            '$options': 'i'\n          }\n        });\n      }\n      if (args.dtType) {\n        criteria['$or'].push({\n          'properties.dtType.val': {\n            '$regex': this.toRegexString(args.dtType),\n            '$options': 'i'\n          }\n        });\n      }\n\n      if (args._pageSize) {\n        options['_pageSize'] = parseInt(args._pageSize, 10);\n      }\n      if (args._offset) {\n        options['_offset'] = parseInt(args._offset, 10);\n      }\n\n      let colQuery = {\n        query: {\n          _userType: 'iaf_ext_asset_coll',\n          _itemClass: 'NamedUserCollection'\n        }\n      };\n\n      const colOptions = {\n        project: { _userType: 1, _itemClass: 1 },\n        sort: { _name: 1 },\n        page: { _offset: 0, _pageSize: 1 }\n      };\n\n      const colResponse = await IafItemSvc.getNamedUserItems(\n        colQuery,\n        this.requestContext,\n        colOptions\n      );\n\n\n\n      let assetCollection: any = null;\n      if (colResponse && Array.isArray(colResponse._list) && colResponse._list.length > 0) {\n        assetCollection = colResponse._list[0];\n        if (assetCollection && assetCollection._id) {\n          response = await IafItemSvc.getRelatedItems(\n            assetCollection._id,\n            {query: criteria},\n            this.requestContext,\n            options            \n          );\n        }\n      }\n    }\n    return response;\n  }\n\n  toRegexString(str) {\n    const quoted = str.match(/^'(.*)'$/);\n    if (quoted) {\n      const escaped = quoted[1].replace(/[.*+?^${}()|[\]\\]/g, '\\$&');\n      return `.*(${escaped}).*`;\n    }\n    const terms = str\n      .split(/\s+/)\n      .map(term => term.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'));\n    return `.*(${terms.join('|')}).*`;\n  }\n}\n"}

Response#

Codes#

CodeDescription
200Success
400Bad Request
404Not Found

Get Tool Source Code#

Endpoints#

GET aisvc/api/v1/tools/{id}/sourcecodes

Response#

Codes#

CodeDescription
200Success
400Bad Request
404Not Found

Response body#

    [    {        "_content": "import { AbstractTool } from '@dtplatform/agent-core';\nimport * as PlatformAPI from '@dtplatform/platform-api';\nconst { IafItemSvc } = PlatformAPI;\nimport { z } from 'zod';\n\nconst toolSchema = z.object({\n  name: z.string().optional().nullable().describe('Filter by asset name. Supports regex'),\n  dtCategory: z.string().optional().nullable().describe('Filter by the dtCategory property. Supports regex'),\n  dtType: z.string().optional().nullable().describe('Filter by dtType property. Supports regex'),\n  _pageSize: z.string().optional().nullable().describe('Sets the number of results to return per Page in the response'),\n  _offset: z.string().optional().nullable().describe('Sets the number of results to skip in the Page response. For example, set to `10` to skip the first 10 results.')\n});\n\nexport default class GetAssetsTool extends AbstractTool {\n  name: string = 'GetAssetsTool';\n  description: string = 'Helps to retrieve Assets based on the provided criteria.';\n  requestContext: any = {};\n  schema: any = toolSchema;\n\n  constructor(...args: any[]) {\n    super(...args);\n    const [{ requestContext }] = args;\n    this.requestContext = requestContext;\n  }\n\n  async _call(args: z.infer<typeof toolSchema>) {\n    let criteria: any = { '$or': [] };\n    let options: any = {};\n    let response: any = {};\n\n    if (args.name || args.dtCategory || args.dtType) {\n      if (args.name) {\n        criteria['$or'].push({\n          'Asset Name': {\n            '$regex': this.toRegexString(args.name),\n            '$options': 'i'\n          }\n        });\n      }\n      if (args.dtCategory) {\n        criteria['$or'].push({\n          'properties.dtCategory.val': {\n            '$regex': this.toRegexString(args.dtCategory),\n            '$options': 'i'\n          }\n        });\n      }\n      if (args.dtType) {\n        criteria['$or'].push({\n          'properties.dtType.val': {\n            '$regex': this.toRegexString(args.dtType),\n            '$options': 'i'\n          }\n        });\n      }\n\n      if (args._pageSize) {\n        options['_pageSize'] = parseInt(args._pageSize, 10);\n      }\n      if (args._offset) {\n        options['_offset'] = parseInt(args._offset, 10);\n      }\n\n      let colQuery = {\n        query: {\n          _userType: 'iaf_ext_asset_coll',\n          _itemClass: 'NamedUserCollection'\n        }\n      };\n\n      const colOptions = {\n        project: { _userType: 1, _itemClass: 1 },\n        sort: { _name: 1 },\n        page: { _offset: 0, _pageSize: 1 }\n      };\n\n      const colResponse = await IafItemSvc.getNamedUserItems(\n        colQuery,\n        this.requestContext,\n        colOptions\n      );\n\n\n\n      let assetCollection: any = null;\n      if (colResponse && Array.isArray(colResponse._list) && colResponse._list.length > 0) {\n        assetCollection = colResponse._list[0];\n        if (assetCollection && assetCollection._id) {\n          response = await IafItemSvc.getRelatedItems(\n            assetCollection._id,\n            {query: criteria},\n            this.requestContext,\n            options            \n          );\n        }\n      }\n    }\n    return response;\n  }\n\n  toRegexString(str) {\n    const quoted = str.match(/^'(.*)'$/);\n    if (quoted) {\n      const escaped = quoted[1].replace(/[.*+?^${}()|[\]\\]/g, '\\$&');\n      return `.*(${escaped}).*`;\n    }\n    const terms = str\n      .split(/\s+/)\n      .map(term => term.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'));\n    return `.*(${terms.join('|')}).*`;\n  }\n}\n"    }]