@microsoft/teams.a2a 2.0.0-preview.9 → 2.0.1

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.
Files changed (42) hide show
  1. package/dist/chat-prompt/plugin.d.ts +26 -14
  2. package/dist/chat-prompt/plugin.js +182 -115
  3. package/dist/chat-prompt/types.d.ts +43 -35
  4. package/dist/index.d.ts +0 -7
  5. package/dist/index.js +1 -31
  6. package/dist/server/plugin.d.ts +27 -24
  7. package/dist/server/plugin.js +70 -86
  8. package/package.json +8 -6
  9. package/dist/client/agent-client.d.ts +0 -58
  10. package/dist/client/agent-client.js +0 -177
  11. package/dist/client/agent-manager.d.ts +0 -57
  12. package/dist/client/agent-manager.js +0 -136
  13. package/dist/client/agent-task-store.d.ts +0 -25
  14. package/dist/client/agent-task-store.js +0 -47
  15. package/dist/common/schema.d.ts +0 -728
  16. package/dist/common/schema.js +0 -26
  17. package/dist/common/type-utils.d.ts +0 -11
  18. package/dist/common/type-utils.js +0 -3
  19. package/dist/common/uuid.d.ts +0 -1
  20. package/dist/common/uuid.js +0 -12
  21. package/dist/server/middleware/isTaskRequest.d.ts +0 -2
  22. package/dist/server/middleware/isTaskRequest.js +0 -32
  23. package/dist/server/plugin.on-get-request.d.ts +0 -3
  24. package/dist/server/plugin.on-get-request.js +0 -17
  25. package/dist/server/plugin.on-send-request.d.ts +0 -9
  26. package/dist/server/plugin.on-send-request.js +0 -107
  27. package/dist/server/serverUtils.d.ts +0 -13
  28. package/dist/server/serverUtils.js +0 -65
  29. package/dist/server/tasks/task-manager.d.ts +0 -22
  30. package/dist/server/tasks/task-manager.js +0 -205
  31. package/dist/server/tasks/task-store.d.ts +0 -8
  32. package/dist/server/tasks/task-store.js +0 -18
  33. package/dist/server/tasks/task-utilities.d.ts +0 -27
  34. package/dist/server/tasks/task-utilities.js +0 -139
  35. package/dist/server/tasks/task-utils.d.ts +0 -22
  36. package/dist/server/tasks/task-utils.js +0 -38
  37. package/dist/server/types/a2a-error.d.ts +0 -23
  38. package/dist/server/types/a2a-error.js +0 -95
  39. package/dist/server/types/a2a-types.d.ts +0 -56
  40. package/dist/server/types/a2a-types.js +0 -3
  41. package/dist/server/types/event-types.d.ts +0 -24
  42. package/dist/server/types/event-types.js +0 -3
@@ -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 { AgentManager } from '../client/agent-manager';
3
- import * as schema from '../common/schema';
4
- import { A2APluginOptions, A2APluginUseParams, BuildFunctionMetadata, BuildPrompt, BuildTaskSendParams } from './types';
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
- protected _manager: AgentManager;
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 buildTaskSendParams?: BuildTaskSendParams;
11
- protected _agentConfig: Map<string, Partial<A2APluginUseParams>>;
12
- constructor(options?: A2APluginOptions);
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 _defaultBuildPrompt;
22
- private _defaultBuildTaskSendParams;
31
+ private _defaultBuildMessage;
32
+ private _createMessage;
33
+ private _defaultBuildMessageFromAgentResponse;
34
+ private _getAgentCard;
23
35
  }
