@microsoft/teams.a2a 2.0.0-preview.10 → 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.
@@ -0,0 +1,215 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
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 pascalCase = (str) => {
11
+ return (0, lodash_camelcase_1.default)(str).replace(/^(.)/, (match) => match.toUpperCase());
12
+ };
13
+ class A2AClientPlugin {
14
+ name = 'a2a';
15
+ _agentConfigs = new Map();
16
+ _clients = new Map();
17
+ buildFunctionMetadata;
18
+ buildPrompt;
19
+ buildMessageForAgent;
20
+ buildMessageFromAgentResponse;
21
+ constructor(options = {}) {
22
+ this.buildFunctionMetadata = options.buildFunctionMetadata;
23
+ this.buildPrompt = options.buildPrompt;
24
+ this.buildMessageForAgent = options.buildMessageForAgent;
25
+ this.buildMessageFromAgentResponse = options.buildMessageFromAgentResponse;
26
+ }
27
+ onUsePlugin(args) {
28
+ // Just store the config, defer client creation to onBuildFunctions
29
+ this._agentConfigs.set(args.key, {
30
+ key: args.key,
31
+ cardUrl: args.cardUrl,
32
+ buildFunctionMetadata: args.buildFunctionMetadata,
33
+ buildMessageForAgent: args.buildMessageForAgent,
34
+ buildMessageFromAgentResponse: args.buildMessageFromAgentResponse,
35
+ });
36
+ }
37
+ async onBuildFunctions(functions) {
38
+ const allFunctions = [];
39
+ for (const [key, config] of this._agentConfigs) {
40
+ try {
41
+ // Get agent card (which internally gets or creates client)
42
+ const agentCard = await this._getAgentCard(key, config);
43
+ if (!agentCard) {
44
+ continue; // Skip if we couldn't get the agent card
45
+ }
46
+ // Use custom function metadata builder or default
47
+ const buildMetadata = config.buildFunctionMetadata ||
48
+ this.buildFunctionMetadata ||
49
+ this._defaultFunctionMetadata;
50
+ const { name, description } = buildMetadata(agentCard);
51
+ allFunctions.push({
52
+ name,
53
+ description,
54
+ parameters: {
55
+ type: 'object',
56
+ properties: {
57
+ message: {
58
+ type: 'string',
59
+ description: 'Message to send to the agent',
60
+ },
61
+ },
62
+ required: ['message'],
63
+ },
64
+ handler: (async (args) => {
65
+ try {
66
+ const agentMessage = args.message;
67
+ // Use custom message builder if provided, otherwise use default
68
+ const buildMessage = config.buildMessageForAgent ||
69
+ this.buildMessageForAgent ||
70
+ this._defaultBuildMessage.bind(this);
71
+ const messageOrString = buildMessage(agentCard, agentMessage);
72
+ // Handle both Message and string returns
73
+ const message = typeof messageOrString === 'string'
74
+ ? this._createMessage(messageOrString, agentCard)
75
+ : messageOrString;
76
+ const sendParams = { message };
77
+ // Get the client info to send the message
78
+ const clientInfo = this._clients.get(key);
79
+ if (!clientInfo) {
80
+ throw new Error(`Client not found for agent ${key}`);
81
+ }
82
+ const response = await clientInfo.client.sendMessage(sendParams);
83
+ if ('error' in response) {
84
+ return response.error.message;
85
+ }
86
+ const result = response.result;
87
+ // Use custom response builder if provided, otherwise use default
88
+ const buildResponse = config.buildMessageFromAgentResponse ||
89
+ this.buildMessageFromAgentResponse ||
90
+ this._defaultBuildMessageFromAgentResponse.bind(this);
91
+ return buildResponse(agentCard, result, agentMessage);
92
+ }
93
+ catch (e) {
94
+ console.error(e);
95
+ throw e;
96
+ }
97
+ }).bind(this),
98
+ });
99
+ }
100
+ catch (error) {
101
+ console.error(`Failed to build function for agent ${key}:`, error);
102
+ // Continue with other agents even if one fails
103
+ }
104
+ }
105
+ return functions.concat(allFunctions);
106
+ }
107
+ async onBuildPrompt(systemPrompt) {
108
+ // Collect agent details for prompt building
109
+ const agentPromptParams = [];
110
+ for (const [key, config] of this._agentConfigs) {
111
+ try {
112
+ const agentCard = await this._getAgentCard(key, config);
113
+ if (agentCard) {
114
+ const clientInfo = this._clients.get(key);
115
+ if (clientInfo) {
116
+ agentPromptParams.push({
117
+ card: agentCard,
118
+ client: clientInfo.client,
119
+ });
120
+ }
121
+ }
122
+ }
123
+ catch (error) {
124
+ console.error(`Failed to get agent card for ${key}:`, error);
125
+ }
126
+ }
127
+ // Use custom buildPrompt if provided, otherwise use default
128
+ if (this.buildPrompt) {
129
+ return this.buildPrompt(systemPrompt, agentPromptParams);
130
+ }
131
+ // Default prompt building
132
+ if (agentPromptParams.length === 0) {
133
+ return systemPrompt;
134
+ }
135
+ const agentDetails = agentPromptParams
136
+ .map(({ card }) => {
137
+ let details = `<Agent Details>\n<Name>\n${card.name}\n</Name>\n`;
138
+ if (card.description) {
139
+ details += `<Description>\n${card.description}\n</Description>\n`;
140
+ }
141
+ if (card.skills?.length) {
142
+ for (const skill of card.skills) {
143
+ details += `<SKILL name="${skill.name}" description="${skill.description}" />\n`;
144
+ if (skill.examples?.length) {
145
+ details += `<EXAMPLES>\n${skill.examples.join('\n')}\n</EXAMPLES>\n`;
146
+ }
147
+ }
148
+ }
149
+ // Could add client-specific info here if needed
150
+ details += '</Agent Details>\n';
151
+ return details;
152
+ })
153
+ .join('');
154
+ const prompt = (systemPrompt || '') +
155
+ '\n\nHere are details about available agents that you can message:\n' +
156
+ agentDetails;
157
+ return prompt;
158
+ }
159
+ _defaultFunctionMetadata(card) {
160
+ const name = `message${pascalCase(card.name)}`;
161
+ const description = card.description || `Interact with ${card.name} agent`;
162
+ return { name, description };
163
+ }
164
+ _defaultBuildMessage(card, input, metadata) {
165
+ return this._createMessage(input, card, metadata);
166
+ }
167
+ _createMessage(text, _card, metadata) {
168
+ return {
169
+ messageId: (0, uuid_1.v4)(),
170
+ role: 'user', // Messages TO agents are from user perspective
171
+ parts: [{ kind: 'text', text }],
172
+ kind: 'message',
173
+ // Include metadata if provided
174
+ ...(metadata && { metadata }),
175
+ };
176
+ }
177
+ _defaultBuildMessageFromAgentResponse(_card, response, _originalInput) {
178
+ // Extract text from response parts
179
+ if (response.kind === 'message') {
180
+ const textParts = response.parts
181
+ .filter((part) => part.kind === 'text')
182
+ .map(part => part.text);
183
+ return textParts.join(' ') || 'Agent responded with no text content.';
184
+ }
185
+ else {
186
+ return 'Agent responded with non-message content.';
187
+ }
188
+ }
189
+ async _getAgentCard(key, config) {
190
+ // Return cached client info if it exists
191
+ let clientInfo = this._clients.get(key);
192
+ if (clientInfo) {
193
+ return clientInfo.agentCard;
194
+ }
195
+ // Create new client and get agent card
196
+ try {
197
+ const client = await client_1.A2AClient.fromCardUrl(config.cardUrl);
198
+ // Get the agent card from the client
199
+ const agentCard = await client.getAgentCard();
200
+ clientInfo = {
201
+ ...config,
202
+ client,
203
+ agentCard,
204
+ };
205
+ this._clients.set(key, clientInfo);
206
+ return agentCard;
207
+ }
208
+ catch (error) {
209
+ console.error(`Error creating client or fetching agent card for ${key}:`, error);
210
+ return null;
211
+ }
212
+ }
213
+ }
214
+ exports.A2AClientPlugin = A2AClientPlugin;
215
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2luMi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jaGF0LXByb21wdC9wbHVnaW4yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUNBLCtDQUErQztBQUMvQyx3RUFBeUM7QUFDekMsK0JBQW9DO0FBMEZwQyxNQUFNLFVBQVUsR0FBRyxDQUFDLEdBQVcsRUFBRSxFQUFFO0lBQ2pDLE9BQU8sSUFBQSwwQkFBUyxFQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDO0FBQ3hFLENBQUMsQ0FBQztBQUVGLE1BQWEsZUFBZTtJQUVqQixJQUFJLEdBQUcsS0FBSyxDQUFDO0lBRVosYUFBYSxHQUE4QixJQUFJLEdBQUcsRUFBRSxDQUFDO0lBQ3JELFFBQVEsR0FBa0MsSUFBSSxHQUFHLEVBQUUsQ0FBQztJQUNwRCxxQkFBcUIsQ0FBNEI7SUFDakQsV0FBVyxDQUFrQjtJQUM3QixvQkFBb0IsQ0FBd0I7SUFDNUMsNkJBQTZCLENBQWlDO0lBRXhFLFlBQVksVUFBa0MsRUFBRTtRQUM5QyxJQUFJLENBQUMscUJBQXFCLEdBQUcsT0FBTyxDQUFDLHFCQUFxQixDQUFDO1FBQzNELElBQUksQ0FBQyxXQUFXLEdBQUcsT0FBTyxDQUFDLFdBQVcsQ0FBQztRQUN2QyxJQUFJLENBQUMsb0JBQW9CLEdBQUcsT0FBTyxDQUFDLG9CQUFvQixDQUFDO1FBQ3pELElBQUksQ0FBQyw2QkFBNkIsR0FBRyxPQUFPLENBQUMsNkJBQTZCLENBQUM7SUFDN0UsQ0FBQztJQUVELFdBQVcsQ0FBQyxJQUF3QjtRQUNsQyxtRUFBbUU7UUFDbkUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRTtZQUMvQixHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUc7WUFDYixPQUFPLEVBQUUsSUFBSSxDQUFD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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=
@@ -1,15 +1,13 @@
1
+ import { AgentCard, Message, Task } from '@a2a-js/sdk';
2
+ import { A2ARequestHandler, AgentExecutor, ExecutionEventBus, RequestContext, TaskStore } from '@a2a-js/sdk/server';
3
+ import { RequestHandler } from 'express';
1
4
  import { EmitPluginEvent, HttpPlugin, IPlugin } from '@microsoft/teams.apps';
