| import { AgentToolInterface } from '@gitroom/nestjs-libraries/chat/agent.tool.interface'; |
| import { createTool } from '@mastra/core/tools'; |
| import { z } from 'zod'; |
| import { Injectable } from '@nestjs/common'; |
| import { |
| IntegrationManager, |
| socialIntegrationList, |
| } from '@gitroom/nestjs-libraries/integrations/integration.manager'; |
| import { getValidationSchemas } from '@gitroom/nestjs-libraries/chat/validation.schemas.helper'; |
| import { checkAuth } from '@gitroom/nestjs-libraries/chat/auth.context'; |
|
|
| @Injectable() |
| export class IntegrationValidationTool implements AgentToolInterface { |
| constructor(private _integrationManager: IntegrationManager) {} |
| name = 'integrationSchema'; |
|
|
| run() { |
| return createTool({ |
| id: 'integrationSchema', |
| description: `Everytime we want to schedule a social media post, we need to understand the schema of the integration. |
| This tool helps us get the schema of the integration. |
| Sometimes we might get a schema back the requires some id, for that, you can get information from 'tools' |
| And use the triggerTool function. |
| `, |
| mcp: { |
| annotations: { |
| title: 'Get Integration Schema', |
| readOnlyHint: true, |
| destructiveHint: false, |
| idempotentHint: true, |
| openWorldHint: false, |
| }, |
| }, |
| inputSchema: z.object({ |
| isPremium: z |
| .boolean() |
| .describe('is this the user premium? if not, set to false'), |
| platform: z |
| .string() |
| .describe( |
| `platform identifier (${socialIntegrationList |
| .map((p) => p.identifier) |
| .join(', ')})` |
| ), |
| }), |
| outputSchema: z.object({ |
| output: z.object({ |
| rules: z.string(), |
| maxLength: z |
| .number() |
| .describe('The maximum length of a post / comment'), |
| settings: z |
| .any() |
| .describe('List of settings need to be passed to schedule a post'), |
| tools: z |
| .array( |
| z.object({ |
| description: z.string().describe('Description of the tool'), |
| methodName: z |
| .string() |
| .describe('Method to call to get the information'), |
| dataSchema: z |
| .array( |
| z.object({ |
| key: z |
| .string() |
| .describe('Name of the settings key to pass'), |
| description: z |
| .string() |
| .describe('Description of the setting key'), |
| type: z.string(), |
| }) |
| ) |
| .describe( |
| 'This will be passed to schedulePostTool [output:settings]' |
| ), |
| }) |
| ) |
| .describe( |
| "Sometimes settings require some id, tags and stuff, if you don't have, trigger the `triggerTool` function from the tools list [output:callable-tools]" |
| ), |
| }), |
| }), |
| execute: async (inputData, context) => { |
| checkAuth(inputData, context); |
| const integration = socialIntegrationList.find( |
| (p) => p.identifier === inputData.platform |
| )!; |
|
|
| if (!integration) { |
| return { |
| output: { rules: '', maxLength: 0, settings: {}, tools: [] }, |
| }; |
| } |
|
|
| const maxLength = integration.maxLength(inputData.isPremium); |
| const schemas = !integration.dto |
| ? false |
| : getValidationSchemas()[integration.dto.name]; |
| const tools = this._integrationManager.getAllTools(); |
| const rules = this._integrationManager.getAllRulesDescription(); |
|
|
| return { |
| output: { |
| rules: rules[integration.identifier], |
| maxLength, |
| settings: !schemas ? 'No additional settings required' : schemas, |
| tools: tools[integration.identifier], |
| }, |
| }; |
| }, |
| }); |
| } |
| } |
|
|