24
- export declare const buildTaskSendParams: (message: string, metadata?: Record<string, any>, continueTaskId?: string | null) => schema.TaskSendParams;
36
+ export {};
@@ -3,151 +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.buildTaskSendParams = exports.A2AClientPlugin = void 0;
7
- const camelcase_1 = __importDefault(require("camelcase"));
8
- const agent_manager_1 = require("../client/agent-manager");
9
- const uuid_1 = require("../common/uuid");
6
+ exports.A2AClientPlugin = void 0;
7
+ const client_1 = require("@a2a-js/sdk/client");
8
+ const lodash_camelcase_1 = __importDefault(require("lodash.camelcase"));
9
+ const uuid_1 = require("uuid");
10
+ const teams_common_1 = require("@microsoft/teams.common");
11
+ const pascalCase = (str) => {
12
+ return (0, lodash_camelcase_1.default)(str).replace(/^(.)/, (match) => match.toUpperCase());
13
+ };
10
14
  class A2AClientPlugin {
11
15
  name = 'a2a';
12
- _manager;
16
+ log;
17
+ _agentConfigs = new Map();
18
+ _clients = new Map();
13
19
  buildFunctionMetadata;
14
20
  buildPrompt;
15
- buildTaskSendParams;
16
- _agentConfig = new Map();
21
+ buildMessageForAgent;
22
+ buildMessageFromAgentResponse;
17
23
  constructor(options = {}) {
18
- this._manager = options.manager instanceof agent_manager_1.AgentManager ? options.manager : new agent_manager_1.AgentManager(options.manager);
19
24
  this.buildFunctionMetadata = options.buildFunctionMetadata;
20
25
  this.buildPrompt = options.buildPrompt;
21
- this.buildTaskSendParams = options.buildTaskSendParams;
26
+ this.buildMessageForAgent = options.buildMessageForAgent;
27
+ this.buildMessageFromAgentResponse = options.buildMessageFromAgentResponse;
28
+ this.log = options.logger ?? new teams_common_1.ConsoleLogger('a2a:client');
22
29
  }
23
30
  onUsePlugin(args) {
24
- this._manager.use(args.key, args.url, args.agentCard);
25
- // Store per-agent config (excluding agentCard and url)
26
- const { key, url, agentCard, ...rest } = args;
27
- this._agentConfig.set(key, rest);
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
+ });
28
39
  }
29
40
  async onBuildFunctions(functions) {
30
- const cards = await this._manager.getAgentCards();
31
41
  const allFunctions = [];
32
- for (const cardWithMeta of cards) {
33
- if (!cardWithMeta) {
34
- continue;
35
- }
36
- const { key, card } = cardWithMeta;
37
- const agentConfig = this._agentConfig.get(key) || {};
38
- const buildFunctionMetadata = agentConfig.buildFunctionMetadata ||
39
- this.buildFunctionMetadata ||
40
- this._defaultFunctionMetadata;
41
- const buildTaskSendParams = agentConfig.buildTaskSendParams ||
42
- this.buildTaskSendParams ||
43
- this._defaultBuildTaskSendParams;
44
- const { name, description } = buildFunctionMetadata(card);
45
- allFunctions.push({
46
- name,
47
- description,
48
- parameters: {
49
- type: 'object',
50
- properties: {
51
- message: {
52
- type: 'string',
53
- description: 'Message to send to the agent',
54
- },
55
- continueTaskId: {
56
- type: 'string',
57
- 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
+ },
58
63
  },
64
+ required: ['message'],
59
65
  },
60
- required: ['message'],
61
- },
62
- handler: async (args) => {
63
- const agentMessage = args.message;
64
- if (!agentMessage) {
65
- throw new Error(`An input message is required to call Agent ${name}!`);
66
- }
67
- const continueTaskId = args.continueTaskId != null
68
- ? args.continueTaskId.toLowerCase() === 'none'
69
- ? null
70
- : args.continueTaskId || null
71
- : null;
72
- const sendParams = buildTaskSendParams(card, agentMessage, continueTaskId);
73
- const result = await this._manager.sendTask(key, sendParams);
74
- return result;
75
- },
76
- });
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
+ }
77
109
  }
78
110
  return functions.concat(allFunctions);
79
111
  }
