File size: 4,068 Bytes
a271c58 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 | 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],
},
};
},
});
}
}
|