@microsoft/teams.a2a 2.0.0-preview.11 → 2.0.0-preview.12
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/chat-prompt/plugin.d.ts +26 -14
- package/dist/chat-prompt/plugin.js +177 -113
- package/dist/chat-prompt/plugin2.d.ts +84 -0
- package/dist/chat-prompt/plugin2.js +215 -0
- package/dist/chat-prompt/types.d.ts +43 -35
- package/dist/index.d.ts +0 -7
- package/dist/index.js +1 -31
- package/dist/server/plugin.d.ts +27 -24
- package/dist/server/plugin.js +70 -86
- package/dist/server2/plugin.d.ts +46 -0
- package/dist/server2/plugin.js +97 -0
- package/package.json +6 -5
|
@@ -1,24 +1,36 @@
|
|
|
1
|
+
import { AgentCard } from '@a2a-js/sdk';
|
|
2
|
+
import { A2AClient } from '@a2a-js/sdk/client';
|
|
1
3
|
import { Function as ChatFunction, ChatPromptPlugin } from '@microsoft/teams.ai';
|
|
2
|
-
import {
|
|
3
|
-
import
|
|
4
|
-
|
|
4
|
+
import { ILogger } from '@microsoft/teams.common';
|
|
5
|
+
import { A2AClientPluginOptions, A2APluginUseParams, BuildFunctionMetadata, BuildMessageForAgent, BuildMessageFromAgentResponse, BuildPrompt } from './types';
|
|
6
|
+
interface IAgentConfig {
|
|
7
|
+
key: string;
|
|
8
|
+
cardUrl: string;
|
|
9
|
+
buildFunctionMetadata?: BuildFunctionMetadata;
|
|
10
|
+
buildMessageForAgent?: BuildMessageForAgent;
|
|
11
|
+
buildMessageFromAgentResponse?: BuildMessageFromAgentResponse;
|
|
12
|
+
}
|
|
13
|
+
interface IAgentClientInfo extends IAgentConfig {
|
|
14
|
+
client: A2AClient;
|
|
15
|
+
agentCard: AgentCard;
|
|
16
|
+
}
|
|
5
17
|
export declare class A2AClientPlugin implements ChatPromptPlugin<'a2a', A2APluginUseParams> {
|
|
6
18
|
readonly name = "a2a";
|
|
7
|
-
|
|
19
|
+
readonly log: ILogger;
|
|
20
|
+
protected _agentConfigs: Map<string, IAgentConfig>;
|
|
21
|
+
protected _clients: Map<string, IAgentClientInfo>;
|
|
8
22
|
protected buildFunctionMetadata?: BuildFunctionMetadata;
|
|
9
23
|
protected buildPrompt?: BuildPrompt;
|
|
10
|
-
protected
|
|
11
|
-
protected
|
|
12
|
-
constructor(options?:
|
|
24
|
+
protected buildMessageForAgent?: BuildMessageForAgent;
|
|
25
|
+
protected buildMessageFromAgentResponse?: BuildMessageFromAgentResponse;
|
|
26
|
+
constructor(options?: A2AClientPluginOptions);
|
|
13
27
|
onUsePlugin(args: A2APluginUseParams): void;
|
|
14
28
|
onBuildFunctions(functions: ChatFunction[]): Promise<ChatFunction[]>;
|
|
15
|
-
/**
|
|
16
|
-
* Modify the system prompt before it is sent to the model.
|
|
17
|
-
* If the user supplies a buildPrompt function, it is used. Otherwise, a default is built.
|
|
18
|
-
*/
|
|
19
29
|
onBuildPrompt(systemPrompt: string | undefined): Promise<string | undefined>;
|
|
20
30
|
private _defaultFunctionMetadata;
|
|
21
|
-
private
|
|
22
|
-
private
|
|
31
|
+
private _defaultBuildMessage;
|
|
32
|
+
private _createMessage;
|
|
33
|
+
private _defaultBuildMessageFromAgentResponse;
|
|
34
|
+
private _getAgentCard;
|
|
23
35
|
}
|
|
24
|
-
export
|
|
36
|
+
export {};
|
|
@@ -3,154 +3,218 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
3
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.
|
|
6
|
+
exports.A2AClientPlugin = void 0;
|
|
7
|
+
const client_1 = require("@a2a-js/sdk/client");
|
|
7
8
|
const lodash_camelcase_1 = __importDefault(require("lodash.camelcase"));
|
|
8
|
-
const
|
|
9
|
-
const
|
|
9
|
+
const uuid_1 = require("uuid");
|
|
10
|
+
const teams_common_1 = require("@microsoft/teams.common");
|
|
10
11
|
const pascalCase = (str) => {
|
|
11
12
|
return (0, lodash_camelcase_1.default)(str).replace(/^(.)/, (match) => match.toUpperCase());
|
|
12
13
|
};
|
|
13
14
|
class A2AClientPlugin {
|
|
14
15
|
name = 'a2a';
|
|
15
|
-
|
|
16
|
+
log;
|
|
17
|
+
_agentConfigs = new Map();
|
|
18
|
+
_clients = new Map();
|
|
16
19
|
buildFunctionMetadata;
|
|
17
20
|
buildPrompt;
|
|
18
|
-
|
|
19
|
-
|
|
21
|
+
buildMessageForAgent;
|
|
22
|
+
buildMessageFromAgentResponse;
|
|
20
23
|
constructor(options = {}) {
|
|
21
|
-
this._manager = options.manager instanceof agent_manager_1.AgentManager ? options.manager : new agent_manager_1.AgentManager(options.manager);
|
|
22
24
|
this.buildFunctionMetadata = options.buildFunctionMetadata;
|
|
23
25
|
this.buildPrompt = options.buildPrompt;
|
|
24
|
-
this.
|
|
26
|
+
this.buildMessageForAgent = options.buildMessageForAgent;
|
|
27
|
+
this.buildMessageFromAgentResponse = options.buildMessageFromAgentResponse;
|
|
28
|
+
this.log = options.logger ?? new teams_common_1.ConsoleLogger('a2a:client');
|
|
25
29
|
}
|
|
26
30
|
onUsePlugin(args) {
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
+
// Just store the config, defer client creation to onBuildFunctions
|
|
32
|
+
this._agentConfigs.set(args.key, {
|
|
33
|
+
key: args.key,
|
|
34
|
+
cardUrl: args.cardUrl,
|
|
35
|
+
buildFunctionMetadata: args.buildFunctionMetadata,
|
|
36
|
+
buildMessageForAgent: args.buildMessageForAgent,
|
|
37
|
+
buildMessageFromAgentResponse: args.buildMessageFromAgentResponse,
|
|
38
|
+
});
|
|
31
39
|
}
|
|
32
40
|
async onBuildFunctions(functions) {
|
|
33
|
-
const cards = await this._manager.getAgentCards();
|
|
34
41
|
const allFunctions = [];
|
|
35
|
-
for (const
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
description: 'Message to send to the agent',
|
|
57
|
-
},
|
|
58
|
-
continueTaskId: {
|
|
59
|
-
type: 'string',
|
|
60
|
-
description: 'If provided, continue an existing task with this ID (string). Otherwise send null or NONE to indicate a new task.',
|
|
42
|
+
for (const [key, config] of this._agentConfigs) {
|
|
43
|
+
try {
|
|
44
|
+
const agentCard = await this._getAgentCard(key, config);
|
|
45
|
+
if (!agentCard) {
|
|
46
|
+
continue; // Skip if we couldn't get the agent card
|
|
47
|
+
}
|
|
48
|
+
// Use custom function metadata builder or default
|
|
49
|
+
const buildMetadata = config.buildFunctionMetadata ||
|
|
50
|
+
this.buildFunctionMetadata ||
|
|
51
|
+
this._defaultFunctionMetadata;
|
|
52
|
+
const { name, description } = buildMetadata(agentCard);
|
|
53
|
+
allFunctions.push({
|
|
54
|
+
name,
|
|
55
|
+
description,
|
|
56
|
+
parameters: {
|
|
57
|
+
type: 'object',
|
|
58
|
+
properties: {
|
|
59
|
+
message: {
|
|
60
|
+
type: 'string',
|
|
61
|
+
description: 'Message to send to the agent',
|
|
62
|
+
},
|
|
61
63
|
},
|
|
64
|
+
required: ['message'],
|
|
62
65
|
},
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
66
|
+
handler: (async (args) => {
|
|
67
|
+
try {
|
|
68
|
+
const agentMessage = args.message;
|
|
69
|
+
// Use custom message builder if provided, otherwise use default
|
|
70
|
+
const buildMessage = config.buildMessageForAgent ||
|
|
71
|
+
this.buildMessageForAgent ||
|
|
72
|
+
this._defaultBuildMessage.bind(this);
|
|
73
|
+
const messageOrString = buildMessage(agentCard, agentMessage);
|
|
74
|
+
// Handle both Message and string returns
|
|
75
|
+
const message = typeof messageOrString === 'string'
|
|
76
|
+
? this._createMessage(messageOrString, agentCard)
|
|
77
|
+
: messageOrString;
|
|
78
|
+
const sendParams = { message };
|
|
79
|
+
// Get the client info to send the message
|
|
80
|
+
const clientInfo = this._clients.get(key);
|
|
81
|
+
if (!clientInfo) {
|
|
82
|
+
throw new Error(`Client not found for agent ${key}`);
|
|
83
|
+
}
|
|
84
|
+
this.log.debug(`Calling agent ${agentCard.name} with ${JSON.stringify(messageOrString)}`);
|
|
85
|
+
const response = await clientInfo.client.sendMessage(sendParams);
|
|
86
|
+
this.log.debug(`Got response from ${agentCard.name}`);
|
|
87
|
+
if ('error' in response) {
|
|
88
|
+
return response.error.message;
|
|
89
|
+
}
|
|
90
|
+
const result = response.result;
|
|
91
|
+
// Use custom response builder if provided, otherwise use default
|
|
92
|
+
const buildResponse = config.buildMessageFromAgentResponse ||
|
|
93
|
+
this.buildMessageFromAgentResponse ||
|
|
94
|
+
this._defaultBuildMessageFromAgentResponse.bind(this);
|
|
95
|
+
return buildResponse(agentCard, result, agentMessage);
|
|
96
|
+
}
|
|
97
|
+
catch (e) {
|
|
98
|
+
console.error(e);
|
|
99
|
+
throw e;
|
|
100
|
+
}
|
|
101
|
+
}).bind(this),
|
|
102
|
+
});
|
|
103
|
+
this.log.debug(`Added function in ChatPrompt to call ${agentCard.name}`);
|
|
104
|
+
}
|
|
105
|
+
catch (error) {
|
|
106
|
+
console.error(`Failed to build function for agent ${key}:`, error);
|
|
107
|
+
// Continue with other agents even if one fails
|
|
108
|
+
}
|
|
80
109
|
}
|
|
81
110
|
return functions.concat(allFunctions);
|
|
82
111
|
}
|
|
83
|
-
/**
|
|
84
|
-
* Modify the system prompt before it is sent to the model.
|
|
85
|
-
* If the user supplies a buildPrompt function, it is used. Otherwise, a default is built.
|
|
86
|
-
*/
|
|
87
112
|
async onBuildPrompt(systemPrompt) {
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
const
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
113
|
+
// Collect agent details for prompt building
|
|
114
|
+
const agentPromptParams = [];
|
|
115
|
+
for (const [key, config] of this._agentConfigs) {
|
|
116
|
+
try {
|
|
117
|
+
const agentCard = await this._getAgentCard(key, config);
|
|
118
|
+
if (agentCard) {
|
|
119
|
+
const clientInfo = this._clients.get(key);
|
|
120
|
+
if (clientInfo) {
|
|
121
|
+
agentPromptParams.push({
|
|
122
|
+
card: agentCard,
|
|
123
|
+
client: clientInfo.client,
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
catch (error) {
|
|
129
|
+
console.error(`Failed to get agent card for ${key}:`, error);
|
|
94
130
|
}
|
|
95
|
-
const { key, card } = cardWithMeta;
|
|
96
|
-
const latestTask = await this._manager.getLatestTask(key);
|
|
97
|
-
agentsWithLatestTask.push({ card, latestTask });
|
|
98
131
|
}
|
|
99
|
-
//
|
|
132
|
+
// Use custom buildPrompt if provided, otherwise use default
|
|
100
133
|
if (this.buildPrompt) {
|
|
101
|
-
return this.buildPrompt(systemPrompt,
|
|
134
|
+
return this.buildPrompt(systemPrompt, agentPromptParams);
|
|
135
|
+
}
|
|
136
|
+
// Default prompt building
|
|
137
|
+
if (agentPromptParams.length === 0) {
|
|
138
|
+
return systemPrompt;
|
|
102
139
|
}
|
|
140
|
+
const agentDetails = agentPromptParams
|
|
141
|
+
.map(({ card }) => {
|
|
142
|
+
let details = `<Agent Details>\n<Name>\n${card.name}\n</Name>\n`;
|
|
143
|
+
if (card.description) {
|
|
144
|
+
details += `<Description>\n${card.description}\n</Description>\n`;
|
|
145
|
+
}
|
|
146
|
+
if (card.skills?.length) {
|
|
147
|
+
for (const skill of card.skills) {
|
|
148
|
+
details += `<SKILL name="${skill.name}" description="${skill.description}" />\n`;
|
|
149
|
+
if (skill.examples?.length) {
|
|
150
|
+
details += `<EXAMPLES>\n${skill.examples.join('\n')}\n</EXAMPLES>\n`;
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
// Could add client-specific info here if needed
|
|
155
|
+
details += '</Agent Details>\n';
|
|
156
|
+
return details;
|
|
157
|
+
})
|
|
158
|
+
.join('');
|
|
103
159
|
const prompt = (systemPrompt || '') +
|
|
104
|
-
'\n' +
|
|
105
|
-
|
|
160
|
+
'\n\nHere are details about available agents that you can message:\n' +
|
|
161
|
+
agentDetails;
|
|
106
162
|
return prompt;
|
|
107
163
|
}
|
|
108
164
|
_defaultFunctionMetadata(card) {
|
|
109
165
|
const name = `message${pascalCase(card.name)}`;
|
|
110
|
-
const description = card.description || `Interact with
|
|
166
|
+
const description = card.description || `Interact with ${card.name} agent`;
|
|
111
167
|
return { name, description };
|
|
112
168
|
}
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
}
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
details += '</Agent Details>\n';
|
|
169
|
+
_defaultBuildMessage(card, input, metadata) {
|
|
170
|
+
return this._createMessage(input, card, metadata);
|
|
171
|
+
}
|
|
172
|
+
_createMessage(text, _card, metadata) {
|
|
173
|
+
return {
|
|
174
|
+
messageId: (0, uuid_1.v4)(),
|
|
175
|
+
role: 'user', // Messages TO agents are from user perspective
|
|
176
|
+
parts: [{ kind: 'text', text }],
|
|
177
|
+
kind: 'message',
|
|
178
|
+
// Include metadata if provided
|
|
179
|
+
...(metadata && { metadata }),
|
|
180
|
+
};
|
|
181
|
+
}
|
|
182
|
+
_defaultBuildMessageFromAgentResponse(_card, response, _originalInput) {
|
|
183
|
+
// Extract text from response parts
|
|
184
|
+
if (response.kind === 'message') {
|
|
185
|
+
const textParts = response.parts
|
|
186
|
+
.filter((part) => part.kind === 'text')
|
|
187
|
+
.map(part => part.text);
|
|
188
|
+
return textParts.join(' ') || 'Agent responded with no text content.';
|
|
189
|
+
}
|
|
190
|
+
else {
|
|
191
|
+
return 'Agent responded with non-message content.';
|
|
137
192
|
}
|
|
138
|
-
return details;
|
|
139
193
|
}
|
|
140
|
-
|
|
141
|
-
|
|
194
|
+
async _getAgentCard(key, config) {
|
|
195
|
+
// Return cached client info if it exists
|
|
196
|
+
let clientInfo = this._clients.get(key);
|
|
197
|
+
if (clientInfo) {
|
|
198
|
+
return clientInfo.agentCard;
|
|
199
|
+
}
|
|
200
|
+
// Create new client and get agent card
|
|
201
|
+
try {
|
|
202
|
+
const client = await client_1.A2AClient.fromCardUrl(config.cardUrl);
|
|
203
|
+
// Get the agent card from the client
|
|
204
|
+
const agentCard = await client.getAgentCard();
|
|
205
|
+
clientInfo = {
|
|
206
|
+
...config,
|
|
207
|
+
client,
|
|
208
|
+
agentCard,
|
|
209
|
+
};
|
|
210
|
+
this._clients.set(key, clientInfo);
|
|
211
|
+
return agentCard;
|
|
212
|
+
}
|
|
213
|
+
catch (error) {
|
|
214
|
+
console.error(`Error creating client or fetching agent card for ${key}:`, error);
|
|
215
|
+
return null;
|
|
216
|
+
}
|
|
142
217
|
}
|
|
143
218
|
}
|
|
144
219
|
exports.A2AClientPlugin = A2AClientPlugin;
|
|
145
|
-
|
|
146
|
-
return {
|
|
147
|
-
id: continueTaskId || (0, uuid_1.generateRequestId)().toString(),
|
|
148
|
-
message: {
|
|
149
|
-
role: 'user',
|
|
150
|
-
parts: [{ type: 'text', text: message }],
|
|
151
|
-
},
|
|
152
|
-
metadata,
|
|
153
|
-
};
|
|
154
|
-
};
|
|
155
|
-
exports.buildTaskSendParams = buildTaskSendParams;
|
|
156
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2luLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NoYXQtcHJvbXB0L3BsdWdpbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSx3RUFBeUM7QUFPekMsMkRBQTZFO0FBRTdFLHlDQUFtRDtBQVduRCxNQUFNLFVBQVUsR0FBRyxDQUFDLEdBQVcsRUFBRSxFQUFFO0lBQ2pDLE9BQU8sSUFBQSwwQkFBUyxFQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDO0FBQ3hFLENBQUMsQ0FBQztBQUVGLE1BQWEsZUFBZTtJQUVqQixJQUFJLEdBQUcsS0FBSyxDQUFDO0lBQ1osUUFBUSxDQUFlO0lBQ3ZCLHFCQUFxQixDQUF5QjtJQUM5QyxXQUFXLENBQWU7SUFDMUIsbUJBQW1CLENBQXVCO0lBQzFDLFlBQVksR0FBNkMsSUFBSSxHQUFHLEVBQUUsQ0FBQztJQUU3RSxZQUFZLFVBQTRCLEVBQUU7UUFDeEMsSUFBSSxDQUFDLFFBQVEsR0FBRyxPQUFPLENBQUMsT0FBTyxZQUFZLDRCQUFZLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksNEJBQVksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDOUcsSUFBSSxDQUFDLHFCQUFxQixHQUFHLE9BQU8sQ0FBQyxxQkFBcUIsQ0FBQztRQUMzRCxJQUFJLENBQUMsV0FBVyxHQUFHLE9BQU8sQ0FBQyxXQUFXLENBQUM7UUFDdkMsSUFBSSxDQUFDLG1CQUFtQixHQUFHLE9BQU8sQ0FBQyxtQkFBbUIsQ0FBQztJQUN6RCxDQUFDO0lBRUQsV0FBVyxDQUFDLElBQXdCO1FBQ2xDLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBRSxJQUFJ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
|
|
220
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2luLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NoYXQtcHJvbXB0L3BsdWdpbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFDQSwrQ0FBK0M7QUFDL0Msd0VBQXlDO0FBQ3pDLCtCQUFvQztBQU9wQywwREFBaUU7QUF5QmpFLE1BQU0sVUFBVSxHQUFHLENBQUMsR0FBVyxFQUFFLEVBQUU7SUFDakMsT0FBTyxJQUFBLDBCQUFTLEVBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUM7QUFDeEUsQ0FBQyxDQUFDO0FBRUYsTUFBYSxlQUFlO0lBRWpCLElBQUksR0FBRyxLQUFLLENBQUM7SUFFTixHQUFHLENBQVU7SUFDbkIsYUFBYSxHQUE4QixJQUFJLEdBQUcsRUFBRSxDQUFDO0lBQ3JELFFBQVEsR0FBa0MsSUFBSSxHQUFHLEVBQUUsQ0FBQztJQUVwRCxxQkFBcUIsQ0FBeUI7SUFDOUMsV0FBVyxDQUFlO0lBQzFCLG9CQUFvQixDQUF3QjtJQUM1Qyw2QkFBNkIsQ0FBaUM7SUFFeEUsWUFBWSxVQUFrQyxFQUFFO1FBQzlDLElBQUksQ0FBQyxxQkFBcUIsR0FBRyxPQUFPLENBQUMscUJBQXFCLENBQUM7UUFDM0QsSUFBSSxDQUFDLFdBQVcsR0FBRyxPQUFPLENBQUMsV0FBVyxDQUFDO1FBQ3ZDLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxPQUFPLENBQUMsb0JBQW9CLENBQUM7UUFDekQsSUFBSSxDQUFDLDZCQUE2QixHQUFHLE9BQU8sQ0FBQyw2QkFBNkIsQ0FBQztRQUMzRSxJQUFJLENBQUMsR0FBRyxHQUFHLE9BQU8sQ0FBQyxNQUFNLElBQUksSUFBSSw0QkFBYSxDQUFDLFlBQVksQ0FBQyxDQUFDO0lBQy9ELENBQUM7SUFFRCxXQUFXLENBQUMsSUFBd0I7UUFDbEMsbUVBQW1FO1FBQ25FLElB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
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import { AgentCard, Message, Task } from '@a2a-js/sdk';
|
|
2
|
+
import { A2AClient } from '@a2a-js/sdk/client';
|
|
3
|
+
import { Function as ChatFunction, ChatPromptPlugin } from '@microsoft/teams.ai';
|
|
4
|
+
type BuildFunctionMetadataSDK = (card: AgentCard) => {
|
|
5
|
+
name: string;
|
|
6
|
+
description: string;
|
|
7
|
+
};
|
|
8
|
+
type AgentPromptParamsSDK = {
|
|
9
|
+
card: AgentCard;
|
|
10
|
+
client: A2AClient;
|
|
11
|
+
};
|
|
12
|
+
type BuildPromptSDK = (systemPrompt: string | undefined, agentDetails: AgentPromptParamsSDK[]) => string | undefined;
|
|
13
|
+
type BuildMessageForAgent = (card: AgentCard, input: string, metadata?: Record<string, any>) => Message | string;
|
|
14
|
+
type BuildMessageFromAgentResponse = (card: AgentCard, response: Task | Message, originalInput: string) => string;
|
|
15
|
+
type A2AClientPluginOptions = {
|
|
16
|
+
/**
|
|
17
|
+
* Optional function to customize the function name and description for each agent card.
|
|
18
|
+
*/
|
|
19
|
+
buildFunctionMetadata?: BuildFunctionMetadataSDK;
|
|
20
|
+
/**
|
|
21
|
+
* Optional function to customize the prompt given all agent cards.
|
|
22
|
+
*/
|
|
23
|
+
buildPrompt?: BuildPromptSDK;
|
|
24
|
+
/**
|
|
25
|
+
* Optional function to customize the message format sent to each agent.
|
|
26
|
+
*/
|
|
27
|
+
buildMessageForAgent?: BuildMessageForAgent;
|
|
28
|
+
/**
|
|
29
|
+
* Optional function to customize how agent responses are processed into strings.
|
|
30
|
+
*/
|
|
31
|
+
buildMessageFromAgentResponse?: BuildMessageFromAgentResponse;
|
|
32
|
+
};
|
|
33
|
+
type A2APluginUseParams = {
|
|
34
|
+
/**
|
|
35
|
+
* Unique key to identify this agent
|
|
36
|
+
*/
|
|
37
|
+
key: string;
|
|
38
|
+
/**
|
|
39
|
+
* URL to the agent' s card endpoint
|
|
40
|
+
*/
|
|
41
|
+
cardUrl: string;
|
|
42
|
+
/**
|
|
43
|
+
* Custom function metadata builder for this specific agent
|
|
44
|
+
*/
|
|
45
|
+
buildFunctionMetadata?: BuildFunctionMetadataSDK;
|
|
46
|
+
/**
|
|
47
|
+
* Custom message builder for this specific agent
|
|
48
|
+
*/
|
|
49
|
+
buildMessageForAgent?: BuildMessageForAgent;
|
|
50
|
+
/**
|
|
51
|
+
* Custom response processor for this specific agent
|
|
52
|
+
*/
|
|
53
|
+
buildMessageFromAgentResponse?: BuildMessageFromAgentResponse;
|
|
54
|
+
};
|
|
55
|
+
interface IAgentConfig {
|
|
56
|
+
key: string;
|
|
57
|
+
cardUrl: string;
|
|
58
|
+
buildFunctionMetadata?: BuildFunctionMetadataSDK;
|
|
59
|
+
buildMessageForAgent?: BuildMessageForAgent;
|
|
60
|
+
buildMessageFromAgentResponse?: BuildMessageFromAgentResponse;
|
|
61
|
+
}
|
|
62
|
+
interface IAgentClientInfo extends IAgentConfig {
|
|
63
|
+
client: A2AClient;
|
|
64
|
+
agentCard: AgentCard;
|
|
65
|
+
}
|
|
66
|
+
export declare class A2AClientPlugin implements ChatPromptPlugin<'a2a', A2APluginUseParams> {
|
|
67
|
+
readonly name = "a2a";
|
|
68
|
+
protected _agentConfigs: Map<string, IAgentConfig>;
|
|
69
|
+
protected _clients: Map<string, IAgentClientInfo>;
|
|
70
|
+
protected buildFunctionMetadata?: BuildFunctionMetadataSDK;
|
|
71
|
+
protected buildPrompt?: BuildPromptSDK;
|
|
72
|
+
protected buildMessageForAgent?: BuildMessageForAgent;
|
|
73
|
+
protected buildMessageFromAgentResponse?: BuildMessageFromAgentResponse;
|
|
74
|
+
constructor(options?: A2AClientPluginOptions);
|
|
75
|
+
onUsePlugin(args: A2APluginUseParams): void;
|
|
76
|
+
onBuildFunctions(functions: ChatFunction[]): Promise<ChatFunction[]>;
|
|
77
|
+
onBuildPrompt(systemPrompt: string | undefined): Promise<string | undefined>;
|
|
78
|
+
private _defaultFunctionMetadata;
|
|
79
|
+
private _defaultBuildMessage;
|
|
80
|
+
private _createMessage;
|
|
81
|
+
private _defaultBuildMessageFromAgentResponse;
|
|
82
|
+
private _getAgentCard;
|
|
83
|
+
}
|
|
84
|
+
export {};
|