80
- /**
81
- * Modify the system prompt before it is sent to the model.
82
- * If the user supplies a buildPrompt function, it is used. Otherwise, a default is built.
83
- */
84
112
  async onBuildPrompt(systemPrompt) {
85
- const cardsWithMeta = await this._manager.getAgentCards();
86
- // Lookup latest tasks for all agents first
87
- const agentsWithLatestTask = [];
88
- for (const cardWithMeta of cardsWithMeta) {
89
- if (!cardWithMeta) {
90
- continue;
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);
91
130
  }
92
- const { key, card } = cardWithMeta;
93
- const latestTask = await this._manager.getLatestTask(key);
94
- agentsWithLatestTask.push({ card, latestTask });
95
131
  }
96
- // If the user supplied a buildPrompt, use it
132
+ // Use custom buildPrompt if provided, otherwise use default
97
133
  if (this.buildPrompt) {
98
- return this.buildPrompt(systemPrompt, agentsWithLatestTask);
134
+ return this.buildPrompt(systemPrompt, agentPromptParams);
99
135
  }
100
- const prompt = (systemPrompt || '') +
101
- '\n' +
102
- this._defaultBuildPrompt(agentsWithLatestTask);
103
- return prompt;
104
- }
105
- _defaultFunctionMetadata(card) {
106
- const name = `message${(0, camelcase_1.default)(card.name, { pascalCase: true })}`;
107
- const description = card.description || `Interact with agent at ${card.url}`;
108
- return { name, description };
109
- }
110
- _defaultBuildPrompt(agentDetails) {
111
- let details = 'Here are details about available agents that you can message. Determine the best phrasing to use when you are attempting to message them.';
112
- for (const { card, latestTask } of agentDetails) {
113
- details += '<Agent Details>\n';
114
- details += `<Name>\n${card.name || card.url}\n</Name>\n`;
136
+ // Default prompt building
137
+ if (agentPromptParams.length === 0) {
138
+ return systemPrompt;
139
+ }
140
+ const agentDetails = agentPromptParams
141
+ .map(({ card }) => {
142
+ let details = `<Agent Details>\n<Name>\n${card.name}\n</Name>\n`;
115
143
  if (card.description) {
116
144
  details += `<Description>\n${card.description}\n</Description>\n`;
117
145
  }
118
- for (const skill of card.skills || []) {
119
- details += `<SKILL name=${skill.name} description=${skill.description} />\n`;
120
- if (skill.examples) {
121
- details += `<EXAMPLES>\n${skill.examples.join('\n')}\n</EXAMPLES>\n`;
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
+ }
122
152
  }
123
- details += '</SKILL>\n';
124
- }
125
- if (latestTask) {
126
- const lastMessage = latestTask.history && latestTask.history.length > 0
127
- ? latestTask.history[latestTask.history.length - 1].parts
128
- .map((p) => p.type === 'text' ? p.text : '[non-text]')
129
- .join(' ')
130
- : '';
131
- details += `<PREVIOUS_TASK_DETAILS taskId=${latestTask.task.id} state=${latestTask.task.status.state} lastMessage=${lastMessage}\n</PREVIOUS_TASK_DETAILS>`;
132
153
  }
154
+ // Could add client-specific info here if needed
133
155
  details += '</Agent Details>\n';
156
+ return details;
157
+ })
158
+ .join('');
159
+ const prompt = (systemPrompt || '') +
160
+ '\n\nHere are details about available agents that you can message:\n' +
161
+ agentDetails;
162
+ return prompt;
163
+ }
164
+ _defaultFunctionMetadata(card) {
165
+ const name = `message${pascalCase(card.name)}`;
166
+ const description = card.description || `Interact with ${card.name} agent`;
167
+ return { name, description };
168
+ }
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.';
134
192
  }
135
- return details;
136
193
  }
137
- _defaultBuildTaskSendParams(_card, message, continueTaskId, metadata) {
138
- return (0, exports.buildTaskSendParams)(message, metadata, continueTaskId);
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
+ }
139
217
  }
140
218
  }
141
219
  exports.A2AClientPlugin = A2AClientPlugin;
