@mastra/client-js 0.0.0-mcp-changeset-20250707162621 → 0.0.0-memory-system-message-error-20250813233316
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/CHANGELOG.md +527 -2
- package/LICENSE.md +11 -42
- package/README.md +1 -0
- package/dist/adapters/agui.d.ts +23 -0
- package/dist/adapters/agui.d.ts.map +1 -0
- package/dist/client.d.ts +270 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/example.d.ts +2 -0
- package/dist/example.d.ts.map +1 -0
- package/dist/index.cjs +333 -98
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.ts +4 -1164
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +332 -97
- package/dist/index.js.map +1 -0
- package/dist/resources/a2a.d.ts +41 -0
- package/dist/resources/a2a.d.ts.map +1 -0
- package/dist/resources/agent.d.ts +123 -0
- package/dist/resources/agent.d.ts.map +1 -0
- package/dist/resources/base.d.ts +13 -0
- package/dist/resources/base.d.ts.map +1 -0
- package/dist/resources/index.d.ts +11 -0
- package/dist/resources/index.d.ts.map +1 -0
- package/dist/resources/legacy-workflow.d.ts +87 -0
- package/dist/resources/legacy-workflow.d.ts.map +1 -0
- package/dist/resources/mcp-tool.d.ts +27 -0
- package/dist/resources/mcp-tool.d.ts.map +1 -0
- package/dist/resources/memory-thread.d.ts +53 -0
- package/dist/resources/memory-thread.d.ts.map +1 -0
- package/dist/resources/network-memory-thread.d.ts +47 -0
- package/dist/resources/network-memory-thread.d.ts.map +1 -0
- package/dist/resources/network.d.ts +30 -0
- package/dist/resources/network.d.ts.map +1 -0
- package/dist/resources/tool.d.ts +23 -0
- package/dist/resources/tool.d.ts.map +1 -0
- package/dist/resources/vNextNetwork.d.ts +42 -0
- package/dist/resources/vNextNetwork.d.ts.map +1 -0
- package/dist/resources/vector.d.ts +48 -0
- package/dist/resources/vector.d.ts.map +1 -0
- package/dist/resources/workflow.d.ts +154 -0
- package/dist/resources/workflow.d.ts.map +1 -0
- package/dist/types.d.ts +422 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/utils/index.d.ts +3 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/process-client-tools.d.ts +3 -0
- package/dist/utils/process-client-tools.d.ts.map +1 -0
- package/dist/utils/zod-to-json-schema.d.ts +105 -0
- package/dist/utils/zod-to-json-schema.d.ts.map +1 -0
- package/integration-tests/agui-adapter.test.ts +122 -0
- package/integration-tests/package.json +18 -0
- package/integration-tests/src/mastra/index.ts +35 -0
- package/integration-tests/vitest.config.ts +9 -0
- package/package.json +15 -9
- package/src/adapters/agui.test.ts +145 -3
- package/src/adapters/agui.ts +29 -11
- package/src/client.ts +153 -2
- package/src/example.ts +45 -17
- package/src/index.test.ts +402 -6
- package/src/index.ts +1 -0
- package/src/resources/a2a.ts +35 -25
- package/src/resources/agent.ts +58 -24
- package/src/resources/base.ts +6 -1
- package/src/resources/memory-thread.test.ts +285 -0
- package/src/resources/memory-thread.ts +36 -0
- package/src/resources/network-memory-thread.test.ts +269 -0
- package/src/resources/network-memory-thread.ts +18 -0
- package/src/resources/network.ts +4 -3
- package/src/resources/vNextNetwork.ts +22 -5
- package/src/resources/workflow.ts +17 -3
- package/src/types.ts +90 -10
- package/src/utils/process-client-tools.ts +1 -1
- package/src/v2-messages.test.ts +180 -0
- package/tsconfig.build.json +9 -0
- package/tsconfig.json +1 -1
- package/tsup.config.ts +17 -0
- package/.turbo/turbo-build.log +0 -19
- package/dist/index.d.cts +0 -1164
package/src/index.test.ts
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import { describe, expect, beforeEach, it, vi } from 'vitest';
|
|
2
2
|
import { MastraClient } from './client';
|
|
3
|
-
import type { McpServerListResponse
|
|
3
|
+
import type { McpServerListResponse } from './types';
|
|
4
|
+
import type { ServerDetailInfo } from '@mastra/core/mcp';
|
|
5
|
+
import { ScoringEntityType, ScoringSource } from '@mastra/core/scores';
|
|
4
6
|
|
|
5
7
|
// Mock fetch globally
|
|
6
8
|
global.fetch = vi.fn();
|
|
@@ -27,7 +29,13 @@ describe('MastraClient Resources', () => {
|
|
|
27
29
|
} else {
|
|
28
30
|
responseBody = new ReadableStream({
|
|
29
31
|
start(controller) {
|
|
30
|
-
|
|
32
|
+
if (typeof data === 'string') {
|
|
33
|
+
controller.enqueue(new TextEncoder().encode(data));
|
|
34
|
+
} else if (typeof data === 'object' && data !== null) {
|
|
35
|
+
controller.enqueue(new TextEncoder().encode(JSON.stringify(data)));
|
|
36
|
+
} else {
|
|
37
|
+
controller.enqueue(new TextEncoder().encode(String(data)));
|
|
38
|
+
}
|
|
31
39
|
controller.close();
|
|
32
40
|
},
|
|
33
41
|
});
|
|
@@ -279,7 +287,7 @@ describe('MastraClient Resources', () => {
|
|
|
279
287
|
});
|
|
280
288
|
|
|
281
289
|
it('should stream responses', async () => {
|
|
282
|
-
const mockChunk =
|
|
290
|
+
const mockChunk = `0:"test response"\n`;
|
|
283
291
|
mockFetchResponse(mockChunk, { isStream: true });
|
|
284
292
|
|
|
285
293
|
const response = await agent.stream({
|
|
@@ -298,10 +306,118 @@ describe('MastraClient Resources', () => {
|
|
|
298
306
|
if (reader) {
|
|
299
307
|
const { value, done } = await reader.read();
|
|
300
308
|
expect(done).toBe(false);
|
|
301
|
-
expect(new TextDecoder().decode(value)).toBe(
|
|
309
|
+
expect(new TextDecoder().decode(value)).toBe(mockChunk);
|
|
302
310
|
}
|
|
303
311
|
});
|
|
304
312
|
|
|
313
|
+
it('should stream responses with tool calls', async () => {
|
|
314
|
+
const firstMockChunk = `0:"test "
|
|
315
|
+
0:"response"
|
|
316
|
+
9:{"toolCallId":"tool1","toolName":"testTool","args":{"arg1":"value1"}}
|
|
317
|
+
e:{"finishReason":"tool-calls","usage":{"promptTokens":1,"completionTokens":1},"isContinued":false}
|
|
318
|
+
d:{"finishReason":"tool-calls","usage":{"promptTokens":2,"completionTokens":2}}
|
|
319
|
+
`;
|
|
320
|
+
|
|
321
|
+
const secondMockChunk = `0:"final response"
|
|
322
|
+
e:{"finishReason":"stop","usage":{"promptTokens":2,"completionTokens":2},"isContinued":false}
|
|
323
|
+
d:{"finishReason":"stop","usage":{"promptTokens":2,"completionTokens":2}}
|
|
324
|
+
`;
|
|
325
|
+
|
|
326
|
+
const firstResponseBody = new ReadableStream({
|
|
327
|
+
start(controller) {
|
|
328
|
+
controller.enqueue(new TextEncoder().encode(firstMockChunk));
|
|
329
|
+
controller.close();
|
|
330
|
+
},
|
|
331
|
+
});
|
|
332
|
+
|
|
333
|
+
const secondResponseBody = new ReadableStream({
|
|
334
|
+
start(controller) {
|
|
335
|
+
controller.enqueue(new TextEncoder().encode(secondMockChunk));
|
|
336
|
+
controller.close();
|
|
337
|
+
},
|
|
338
|
+
});
|
|
339
|
+
|
|
340
|
+
(global.fetch as any)
|
|
341
|
+
.mockResolvedValueOnce(
|
|
342
|
+
new Response(firstResponseBody, {
|
|
343
|
+
status: 200,
|
|
344
|
+
headers: new Headers({ 'Content-Type': 'text/event-stream' }),
|
|
345
|
+
}),
|
|
346
|
+
)
|
|
347
|
+
.mockResolvedValueOnce(
|
|
348
|
+
new Response(secondResponseBody, {
|
|
349
|
+
status: 200,
|
|
350
|
+
headers: new Headers({ 'Content-Type': 'text/event-stream' }),
|
|
351
|
+
}),
|
|
352
|
+
);
|
|
353
|
+
|
|
354
|
+
const response = await agent.stream({
|
|
355
|
+
messages: [
|
|
356
|
+
{
|
|
357
|
+
role: 'user',
|
|
358
|
+
content: 'test',
|
|
359
|
+
},
|
|
360
|
+
],
|
|
361
|
+
clientTools: {
|
|
362
|
+
testTool: {
|
|
363
|
+
id: 'testTool',
|
|
364
|
+
description: 'Test Tool',
|
|
365
|
+
inputSchema: {
|
|
366
|
+
type: 'object',
|
|
367
|
+
properties: {
|
|
368
|
+
arg1: { type: 'string' },
|
|
369
|
+
},
|
|
370
|
+
},
|
|
371
|
+
execute: async () => {
|
|
372
|
+
return 'test result';
|
|
373
|
+
},
|
|
374
|
+
},
|
|
375
|
+
},
|
|
376
|
+
});
|
|
377
|
+
|
|
378
|
+
expect(response.body).toBeInstanceOf(ReadableStream);
|
|
379
|
+
const reader = response?.body?.getReader();
|
|
380
|
+
expect(reader).toBeDefined();
|
|
381
|
+
|
|
382
|
+
let output = '';
|
|
383
|
+
if (reader) {
|
|
384
|
+
while (true) {
|
|
385
|
+
const { value, done } = await reader.read();
|
|
386
|
+
if (done) break;
|
|
387
|
+
output += new TextDecoder().decode(value);
|
|
388
|
+
}
|
|
389
|
+
}
|
|
390
|
+
|
|
391
|
+
expect(global.fetch).toHaveBeenCalledTimes(2);
|
|
392
|
+
|
|
393
|
+
const [secondUrl, secondConfig] = (global.fetch as any).mock.calls[1];
|
|
394
|
+
expect(secondUrl).toBe(`${clientOptions.baseUrl}/api/agents/test-agent/stream`);
|
|
395
|
+
|
|
396
|
+
const secondRequestBody = JSON.parse(secondConfig.body);
|
|
397
|
+
expect(secondRequestBody.messages).toHaveLength(2);
|
|
398
|
+
expect(secondRequestBody.messages[0].content).toBe('test');
|
|
399
|
+
expect(secondRequestBody.messages[1].content).toBe('test response');
|
|
400
|
+
expect(secondRequestBody.messages[1].parts).toEqual([
|
|
401
|
+
{
|
|
402
|
+
type: 'text',
|
|
403
|
+
text: 'test response',
|
|
404
|
+
},
|
|
405
|
+
{
|
|
406
|
+
type: 'tool-invocation',
|
|
407
|
+
toolInvocation: {
|
|
408
|
+
state: 'result',
|
|
409
|
+
step: 0,
|
|
410
|
+
toolCallId: 'tool1',
|
|
411
|
+
toolName: 'testTool',
|
|
412
|
+
args: {
|
|
413
|
+
arg1: 'value1',
|
|
414
|
+
},
|
|
415
|
+
result: 'test result',
|
|
416
|
+
},
|
|
417
|
+
},
|
|
418
|
+
]);
|
|
419
|
+
});
|
|
420
|
+
|
|
305
421
|
it('should get agent tool', async () => {
|
|
306
422
|
const mockResponse = {
|
|
307
423
|
id: 'tool1',
|
|
@@ -582,6 +698,48 @@ describe('MastraClient Resources', () => {
|
|
|
582
698
|
}),
|
|
583
699
|
);
|
|
584
700
|
});
|
|
701
|
+
|
|
702
|
+
it('should get paginated thread messages', async () => {
|
|
703
|
+
const mockResponse = {
|
|
704
|
+
messages: [
|
|
705
|
+
{
|
|
706
|
+
id: '1',
|
|
707
|
+
content: 'test message',
|
|
708
|
+
threadId,
|
|
709
|
+
role: 'user',
|
|
710
|
+
type: 'text',
|
|
711
|
+
resourceId: 'test-resource',
|
|
712
|
+
createdAt: new Date(),
|
|
713
|
+
},
|
|
714
|
+
],
|
|
715
|
+
total: 5,
|
|
716
|
+
page: 1,
|
|
717
|
+
perPage: 2,
|
|
718
|
+
hasMore: true,
|
|
719
|
+
};
|
|
720
|
+
mockFetchResponse(mockResponse);
|
|
721
|
+
|
|
722
|
+
const selectBy = {
|
|
723
|
+
pagination: {
|
|
724
|
+
page: 1,
|
|
725
|
+
perPage: 2,
|
|
726
|
+
},
|
|
727
|
+
};
|
|
728
|
+
|
|
729
|
+
const result = await memoryThread.getMessagesPaginated({
|
|
730
|
+
resourceId: 'test-resource',
|
|
731
|
+
format: 'v2',
|
|
732
|
+
selectBy,
|
|
733
|
+
});
|
|
734
|
+
|
|
735
|
+
expect(result).toEqual(mockResponse);
|
|
736
|
+
expect(global.fetch).toHaveBeenCalledWith(
|
|
737
|
+
`${clientOptions.baseUrl}/api/memory/threads/${threadId}/messages/paginated?resourceId=test-resource&format=v2&selectBy=${encodeURIComponent(JSON.stringify(selectBy))}`,
|
|
738
|
+
expect.objectContaining({
|
|
739
|
+
headers: expect.objectContaining(clientOptions.headers),
|
|
740
|
+
}),
|
|
741
|
+
);
|
|
742
|
+
});
|
|
585
743
|
});
|
|
586
744
|
|
|
587
745
|
describe('Tool Resource', () => {
|
|
@@ -662,14 +820,14 @@ describe('MastraClient Resources', () => {
|
|
|
662
820
|
};
|
|
663
821
|
mockFetchResponse(mockResponse);
|
|
664
822
|
|
|
665
|
-
const result = await workflow.startAsync({
|
|
823
|
+
const result = await workflow.startAsync({ inputData: { test: 'test' } });
|
|
666
824
|
expect(result).toEqual(mockResponse);
|
|
667
825
|
expect(global.fetch).toHaveBeenCalledWith(
|
|
668
826
|
`${clientOptions.baseUrl}/api/workflows/test-workflow/start-async?`,
|
|
669
827
|
expect.objectContaining({
|
|
670
828
|
method: 'POST',
|
|
671
829
|
headers: expect.objectContaining(clientOptions.headers),
|
|
672
|
-
body: JSON.stringify({ test: 'test' }),
|
|
830
|
+
body: JSON.stringify({ inputData: { test: 'test' } }),
|
|
673
831
|
}),
|
|
674
832
|
);
|
|
675
833
|
});
|
|
@@ -827,4 +985,242 @@ describe('MastraClient Resources', () => {
|
|
|
827
985
|
});
|
|
828
986
|
});
|
|
829
987
|
});
|
|
988
|
+
|
|
989
|
+
describe('Scores Methods', () => {
|
|
990
|
+
describe('getScorers()', () => {
|
|
991
|
+
it('should fetch all available scorers', async () => {
|
|
992
|
+
const mockResponse = {
|
|
993
|
+
scorers: [
|
|
994
|
+
{ id: 'scorer-1', name: 'Test Scorer 1', description: 'A test scorer' },
|
|
995
|
+
{ id: 'scorer-2', name: 'Test Scorer 2', description: 'Another test scorer' },
|
|
996
|
+
],
|
|
997
|
+
};
|
|
998
|
+
mockFetchResponse(mockResponse);
|
|
999
|
+
|
|
1000
|
+
const result = await client.getScorers();
|
|
1001
|
+
expect(result).toEqual(mockResponse);
|
|
1002
|
+
expect(global.fetch).toHaveBeenCalledWith(
|
|
1003
|
+
`${clientOptions.baseUrl}/api/scores/scorers`,
|
|
1004
|
+
expect.objectContaining({
|
|
1005
|
+
headers: expect.objectContaining(clientOptions.headers),
|
|
1006
|
+
}),
|
|
1007
|
+
);
|
|
1008
|
+
});
|
|
1009
|
+
});
|
|
1010
|
+
|
|
1011
|
+
describe('getScoresByRunId()', () => {
|
|
1012
|
+
it('should fetch scores by run ID without pagination', async () => {
|
|
1013
|
+
const mockResponse = {
|
|
1014
|
+
pagination: {
|
|
1015
|
+
total: 10,
|
|
1016
|
+
page: 0,
|
|
1017
|
+
perPage: 10,
|
|
1018
|
+
hasMore: false,
|
|
1019
|
+
},
|
|
1020
|
+
scores: [
|
|
1021
|
+
{
|
|
1022
|
+
id: 'score-1',
|
|
1023
|
+
runId: 'run-123',
|
|
1024
|
+
scorer: { name: 'test-scorer' },
|
|
1025
|
+
result: { score: 0.8 },
|
|
1026
|
+
input: { messages: [] },
|
|
1027
|
+
output: { response: 'test' },
|
|
1028
|
+
source: 'LIVE',
|
|
1029
|
+
createdAt: new Date(),
|
|
1030
|
+
updatedAt: new Date(),
|
|
1031
|
+
},
|
|
1032
|
+
],
|
|
1033
|
+
};
|
|
1034
|
+
|
|
1035
|
+
mockFetchResponse({
|
|
1036
|
+
...mockResponse,
|
|
1037
|
+
scores: mockResponse.scores.map(score => ({
|
|
1038
|
+
...score,
|
|
1039
|
+
createdAt: score.createdAt.toISOString(),
|
|
1040
|
+
updatedAt: score.updatedAt.toISOString(),
|
|
1041
|
+
})),
|
|
1042
|
+
});
|
|
1043
|
+
|
|
1044
|
+
const result = await client.getScoresByRunId({ runId: 'run-123' });
|
|
1045
|
+
|
|
1046
|
+
expect(result).toEqual({
|
|
1047
|
+
...mockResponse,
|
|
1048
|
+
scores: mockResponse.scores.map(score => ({
|
|
1049
|
+
...score,
|
|
1050
|
+
createdAt: score.createdAt.toISOString(),
|
|
1051
|
+
updatedAt: score.updatedAt.toISOString(),
|
|
1052
|
+
})),
|
|
1053
|
+
});
|
|
1054
|
+
|
|
1055
|
+
expect(global.fetch).toHaveBeenCalledWith(
|
|
1056
|
+
`${clientOptions.baseUrl}/api/scores/run/run-123`,
|
|
1057
|
+
expect.objectContaining({
|
|
1058
|
+
headers: expect.objectContaining(clientOptions.headers),
|
|
1059
|
+
}),
|
|
1060
|
+
);
|
|
1061
|
+
});
|
|
1062
|
+
|
|
1063
|
+
it('should fetch scores by run ID with pagination', async () => {
|
|
1064
|
+
const mockResponse = {
|
|
1065
|
+
pagination: {
|
|
1066
|
+
total: 20,
|
|
1067
|
+
page: 1,
|
|
1068
|
+
perPage: 5,
|
|
1069
|
+
hasMore: true,
|
|
1070
|
+
},
|
|
1071
|
+
scores: [],
|
|
1072
|
+
};
|
|
1073
|
+
mockFetchResponse(mockResponse);
|
|
1074
|
+
|
|
1075
|
+
const result = await client.getScoresByRunId({
|
|
1076
|
+
runId: 'run-123',
|
|
1077
|
+
page: 1,
|
|
1078
|
+
perPage: 5,
|
|
1079
|
+
});
|
|
1080
|
+
expect(result).toEqual(mockResponse);
|
|
1081
|
+
expect(global.fetch).toHaveBeenCalledWith(
|
|
1082
|
+
`${clientOptions.baseUrl}/api/scores/run/run-123?page=1&perPage=5`,
|
|
1083
|
+
expect.objectContaining({
|
|
1084
|
+
headers: expect.objectContaining(clientOptions.headers),
|
|
1085
|
+
}),
|
|
1086
|
+
);
|
|
1087
|
+
});
|
|
1088
|
+
});
|
|
1089
|
+
|
|
1090
|
+
describe('getScoresByEntityId()', () => {
|
|
1091
|
+
it('should fetch scores by entity ID and type without pagination', async () => {
|
|
1092
|
+
const mockResponse = {
|
|
1093
|
+
pagination: {
|
|
1094
|
+
total: 5,
|
|
1095
|
+
page: 0,
|
|
1096
|
+
perPage: 10,
|
|
1097
|
+
hasMore: false,
|
|
1098
|
+
},
|
|
1099
|
+
scores: [
|
|
1100
|
+
{
|
|
1101
|
+
id: 'score-1',
|
|
1102
|
+
runId: 'run-123',
|
|
1103
|
+
entityId: 'agent-456',
|
|
1104
|
+
entityType: 'AGENT',
|
|
1105
|
+
scorer: { name: 'test-scorer' },
|
|
1106
|
+
result: { score: 0.9 },
|
|
1107
|
+
input: { messages: [] },
|
|
1108
|
+
output: { response: 'test' },
|
|
1109
|
+
source: 'LIVE',
|
|
1110
|
+
createdAt: new Date(),
|
|
1111
|
+
updatedAt: new Date(),
|
|
1112
|
+
},
|
|
1113
|
+
],
|
|
1114
|
+
};
|
|
1115
|
+
|
|
1116
|
+
const mockResponseWithDates = mockResponse.scores.map(score => ({
|
|
1117
|
+
...score,
|
|
1118
|
+
createdAt: score.createdAt.toISOString(),
|
|
1119
|
+
updatedAt: score.updatedAt.toISOString(),
|
|
1120
|
+
}));
|
|
1121
|
+
|
|
1122
|
+
mockFetchResponse({
|
|
1123
|
+
...mockResponse,
|
|
1124
|
+
scores: mockResponseWithDates,
|
|
1125
|
+
});
|
|
1126
|
+
|
|
1127
|
+
const result = await client.getScoresByEntityId({
|
|
1128
|
+
entityId: 'agent-456',
|
|
1129
|
+
entityType: 'AGENT',
|
|
1130
|
+
});
|
|
1131
|
+
|
|
1132
|
+
expect(result).toEqual({
|
|
1133
|
+
...mockResponse,
|
|
1134
|
+
scores: mockResponseWithDates,
|
|
1135
|
+
});
|
|
1136
|
+
|
|
1137
|
+
expect(global.fetch).toHaveBeenCalledWith(
|
|
1138
|
+
`${clientOptions.baseUrl}/api/scores/entity/AGENT/agent-456`,
|
|
1139
|
+
expect.objectContaining({
|
|
1140
|
+
headers: expect.objectContaining(clientOptions.headers),
|
|
1141
|
+
}),
|
|
1142
|
+
);
|
|
1143
|
+
});
|
|
1144
|
+
|
|
1145
|
+
it('should fetch scores by entity ID and type with pagination', async () => {
|
|
1146
|
+
const mockResponse = {
|
|
1147
|
+
pagination: {
|
|
1148
|
+
total: 15,
|
|
1149
|
+
page: 2,
|
|
1150
|
+
perPage: 5,
|
|
1151
|
+
hasMore: true,
|
|
1152
|
+
},
|
|
1153
|
+
scores: [],
|
|
1154
|
+
};
|
|
1155
|
+
mockFetchResponse(mockResponse);
|
|
1156
|
+
|
|
1157
|
+
const result = await client.getScoresByEntityId({
|
|
1158
|
+
entityId: 'workflow-789',
|
|
1159
|
+
entityType: 'WORKFLOW',
|
|
1160
|
+
page: 2,
|
|
1161
|
+
perPage: 5,
|
|
1162
|
+
});
|
|
1163
|
+
expect(result).toEqual(mockResponse);
|
|
1164
|
+
expect(global.fetch).toHaveBeenCalledWith(
|
|
1165
|
+
`${clientOptions.baseUrl}/api/scores/entity/WORKFLOW/workflow-789?page=2&perPage=5`,
|
|
1166
|
+
expect.objectContaining({
|
|
1167
|
+
body: undefined,
|
|
1168
|
+
headers: expect.objectContaining(clientOptions.headers),
|
|
1169
|
+
signal: undefined,
|
|
1170
|
+
}),
|
|
1171
|
+
);
|
|
1172
|
+
});
|
|
1173
|
+
});
|
|
1174
|
+
|
|
1175
|
+
describe('saveScore()', () => {
|
|
1176
|
+
it('should save a score', async () => {
|
|
1177
|
+
const scoreData = {
|
|
1178
|
+
id: 'score-1',
|
|
1179
|
+
scorerId: 'test-scorer',
|
|
1180
|
+
runId: 'run-123',
|
|
1181
|
+
scorer: { name: 'test-scorer' },
|
|
1182
|
+
score: 0.85,
|
|
1183
|
+
input: [],
|
|
1184
|
+
output: { response: 'test response' },
|
|
1185
|
+
source: 'LIVE' as ScoringSource,
|
|
1186
|
+
entityId: 'agent-456',
|
|
1187
|
+
entityType: 'AGENT' as ScoringEntityType,
|
|
1188
|
+
entity: { id: 'agent-456', name: 'test-agent' },
|
|
1189
|
+
createdAt: new Date(),
|
|
1190
|
+
updatedAt: new Date(),
|
|
1191
|
+
runtimeContext: {
|
|
1192
|
+
model: {
|
|
1193
|
+
name: 'test-model',
|
|
1194
|
+
version: '1.0.0',
|
|
1195
|
+
},
|
|
1196
|
+
},
|
|
1197
|
+
};
|
|
1198
|
+
const mockResponse = {
|
|
1199
|
+
score: {
|
|
1200
|
+
...scoreData,
|
|
1201
|
+
createdAt: scoreData.createdAt.toISOString(),
|
|
1202
|
+
updatedAt: scoreData.updatedAt.toISOString(),
|
|
1203
|
+
},
|
|
1204
|
+
};
|
|
1205
|
+
mockFetchResponse(mockResponse);
|
|
1206
|
+
|
|
1207
|
+
const result = await client.saveScore({ score: scoreData });
|
|
1208
|
+
expect(result).toEqual({
|
|
1209
|
+
score: {
|
|
1210
|
+
...scoreData,
|
|
1211
|
+
createdAt: scoreData.createdAt.toISOString(),
|
|
1212
|
+
updatedAt: scoreData.updatedAt.toISOString(),
|
|
1213
|
+
},
|
|
1214
|
+
});
|
|
1215
|
+
expect(global.fetch).toHaveBeenCalledWith(
|
|
1216
|
+
`${clientOptions.baseUrl}/api/scores`,
|
|
1217
|
+
expect.objectContaining({
|
|
1218
|
+
method: 'POST',
|
|
1219
|
+
headers: expect.objectContaining(clientOptions.headers),
|
|
1220
|
+
body: JSON.stringify({ score: scoreData }),
|
|
1221
|
+
}),
|
|
1222
|
+
);
|
|
1223
|
+
});
|
|
1224
|
+
});
|
|
1225
|
+
});
|
|
830
1226
|
});
|
package/src/index.ts
CHANGED
package/src/resources/a2a.ts
CHANGED
|
@@ -1,4 +1,12 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type {
|
|
2
|
+
AgentCard,
|
|
3
|
+
GetTaskResponse,
|
|
4
|
+
MessageSendParams,
|
|
5
|
+
SendMessageResponse,
|
|
6
|
+
SendStreamingMessageResponse,
|
|
7
|
+
Task,
|
|
8
|
+
TaskQueryParams,
|
|
9
|
+
} from '@mastra/core/a2a';
|
|
2
10
|
import type { ClientOptions } from '../types';
|
|
3
11
|
import { BaseResource } from './base';
|
|
4
12
|
|
|
@@ -18,71 +26,73 @@ export class A2A extends BaseResource {
|
|
|
18
26
|
* @returns Promise containing the agent card information
|
|
19
27
|
*/
|
|
20
28
|
async getCard(): Promise<AgentCard> {
|
|
21
|
-
return this.request(`/.well-known/${this.agentId}/agent.json`);
|
|
29
|
+
return this.request(`/.well-known/${this.agentId}/agent-card.json`);
|
|
22
30
|
}
|
|
23
31
|
|
|
24
32
|
/**
|
|
25
|
-
* Send a message to the agent and
|
|
33
|
+
* Send a message to the agent and gets a message or task response
|
|
26
34
|
* @param params - Parameters for the task
|
|
27
|
-
* @returns Promise containing the
|
|
35
|
+
* @returns Promise containing the response
|
|
28
36
|
*/
|
|
29
|
-
async sendMessage(params:
|
|
30
|
-
const response = await this.request<
|
|
37
|
+
async sendMessage(params: MessageSendParams): Promise<SendMessageResponse> {
|
|
38
|
+
const response = await this.request<SendMessageResponse>(`/a2a/${this.agentId}`, {
|
|
31
39
|
method: 'POST',
|
|
32
40
|
body: {
|
|
33
|
-
method: '
|
|
41
|
+
method: 'message/send',
|
|
34
42
|
params,
|
|
35
43
|
},
|
|
36
44
|
});
|
|
37
45
|
|
|
38
|
-
return
|
|
46
|
+
return response;
|
|
39
47
|
}
|
|
40
48
|
|
|
41
49
|
/**
|
|
42
|
-
*
|
|
43
|
-
*
|
|
44
|
-
* @
|
|
50
|
+
* Sends a message to an agent to initiate/continue a task and subscribes
|
|
51
|
+
* the client to real-time updates for that task via Server-Sent Events (SSE).
|
|
52
|
+
* @param params - Parameters for the task
|
|
53
|
+
* @returns A stream of Server-Sent Events. Each SSE `data` field contains a `SendStreamingMessageResponse`
|
|
45
54
|
*/
|
|
46
|
-
async
|
|
47
|
-
const response = await this.request<
|
|
55
|
+
async sendStreamingMessage(params: MessageSendParams): Promise<AsyncIterable<SendStreamingMessageResponse>> {
|
|
56
|
+
const response = await this.request<AsyncIterable<SendStreamingMessageResponse>>(`/a2a/${this.agentId}`, {
|
|
48
57
|
method: 'POST',
|
|
49
58
|
body: {
|
|
50
|
-
method: '
|
|
59
|
+
method: 'message/stream',
|
|
51
60
|
params,
|
|
52
61
|
},
|
|
53
62
|
});
|
|
54
63
|
|
|
55
|
-
return response
|
|
64
|
+
return response;
|
|
56
65
|
}
|
|
57
66
|
|
|
58
67
|
/**
|
|
59
|
-
*
|
|
60
|
-
* @param params - Parameters
|
|
68
|
+
* Get the status and result of a task
|
|
69
|
+
* @param params - Parameters for querying the task
|
|
61
70
|
* @returns Promise containing the task response
|
|
62
71
|
*/
|
|
63
|
-
async
|
|
64
|
-
|
|
72
|
+
async getTask(params: TaskQueryParams): Promise<GetTaskResponse> {
|
|
73
|
+
const response = await this.request<GetTaskResponse>(`/a2a/${this.agentId}`, {
|
|
65
74
|
method: 'POST',
|
|
66
75
|
body: {
|
|
67
|
-
method: 'tasks/
|
|
76
|
+
method: 'tasks/get',
|
|
68
77
|
params,
|
|
69
78
|
},
|
|
70
79
|
});
|
|
80
|
+
|
|
81
|
+
return response;
|
|
71
82
|
}
|
|
72
83
|
|
|
73
84
|
/**
|
|
74
|
-
*
|
|
75
|
-
* @param params - Parameters
|
|
85
|
+
* Cancel a running task
|
|
86
|
+
* @param params - Parameters identifying the task to cancel
|
|
76
87
|
* @returns Promise containing the task response
|
|
77
88
|
*/
|
|
78
|
-
async
|
|
89
|
+
async cancelTask(params: TaskQueryParams): Promise<Task> {
|
|
79
90
|
return this.request(`/a2a/${this.agentId}`, {
|
|
80
91
|
method: 'POST',
|
|
81
92
|
body: {
|
|
82
|
-
method: 'tasks/
|
|
93
|
+
method: 'tasks/cancel',
|
|
83
94
|
params,
|
|
84
95
|
},
|
|
85
|
-
stream: true,
|
|
86
96
|
});
|
|
87
97
|
}
|
|
88
98
|
}
|