2
- import { ILogger, IStorage } from '@microsoft/teams.common';
3
- import { AgentManager, AgentManagerOptions } from '../client/agent-manager';
4
- import * as schema from '../common/schema';
5
- import { TaskManager } from './tasks/task-manager';
6
- import { TaskStore } from './tasks/task-store';
7
- import { A2AEvents } from './types/event-types';
5
+ import { ILogger } from '@microsoft/teams.common';
8
6
  interface IA2APluginOptions {
9
7
  /**
10
8
  * The agent card to be used for the A2A plugin.
11
9
  */
12
- agentCard: schema.AgentCard;
10
+ agentCard: AgentCard;
13
11
  /**
14
12
  * Path to the A2A server
15
13
  * @default '/a2a'
@@ -21,29 +19,34 @@ interface IA2APluginOptions {
21
19
  */
22
20
  taskStore?: TaskStore;
23
21
  /**
24
- * The agent manager options that can be used to configure the agent manager.
25
- * @default {}
26
- */
27
- managerOptions?: AgentManagerOptions;
22
+ * For a completely custom executor, you may provide your own executor that will
23
+ * get executed whenever the a2a agent is InMemoryTaskStore
24
+ */
25
+ agentExecutor?: AgentExecutor;
28
26
  }
27
+ export type Respond = (message: string | Message | Task) => Promise<void>;
28
+ export type A2AEvents = {
29
+ 'a2a:message': {
30
+ requestContext: RequestContext;
31
+ respond: Respond;
32
+ publishUpdate: ExecutionEventBus['publish'];
33
+ };
34
+ };
29
35
  export declare class A2APlugin implements IPlugin {
36
+ readonly log: ILogger;
30
37
  protected readonly emit: EmitPluginEvent<A2AEvents>;
31
38
  protected readonly _httpPlugin: HttpPlugin;
32
- protected readonly _storage: IStorage;
33
- protected readonly _logger: ILogger;
34
39
  __eventType: A2AEvents;
35
- protected _card: schema.AgentCard;
36
- protected _path: string;
37
- protected _taskManager: TaskManager;
38
- protected _taskStore: TaskStore;
39
- protected _clientManager: AgentManager;
40
- get clientManager(): AgentManager;
40
+ readonly card: AgentCard;
41
+ readonly path: string;
42
+ readonly taskStore: TaskStore;
43
+ readonly customExecutor?: AgentExecutor;
44
+ private readonly middlewares;
41
45
  constructor(options: IA2APluginOptions);
46
+ use(middleware: RequestHandler): void;
42
47
  onInit(): void;
43
- private onTaskRequest;
44
- private onSendRequest;
45
- private onGetTaskRequest;
46
- private onTaskGetRequest;
47
- private onTaskSendRequest;
48
+ _createLoggingMiddleware(): RequestHandler;
49
+ _setupExecutor(): AgentExecutor;
50
+ _setupRequestHandler(): A2ARequestHandler;
48
51
  }
49
52
  export {};