142
- const buildTaskSendParams = (message, metadata, continueTaskId) => {
143
- return {
144
- id: continueTaskId || (0, uuid_1.generateRequestId)().toString(),
145
- message: {
146
- role: 'user',
147
- parts: [{ type: 'text', text: message }],
148
- },
149
- metadata,
150
- };
151
- };
152
- exports.buildTaskSendParams = buildTaskSendParams;
153
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2luLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NoYXQtcHJvbXB0L3BsdWdpbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSwwREFBa0M7QUFPbEMsMkRBQTZFO0FBRTdFLHlDQUFtRDtBQVduRCxNQUFhLGVBQWU7SUFFakIsSUFBSSxHQUFHLEtBQUssQ0FBQztJQUNaLFFBQVEsQ0FBZTtJQUN2QixxQkFBcUIsQ0FBeUI7SUFDOUMsV0FBVyxDQUFlO0lBQzFCLG1CQUFtQixDQUF1QjtJQUMxQyxZQUFZLEdBQTZDLElBQUksR0FBRyxFQUFFLENBQUM7SUFFN0UsWUFBWSxVQUE0QixFQUFFO1FBQ3hDLElBQUksQ0FBQyxRQUFRLEdBQUcsT0FBTyxDQUFDLE9BQU8sWUFBWSw0QkFBWSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLDRCQUFZLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzlHLElBQUksQ0FBQyxxQkFBcUIsR0FBRyxPQUFPLENBQUMscUJBQXFCLENBQUM7UUFDM0QsSUFBSSxDQUFDLFdBQVcsR0FBRyxPQUFPLENBQUMsV0FBVyxDQUFDO1FBQ3ZDLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxPQUFPLENBQUMsbUJBQW1CLENBQUM7SUFDekQsQ0FBQztJQUVELFdBQVcsQ0FBQyxJQUF3QjtRQUNsQyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3RELHVEQUF1RDtRQUN2RCxNQUFNLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxTQUFTLEVBQUUsR0FBRyxJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUM7UUFDOUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDO0lB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
220
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2luLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NoYXQtcHJvbXB0L3BsdWdpbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFDQSwrQ0FBK0M7QUFDL0Msd0VBQXlDO0FBQ3pDLCtCQUFvQztBQU9wQywwREFBaUU7QUF5QmpFLE1BQU0sVUFBVSxHQUFHLENBQUMsR0FBVyxFQUFFLEVBQUU7SUFDakMsT0FBTyxJQUFBLDBCQUFTLEVBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUM7QUFDeEUsQ0FBQyxDQUFDO0FBRUYsTUFBYSxlQUFlO0lBRWpCLElBQUksR0FBRyxLQUFLLENBQUM7SUFFTixHQUFHLENBQVU7SUFDbkIsYUFBYSxHQUE4QixJQUFJLEdBQUcsRUFBRSxDQUFDO0lBQ3JELFFBQVEsR0FBa0MsSUFBSSxHQUFHLEVBQUUsQ0FBQztJQUVwRCxxQkFBcUIsQ0FBeUI7SUFDOUMsV0FBVyxDQUFlO0lBQzFCLG9CQUFvQixDQUF3QjtJQUM1Qyw2QkFBNkIsQ0FBaUM7SUFFeEUsWUFBWSxVQUFrQyxFQUFFO1FBQzlDLElBQUksQ0FBQyxxQkFBcUIsR0FBRyxPQUFPLENBQUMscUJBQXFCLENBQUM7UUFDM0QsSUFBSSxDQUFDLFdBQVcsR0FBRyxPQUFPLENBQUMsV0FBVyxDQUFDO1FBQ3ZDLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxPQUFPLENBQUMsb0JBQW9CLENBQUM7UUFDekQsSUFBSSxDQUFDLDZCQUE2QixHQUFHLE9BQU8sQ0FBQyw2QkFBNkIsQ0FBQztRQUMzRSxJQUFJLENBQUMsR0FBRyxHQUFHLE9BQU8sQ0FBQyxNQUFNLElBQUksSUFBSSw0QkFBYSxDQUFDLFlBQVksQ0FBQyxDQUFDO0lBQy9ELENBQUM7SUFFRCxXQUFXLENBQUMsSUFBd0I7UUFDbEMsbUVBQW1FO1FBQ25FLElB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
@@ -1,60 +1,68 @@
1
- import { AgentManager, AgentManagerOptions } from '../client/agent-manager';
2
- import * as schema from '../common/schema';
3
- import { TaskAndHistory } from '../server/types/a2a-types';
1
+ import { AgentCard, Message, Task } from '@a2a-js/sdk';
2
+ import { A2AClient } from '@a2a-js/sdk/client';
3
+ import { ILogger } from '@microsoft/teams.common';
4
4
  /**
5
- * Parameters for registering an agent with the A2A plugin.
6
- * usage: new ChatPrompt(..., [new A2APlugin(...)]).use(A2APluginParams)
5
+ * New types that use SDK's AgentCard and A2AClient instead of internal schema types
7
6
  */
8
- export type A2APluginUseParams = {
7
+ export type BuildFunctionMetadata = (card: AgentCard) => {
8
+ name: string;
9
+ description: string;
10
+ };
11
+ export type AgentPromptParams = {
12
+ card: AgentCard;
13
+ client: A2AClient;
14
+ };
15
+ export type BuildPrompt = (systemPrompt: string | undefined, agentDetails: AgentPromptParams[]) => string | undefined;
16
+ export type BuildMessageForAgent = (card: AgentCard, input: string, metadata?: Record<string, any>) => Message | string;
17
+ export type BuildMessageFromAgentResponse = (card: AgentCard, response: Task | Message, originalInput: string) => string;
18
+ /**
19
+ * Options for constructing an A2AClientPlugin using the official SDK.
20
+ */
21
+ export type A2AClientPluginOptions = {
9
22
  /**
10
- * Unique key for this agent (used for config and lookup)
23
+ * Optional function to customize the function name and description for each agent card.
11
24
  */
12
- key: string;
25
+ buildFunctionMetadata?: BuildFunctionMetadata;
13
26
  /**
14
- * The agent's base URL
27
+ * Optional function to customize the prompt given all agent cards.
15
28
  */
16
- url: string;
29
+ buildPrompt?: BuildPrompt;
17
30
  /**
18
- * Optional agent card for the agent
31
+ * Optional function to customize the message format sent to each agent.
19
32
  */
20
- agentCard?: schema.AgentCard;
33
+ buildMessageForAgent?: BuildMessageForAgent;
21
34
  /**
22
- * Optional function to customize function metadata for this agent
35
+ * Optional function to customize how agent responses are processed into strings.
23
36
  */
24
- buildFunctionMetadata?: BuildFunctionMetadata;
37
+ buildMessageFromAgentResponse?: BuildMessageFromAgentResponse;
25
38
  /**
26
- * Optional function to customize TaskSendParams for this agent
39
+ * Logger
27
40
  */
28
- buildTaskSendParams?: BuildTaskSendParams;
29
- };
30
- export type AgentPromptParams = {
31
- card: schema.AgentCard;
32
- latestTask?: TaskAndHistory | null;
41
+ logger?: ILogger;
33
42
  };
34
- export type BuildFunctionMetadata = (card: schema.AgentCard) => {
35
- name: string;
36
- description: string;
37
- };
38
- export type BuildTaskSendParams = (card: schema.AgentCard, input: string, continueTaskId?: string | null, metadata?: Record<string, any>) => schema.TaskSendParams;
39
- export type BuildPrompt = (incomingSystemPrompt: string | undefined, agentDetails: AgentPromptParams[]) => string | undefined;
40
43
  /**
41
- * Options for constructing an A2APlugin.
44
+ * Parameters for registering an agent with the A2AClientPlugin.
45
+ * Usage: new ChatPrompt(..., [new A2AClientPlugin(...)]).usePlugin('a2a', A2APluginUseParams)
42
46
  */
43
- export type A2APluginOptions = {
47
+ export type A2APluginUseParams = {
44
48
  /**
45
- * Optional A2AAgentManager instance to use for agent management.
49
+ * Unique key to identify this agent
46
50
  */
47
- manager?: AgentManager | AgentManagerOptions;
51
+ key: string;
48
52
  /**
49
- * Optional function to customize the function name and description for each agent card.
53
+ * URL to the agent's card endpoint
54
+ */
55
+ cardUrl: string;
56
+ /**
57
+ * Custom function metadata builder for this specific agent
50
58
  */
51
59
  buildFunctionMetadata?: BuildFunctionMetadata;
52
60
  /**
53
- * Optional function to customize the prompt given all agent cards.
61
+ * Custom message builder for this specific agent
54
62
  */
55
- buildPrompt?: BuildPrompt;
63
+ buildMessageForAgent?: BuildMessageForAgent;
56
64
  /**
57
- * Optional function to customize TaskSendParams given the input and context.
65
+ * Custom response processor for this specific agent
58
66
  */
59
- buildTaskSendParams?: BuildTaskSendParams;
67
+ buildMessageFromAgentResponse?: BuildMessageFromAgentResponse;
60
68
  };
package/dist/index.d.ts CHANGED
@@ -1,10 +1,3 @@
1
1
  export * from './chat-prompt/plugin';
2
2
  export * from './chat-prompt/types';
3
- export * from './client/agent-client';
4
- export * from './client/agent-manager';
5
- export * from './client/agent-task-store';
6
- export * from './common/schema';
7
- export * as schema from './common/schema';
8
3
  export * from './server/plugin';
9
- export * from './server/types/a2a-types';
10
- export * from './server/types/event-types';
package/dist/index.js CHANGED
@@ -10,41 +10,11 @@ var __createBinding = (this && this.__createBinding) || (Object.create ? (functi
10
10
  if (k2 === undefined) k2 = k;
11
11
  o[k2] = m[k];
12
12
  }));
13
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
- Object.defineProperty(o, "default", { enumerable: true, value: v });
15
- }) : function(o, v) {
16
- o["default"] = v;
17
- });
18
13
  var __exportStar = (this && this.__exportStar) || function(m, exports) {
19
14
  for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
20
15
  };
21
- var __importStar = (this && this.__importStar) || (function () {
22
- var ownKeys = function(o) {
23
- ownKeys = Object.getOwnPropertyNames || function (o) {
24
- var ar = [];
25
- for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
26
- return ar;
27
- };
28
- return ownKeys(o);
29
- };
30
- return function (mod) {
31
- if (mod && mod.__esModule) return mod;
32
- var result = {};
33
- if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
34
- __setModuleDefault(result, mod);
35
- return result;
36
- };
37
- })();
38
16
  Object.defineProperty(exports, "__esModule", { value: true });
39
- exports.schema = void 0;
40
17
  __exportStar(require("./chat-prompt/plugin"), exports);
41
18
  __exportStar(require("./chat-prompt/types"), exports);
42
- __exportStar(require("./client/agent-client"), exports);
43
- __exportStar(require("./client/agent-manager"), exports);
44
- __exportStar(require("./client/agent-task-store"), exports);
45
- __exportStar(require("./common/schema"), exports);
46
- exports.schema = __importStar(require("./common/schema"));
47
19
  __exportStar(require("./server/plugin"), exports);
48
- __exportStar(require("./server/types/a2a-types"), exports);
49
- __exportStar(require("./server/types/event-types"), exports);
50
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsdURBQXFDO0FBQ3JDLHNEQUFvQztBQUNwQyx3REFBc0M7QUFDdEMseURBQXVDO0FBQ3ZDLDREQUEwQztBQUMxQyxrREFBZ0M7QUFDaEMsMERBQTBDO0FBQzFDLGtEQUFnQztBQUNoQywyREFBeUM7QUFDekMsNkRBQTJDIn0=
20
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLHVEQUFxQztBQUNyQyxzREFBb0M7QUFDcEMsa0RBQWdDIn0=