@mondaydotcomorg/atp-vercel-sdk 0.20.0 → 0.20.2
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/client.d.ts.map +1 -1
- package/dist/client.js +19 -7
- package/dist/client.js.map +1 -1
- package/dist/event-adapter.d.ts +89 -0
- package/dist/event-adapter.d.ts.map +1 -0
- package/dist/event-adapter.js +201 -0
- package/dist/event-adapter.js.map +1 -0
- package/dist/index.d.ts +3 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -1
- package/dist/index.js.map +1 -1
- package/dist/tools.d.ts +28 -1
- package/dist/tools.d.ts.map +1 -1
- package/dist/tools.js +95 -0
- package/dist/tools.js.map +1 -1
- package/dist/types.d.ts +38 -9
- package/dist/types.d.ts.map +1 -1
- package/package.json +3 -3
- package/src/client.ts +18 -7
- package/src/event-adapter.ts +275 -0
- package/src/index.ts +9 -1
- package/src/tools.ts +108 -1
- package/src/types.ts +42 -9
package/dist/client.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,MAAM,6BAA6B,CAAC;AACtE,OAAO,KAAK,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAEtF,OAAO,KAAK,EACX,wBAAwB,EAIxB,MAAM,YAAY,CAAC;AAEpB,qBAAa,iBAAiB;IAC7B,OAAO,CAAC,MAAM,CAA0B;IACxC,OAAO,CAAC,KAAK,CAAM;IACnB,OAAO,CAAC,UAAU,CAAC,CAAoB;IACvC,OAAO,CAAC,eAAe,CAAC,CAAkB;gBAE9B,OAAO,EAAE,wBAAwB;
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,MAAM,6BAA6B,CAAC;AACtE,OAAO,KAAK,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAEtF,OAAO,KAAK,EACX,wBAAwB,EAIxB,MAAM,YAAY,CAAC;AAEpB,qBAAa,iBAAiB;IAC7B,OAAO,CAAC,MAAM,CAA0B;IACxC,OAAO,CAAC,KAAK,CAAM;IACnB,OAAO,CAAC,UAAU,CAAC,CAAoB;IACvC,OAAO,CAAC,eAAe,CAAC,CAAkB;gBAE9B,OAAO,EAAE,wBAAwB;IAmDvC,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAK9B,kBAAkB,IAAI,MAAM;IAItB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,CAAC,eAAe,CAAC,GAAG,OAAO,CAAC,eAAe,CAAC;IAIxF,mBAAmB,IAAI,uBAAuB;YAIhC,aAAa;YAYb,gBAAgB;YAahB,iBAAiB;YAiCjB,eAAe;YAUf,qBAAqB;CAgBnC"}
|
package/dist/client.js
CHANGED
|
@@ -6,13 +6,25 @@ export class VercelAIATPClient {
|
|
|
6
6
|
embeddings;
|
|
7
7
|
approvalHandler;
|
|
8
8
|
constructor(options) {
|
|
9
|
-
const {
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
9
|
+
const { model, embeddings, tools, approvalHandler, hooks } = options;
|
|
10
|
+
if ('server' in options && options.server) {
|
|
11
|
+
this.client = new AgentToolProtocolClient({
|
|
12
|
+
server: options.server,
|
|
13
|
+
hooks,
|
|
14
|
+
serviceProviders: tools ? { tools } : undefined,
|
|
15
|
+
});
|
|
16
|
+
}
|
|
17
|
+
else if ('serverUrl' in options && options.serverUrl) {
|
|
18
|
+
this.client = new AgentToolProtocolClient({
|
|
19
|
+
baseUrl: options.serverUrl,
|
|
20
|
+
headers: options.headers,
|
|
21
|
+
hooks,
|
|
22
|
+
serviceProviders: tools ? { tools } : undefined,
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
else {
|
|
26
|
+
throw new Error('Either serverUrl or server must be provided');
|
|
27
|
+
}
|
|
16
28
|
this.model = model;
|
|
17
29
|
this.embeddings = embeddings;
|
|
18
30
|
this.approvalHandler = approvalHandler;
|
package/dist/client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,MAAM,6BAA6B,CAAC;AAEtE,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAQlD,MAAM,OAAO,iBAAiB;IACrB,MAAM,CAA0B;IAChC,KAAK,CAAM;IACX,UAAU,CAAqB;IAC/B,eAAe,CAAmB;IAE1C,YAAY,OAAiC;QAC5C,MAAM,EAAE,
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Vercel AI SDK Event Adapter
|
|
3
|
+
*
|
|
4
|
+
* Converts ATP streaming events to Vercel AI SDK UIMessageStream format.
|
|
5
|
+
* Use this to forward ATP events to the chat UI.
|
|
6
|
+
*/
|
|
7
|
+
import { type ATPEvent } from '@mondaydotcomorg/atp-protocol';
|
|
8
|
+
/**
|
|
9
|
+
* UIMessageStreamWriter interface (subset of Vercel AI SDK's UIMessageStreamWriter)
|
|
10
|
+
*/
|
|
11
|
+
export interface UIMessageStreamWriter {
|
|
12
|
+
write(event: UIStreamEvent): void;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* UI Stream event types that Vercel AI SDK understands
|
|
16
|
+
*/
|
|
17
|
+
export type UIStreamEvent = {
|
|
18
|
+
type: 'text-start';
|
|
19
|
+
id: string;
|
|
20
|
+
} | {
|
|
21
|
+
type: 'text-delta';
|
|
22
|
+
id: string;
|
|
23
|
+
delta: string;
|
|
24
|
+
} | {
|
|
25
|
+
type: 'text-end';
|
|
26
|
+
id: string;
|
|
27
|
+
} | {
|
|
28
|
+
type: 'reasoning-start';
|
|
29
|
+
id: string;
|
|
30
|
+
} | {
|
|
31
|
+
type: 'reasoning-delta';
|
|
32
|
+
id: string;
|
|
33
|
+
delta: string;
|
|
34
|
+
} | {
|
|
35
|
+
type: 'reasoning-end';
|
|
36
|
+
id: string;
|
|
37
|
+
} | {
|
|
38
|
+
type: 'source-url';
|
|
39
|
+
url: string;
|
|
40
|
+
title: string;
|
|
41
|
+
sourceId: string;
|
|
42
|
+
providerMetadata?: unknown;
|
|
43
|
+
} | {
|
|
44
|
+
type: string;
|
|
45
|
+
data?: unknown;
|
|
46
|
+
transient?: boolean;
|
|
47
|
+
};
|
|
48
|
+
/**
|
|
49
|
+
* Options for creating the Vercel event handler
|
|
50
|
+
*/
|
|
51
|
+
export interface CreateVercelEventHandlerOptions {
|
|
52
|
+
/**
|
|
53
|
+
* Prefix for generated text run IDs
|
|
54
|
+
* @default 'atp-text'
|
|
55
|
+
*/
|
|
56
|
+
textRunIdPrefix?: string;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Creates an event handler that forwards ATP events to a Vercel AI SDK UIMessageStreamWriter.
|
|
60
|
+
*
|
|
61
|
+
* Handles nested tool calls properly:
|
|
62
|
+
* - First tool_start triggers agentStepStart
|
|
63
|
+
* - Inner tool_start/end emit agentStep updates (not start/end)
|
|
64
|
+
* - Last tool_end triggers agentStepEnd
|
|
65
|
+
*
|
|
66
|
+
* @param dataStream - The Vercel AI SDK UIMessageStreamWriter to write events to
|
|
67
|
+
* @param options - Optional configuration
|
|
68
|
+
* @returns An event handler function to pass to ATP's executeStream
|
|
69
|
+
*
|
|
70
|
+
* @example
|
|
71
|
+
* ```typescript
|
|
72
|
+
* const handler = createVercelEventHandler(dataStream);
|
|
73
|
+
*
|
|
74
|
+
* const result = await client.executeStream(code, {}, handler);
|
|
75
|
+
* ```
|
|
76
|
+
*/
|
|
77
|
+
export declare function createVercelEventHandler(dataStream: UIMessageStreamWriter, options?: CreateVercelEventHandlerOptions): (event: ATPEvent) => void;
|
|
78
|
+
/**
|
|
79
|
+
* Creates an event handler that collects events into an array.
|
|
80
|
+
* Useful for testing or post-processing events.
|
|
81
|
+
*
|
|
82
|
+
* @returns Object with handler function and collected events array
|
|
83
|
+
*/
|
|
84
|
+
export declare function createEventCollector(): {
|
|
85
|
+
handler: (event: ATPEvent) => void;
|
|
86
|
+
events: ATPEvent[];
|
|
87
|
+
clear: () => void;
|
|
88
|
+
};
|
|
89
|
+
//# sourceMappingURL=event-adapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"event-adapter.d.ts","sourceRoot":"","sources":["../src/event-adapter.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,KAAK,QAAQ,EAAgB,MAAM,+BAA+B,CAAC;AAE5E;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACrC,KAAK,CAAC,KAAK,EAAE,aAAa,GAAG,IAAI,CAAC;CAClC;AAED;;GAEG;AACH,MAAM,MAAM,aAAa,GACtB;IAAE,IAAI,EAAE,YAAY,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,GAClC;IAAE,IAAI,EAAE,YAAY,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GACjD;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,GAChC;IAAE,IAAI,EAAE,iBAAiB,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,GACvC;IAAE,IAAI,EAAE,iBAAiB,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GACtD;IAAE,IAAI,EAAE,eAAe,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,GACrC;IAAE,IAAI,EAAE,YAAY,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,gBAAgB,CAAC,EAAE,OAAO,CAAA;CAAE,GAChG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,OAAO,CAAC;IAAC,SAAS,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC;AAEzD;;GAEG;AACH,MAAM,WAAW,+BAA+B;IAC/C;;;OAGG;IACH,eAAe,CAAC,EAAE,MAAM,CAAC;CACzB;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,wBAAwB,CACvC,UAAU,EAAE,qBAAqB,EACjC,OAAO,GAAE,+BAAoC,GAC3C,CAAC,KAAK,EAAE,QAAQ,KAAK,IAAI,CA2L3B;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,IAAI;IACvC,OAAO,EAAE,CAAC,KAAK,EAAE,QAAQ,KAAK,IAAI,CAAC;IACnC,MAAM,EAAE,QAAQ,EAAE,CAAC;IACnB,KAAK,EAAE,MAAM,IAAI,CAAC;CAClB,CAYA"}
|
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Vercel AI SDK Event Adapter
|
|
3
|
+
*
|
|
4
|
+
* Converts ATP streaming events to Vercel AI SDK UIMessageStream format.
|
|
5
|
+
* Use this to forward ATP events to the chat UI.
|
|
6
|
+
*/
|
|
7
|
+
import { ATPEventType } from '@mondaydotcomorg/atp-protocol';
|
|
8
|
+
/**
|
|
9
|
+
* Creates an event handler that forwards ATP events to a Vercel AI SDK UIMessageStreamWriter.
|
|
10
|
+
*
|
|
11
|
+
* Handles nested tool calls properly:
|
|
12
|
+
* - First tool_start triggers agentStepStart
|
|
13
|
+
* - Inner tool_start/end emit agentStep updates (not start/end)
|
|
14
|
+
* - Last tool_end triggers agentStepEnd
|
|
15
|
+
*
|
|
16
|
+
* @param dataStream - The Vercel AI SDK UIMessageStreamWriter to write events to
|
|
17
|
+
* @param options - Optional configuration
|
|
18
|
+
* @returns An event handler function to pass to ATP's executeStream
|
|
19
|
+
*
|
|
20
|
+
* @example
|
|
21
|
+
* ```typescript
|
|
22
|
+
* const handler = createVercelEventHandler(dataStream);
|
|
23
|
+
*
|
|
24
|
+
* const result = await client.executeStream(code, {}, handler);
|
|
25
|
+
* ```
|
|
26
|
+
*/
|
|
27
|
+
export function createVercelEventHandler(dataStream, options = {}) {
|
|
28
|
+
const { textRunIdPrefix = 'atp-text' } = options;
|
|
29
|
+
let currentTextRunId;
|
|
30
|
+
let textRunCounter = 0;
|
|
31
|
+
// Track reasoning state for proper start/delta/end events
|
|
32
|
+
let reasoningRunId;
|
|
33
|
+
let reasoningCounter = 0;
|
|
34
|
+
// Track nested tool calls with a stack
|
|
35
|
+
const toolStack = [];
|
|
36
|
+
return (event) => {
|
|
37
|
+
switch (event.type) {
|
|
38
|
+
case ATPEventType.THINKING: {
|
|
39
|
+
const data = event.data;
|
|
40
|
+
// Start new reasoning block if needed
|
|
41
|
+
if (!reasoningRunId) {
|
|
42
|
+
reasoningRunId = `atp-reasoning-${++reasoningCounter}`;
|
|
43
|
+
dataStream.write({
|
|
44
|
+
type: 'reasoning-start',
|
|
45
|
+
id: reasoningRunId,
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
// Write reasoning delta
|
|
49
|
+
dataStream.write({
|
|
50
|
+
type: 'reasoning-delta',
|
|
51
|
+
id: reasoningRunId,
|
|
52
|
+
delta: data.content + '\n',
|
|
53
|
+
});
|
|
54
|
+
break;
|
|
55
|
+
}
|
|
56
|
+
case ATPEventType.TOOL_START: {
|
|
57
|
+
const data = event.data;
|
|
58
|
+
const isFirstTool = toolStack.length === 0;
|
|
59
|
+
toolStack.push({ toolName: data.toolName, apiGroup: data.apiGroup });
|
|
60
|
+
if (isFirstTool) {
|
|
61
|
+
// First tool - emit agentStepStart
|
|
62
|
+
dataStream.write({
|
|
63
|
+
type: 'data-agentStepStart',
|
|
64
|
+
data: `Executing ${data.apiGroup}.${data.toolName}...`,
|
|
65
|
+
transient: true,
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
else {
|
|
69
|
+
// Nested tool - emit progress update instead
|
|
70
|
+
dataStream.write({
|
|
71
|
+
type: 'data-agentStep',
|
|
72
|
+
data: `→ ${data.apiGroup}.${data.toolName}`,
|
|
73
|
+
transient: true,
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
break;
|
|
77
|
+
}
|
|
78
|
+
case ATPEventType.TOOL_END: {
|
|
79
|
+
const data = event.data;
|
|
80
|
+
toolStack.pop();
|
|
81
|
+
const isLastTool = toolStack.length === 0;
|
|
82
|
+
// Close reasoning block when outer tool ends
|
|
83
|
+
if (isLastTool && reasoningRunId) {
|
|
84
|
+
dataStream.write({
|
|
85
|
+
type: 'reasoning-end',
|
|
86
|
+
id: reasoningRunId,
|
|
87
|
+
});
|
|
88
|
+
reasoningRunId = undefined;
|
|
89
|
+
}
|
|
90
|
+
if (isLastTool) {
|
|
91
|
+
// Last tool - emit agentStepEnd
|
|
92
|
+
dataStream.write({
|
|
93
|
+
type: 'data-agentStepEnd',
|
|
94
|
+
data: data.success
|
|
95
|
+
? `Completed ${data.apiGroup}.${data.toolName} (${data.duration}ms)`
|
|
96
|
+
: `Failed ${data.apiGroup}.${data.toolName}: ${data.error}`,
|
|
97
|
+
transient: true,
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
else {
|
|
101
|
+
// Nested tool finished - emit progress update
|
|
102
|
+
dataStream.write({
|
|
103
|
+
type: 'data-agentStep',
|
|
104
|
+
data: data.success
|
|
105
|
+
? `✓ ${data.apiGroup}.${data.toolName} (${data.duration}ms)`
|
|
106
|
+
: `✗ ${data.apiGroup}.${data.toolName}: ${data.error}`,
|
|
107
|
+
transient: true,
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
break;
|
|
111
|
+
}
|
|
112
|
+
case ATPEventType.TEXT: {
|
|
113
|
+
const data = event.data;
|
|
114
|
+
const runId = event.runId || `${textRunIdPrefix}-${++textRunCounter}`;
|
|
115
|
+
// If we're starting a new text run, close the previous one
|
|
116
|
+
if (currentTextRunId && currentTextRunId !== runId) {
|
|
117
|
+
dataStream.write({ type: 'text-end', id: currentTextRunId });
|
|
118
|
+
currentTextRunId = undefined;
|
|
119
|
+
}
|
|
120
|
+
// Start new text run if needed
|
|
121
|
+
if (!currentTextRunId || currentTextRunId !== runId) {
|
|
122
|
+
currentTextRunId = runId;
|
|
123
|
+
dataStream.write({ type: 'text-start', id: currentTextRunId });
|
|
124
|
+
}
|
|
125
|
+
// Write text delta
|
|
126
|
+
dataStream.write({
|
|
127
|
+
type: 'text-delta',
|
|
128
|
+
id: currentTextRunId,
|
|
129
|
+
delta: data.text,
|
|
130
|
+
});
|
|
131
|
+
break;
|
|
132
|
+
}
|
|
133
|
+
case ATPEventType.TEXT_END:
|
|
134
|
+
if (currentTextRunId) {
|
|
135
|
+
dataStream.write({ type: 'text-end', id: currentTextRunId });
|
|
136
|
+
currentTextRunId = undefined;
|
|
137
|
+
}
|
|
138
|
+
break;
|
|
139
|
+
case ATPEventType.SOURCE: {
|
|
140
|
+
const data = event.data;
|
|
141
|
+
dataStream.write({
|
|
142
|
+
type: 'source-url',
|
|
143
|
+
url: data.url,
|
|
144
|
+
title: data.title,
|
|
145
|
+
sourceId: `${data.title}-${event.timestamp}`,
|
|
146
|
+
providerMetadata: {
|
|
147
|
+
aiChat: {
|
|
148
|
+
summary: data.summary,
|
|
149
|
+
createdAt: data.createdAt,
|
|
150
|
+
},
|
|
151
|
+
},
|
|
152
|
+
});
|
|
153
|
+
break;
|
|
154
|
+
}
|
|
155
|
+
case ATPEventType.PROGRESS: {
|
|
156
|
+
const data = event.data;
|
|
157
|
+
dataStream.write({
|
|
158
|
+
type: 'data-agentStep',
|
|
159
|
+
data: `${data.message} (${Math.round(data.fraction * 100)}%)`,
|
|
160
|
+
transient: true,
|
|
161
|
+
});
|
|
162
|
+
break;
|
|
163
|
+
}
|
|
164
|
+
case ATPEventType.ERROR: {
|
|
165
|
+
const data = event.data;
|
|
166
|
+
dataStream.write({
|
|
167
|
+
type: 'data-error',
|
|
168
|
+
data: data.message,
|
|
169
|
+
});
|
|
170
|
+
break;
|
|
171
|
+
}
|
|
172
|
+
default:
|
|
173
|
+
// Forward unknown events as custom data events
|
|
174
|
+
dataStream.write({
|
|
175
|
+
type: `data-${event.type}`,
|
|
176
|
+
data: event.data,
|
|
177
|
+
transient: true,
|
|
178
|
+
});
|
|
179
|
+
break;
|
|
180
|
+
}
|
|
181
|
+
};
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* Creates an event handler that collects events into an array.
|
|
185
|
+
* Useful for testing or post-processing events.
|
|
186
|
+
*
|
|
187
|
+
* @returns Object with handler function and collected events array
|
|
188
|
+
*/
|
|
189
|
+
export function createEventCollector() {
|
|
190
|
+
const events = [];
|
|
191
|
+
return {
|
|
192
|
+
handler: (event) => {
|
|
193
|
+
events.push(event);
|
|
194
|
+
},
|
|
195
|
+
events,
|
|
196
|
+
clear: () => {
|
|
197
|
+
events.length = 0;
|
|
198
|
+
},
|
|
199
|
+
};
|
|
200
|
+
}
|
|
201
|
+
//# sourceMappingURL=event-adapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"event-adapter.js","sourceRoot":"","sources":["../src/event-adapter.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
export { VercelAIATPClient } from './client.js';
|
|
2
|
-
export { createATPTools } from './tools.js';
|
|
3
|
-
export
|
|
2
|
+
export { createATPTools, createATPStreamingTools } from './tools.js';
|
|
3
|
+
export { createVercelEventHandler, createEventCollector, type UIMessageStreamWriter, type UIStreamEvent, type CreateVercelEventHandlerOptions, } from './event-adapter.js';
|
|
4
|
+
export type { VercelAIATPClientOptions, CreateATPToolsOptions, StreamingToolsOptions, ATPToolsResult, ApprovalHandler, ApprovalRequest, ApprovalResponse, EmbeddingProvider, } from './types.js';
|
|
4
5
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,uBAAuB,EAAE,MAAM,YAAY,CAAC;AACrE,OAAO,EACN,wBAAwB,EACxB,oBAAoB,EACpB,KAAK,qBAAqB,EAC1B,KAAK,aAAa,EAClB,KAAK,+BAA+B,GACpC,MAAM,oBAAoB,CAAC;AAC5B,YAAY,EACX,wBAAwB,EACxB,qBAAqB,EACrB,qBAAqB,EACrB,cAAc,EACd,eAAe,EACf,eAAe,EACf,gBAAgB,EAChB,iBAAiB,GACjB,MAAM,YAAY,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
1
|
export { VercelAIATPClient } from './client.js';
|
|
2
|
-
export { createATPTools } from './tools.js';
|
|
2
|
+
export { createATPTools, createATPStreamingTools } from './tools.js';
|
|
3
|
+
export { createVercelEventHandler, createEventCollector, } from './event-adapter.js';
|
|
3
4
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,uBAAuB,EAAE,MAAM,YAAY,CAAC;AACrE,OAAO,EACN,wBAAwB,EACxB,oBAAoB,GAIpB,MAAM,oBAAoB,CAAC"}
|
package/dist/tools.d.ts
CHANGED
|
@@ -1,3 +1,30 @@
|
|
|
1
|
-
import type { CreateATPToolsOptions, ATPToolsResult } from './types.js';
|
|
1
|
+
import type { CreateATPToolsOptions, ATPToolsResult, StreamingToolsOptions } from './types.js';
|
|
2
2
|
export declare function createATPTools(options: CreateATPToolsOptions): Promise<ATPToolsResult>;
|
|
3
|
+
/**
|
|
4
|
+
* Creates ATP tools with streaming event support.
|
|
5
|
+
* Events from tool execution will be forwarded to the provided dataStream.
|
|
6
|
+
*
|
|
7
|
+
* @param options - Tool creation options including dataStream for event forwarding
|
|
8
|
+
* @returns Promise resolving to client and tools with streaming support
|
|
9
|
+
*
|
|
10
|
+
* @example
|
|
11
|
+
* ```typescript
|
|
12
|
+
* // In your Vercel AI SDK route handler
|
|
13
|
+
* const dataStream = createUIMessageStream({...});
|
|
14
|
+
*
|
|
15
|
+
* const { tools } = await createATPStreamingTools({
|
|
16
|
+
* serverUrl: 'http://localhost:3333',
|
|
17
|
+
* model: openai('gpt-4'),
|
|
18
|
+
* dataStream,
|
|
19
|
+
* });
|
|
20
|
+
*
|
|
21
|
+
* // Use tools in streamText
|
|
22
|
+
* const result = streamText({
|
|
23
|
+
* model: openai('gpt-4'),
|
|
24
|
+
* messages,
|
|
25
|
+
* tools,
|
|
26
|
+
* });
|
|
27
|
+
* ```
|
|
28
|
+
*/
|
|
29
|
+
export declare function createATPStreamingTools(options: StreamingToolsOptions): Promise<ATPToolsResult>;
|
|
3
30
|
//# sourceMappingURL=tools.d.ts.map
|
package/dist/tools.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,qBAAqB,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,qBAAqB,EAAE,cAAc,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AAM/F,wBAAsB,cAAc,CAAC,OAAO,EAAE,qBAAqB,GAAG,OAAO,CAAC,cAAc,CAAC,CAgG5F;AAED;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,wBAAsB,uBAAuB,CAC5C,OAAO,EAAE,qBAAqB,GAC5B,OAAO,CAAC,cAAc,CAAC,CA4EzB"}
|
package/dist/tools.js
CHANGED
|
@@ -3,6 +3,7 @@ import { VercelAIATPClient } from './client.js';
|
|
|
3
3
|
import { createToolsFromATPClient, ToolNames } from '@mondaydotcomorg/atp-client';
|
|
4
4
|
import { ExecutionStatus } from '@mondaydotcomorg/atp-protocol';
|
|
5
5
|
import { tool } from 'ai';
|
|
6
|
+
import { createVercelEventHandler } from './event-adapter.js';
|
|
6
7
|
export async function createATPTools(options) {
|
|
7
8
|
const { defaultExecutionConfig, ...clientOptions } = options;
|
|
8
9
|
const client = new VercelAIATPClient(clientOptions);
|
|
@@ -97,4 +98,98 @@ export async function createATPTools(options) {
|
|
|
97
98
|
tools: vercelTools,
|
|
98
99
|
};
|
|
99
100
|
}
|
|
101
|
+
/**
|
|
102
|
+
* Creates ATP tools with streaming event support.
|
|
103
|
+
* Events from tool execution will be forwarded to the provided dataStream.
|
|
104
|
+
*
|
|
105
|
+
* @param options - Tool creation options including dataStream for event forwarding
|
|
106
|
+
* @returns Promise resolving to client and tools with streaming support
|
|
107
|
+
*
|
|
108
|
+
* @example
|
|
109
|
+
* ```typescript
|
|
110
|
+
* // In your Vercel AI SDK route handler
|
|
111
|
+
* const dataStream = createUIMessageStream({...});
|
|
112
|
+
*
|
|
113
|
+
* const { tools } = await createATPStreamingTools({
|
|
114
|
+
* serverUrl: 'http://localhost:3333',
|
|
115
|
+
* model: openai('gpt-4'),
|
|
116
|
+
* dataStream,
|
|
117
|
+
* });
|
|
118
|
+
*
|
|
119
|
+
* // Use tools in streamText
|
|
120
|
+
* const result = streamText({
|
|
121
|
+
* model: openai('gpt-4'),
|
|
122
|
+
* messages,
|
|
123
|
+
* tools,
|
|
124
|
+
* });
|
|
125
|
+
* ```
|
|
126
|
+
*/
|
|
127
|
+
export async function createATPStreamingTools(options) {
|
|
128
|
+
const { dataStream, defaultExecutionConfig, ...clientOptions } = options;
|
|
129
|
+
const client = new VercelAIATPClient(clientOptions);
|
|
130
|
+
await client.connect();
|
|
131
|
+
const eventHandler = createVercelEventHandler(dataStream);
|
|
132
|
+
const underlyingClient = client.getUnderlyingClient();
|
|
133
|
+
const vercelTools = {};
|
|
134
|
+
vercelTools.atp_execute_code = tool({
|
|
135
|
+
description: 'Execute TypeScript code in ATP sandbox with streaming events for thinking, tool execution, and text output',
|
|
136
|
+
parameters: z.object({
|
|
137
|
+
code: z.string().describe('TypeScript code to execute in the ATP sandbox'),
|
|
138
|
+
}),
|
|
139
|
+
execute: async ({ code }) => {
|
|
140
|
+
try {
|
|
141
|
+
const result = await underlyingClient.executeStream(code, defaultExecutionConfig, eventHandler);
|
|
142
|
+
if (result.status === ExecutionStatus.COMPLETED) {
|
|
143
|
+
return {
|
|
144
|
+
success: true,
|
|
145
|
+
result: result.result,
|
|
146
|
+
stats: result.stats,
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
else if (result.status === ExecutionStatus.FAILED) {
|
|
150
|
+
return {
|
|
151
|
+
success: false,
|
|
152
|
+
error: result.error,
|
|
153
|
+
stats: result.stats,
|
|
154
|
+
};
|
|
155
|
+
}
|
|
156
|
+
else {
|
|
157
|
+
return {
|
|
158
|
+
success: false,
|
|
159
|
+
error: 'Execution in unexpected state: ' + result.status,
|
|
160
|
+
};
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
catch (error) {
|
|
164
|
+
return {
|
|
165
|
+
success: false,
|
|
166
|
+
error: error.message || 'Unknown error',
|
|
167
|
+
};
|
|
168
|
+
}
|
|
169
|
+
},
|
|
170
|
+
});
|
|
171
|
+
vercelTools.atp_get_type_definitions = tool({
|
|
172
|
+
description: 'Get TypeScript type definitions for ATP runtime APIs to understand available functions',
|
|
173
|
+
parameters: z.object({}),
|
|
174
|
+
execute: async () => {
|
|
175
|
+
try {
|
|
176
|
+
const types = client.getTypeDefinitions();
|
|
177
|
+
return {
|
|
178
|
+
success: true,
|
|
179
|
+
types,
|
|
180
|
+
};
|
|
181
|
+
}
|
|
182
|
+
catch (error) {
|
|
183
|
+
return {
|
|
184
|
+
success: false,
|
|
185
|
+
error: error.message,
|
|
186
|
+
};
|
|
187
|
+
}
|
|
188
|
+
},
|
|
189
|
+
});
|
|
190
|
+
return {
|
|
191
|
+
client,
|
|
192
|
+
tools: vercelTools,
|
|
193
|
+
};
|
|
194
|
+
}
|
|
100
195
|
//# sourceMappingURL=tools.js.map
|
package/dist/tools.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tools.js","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAEhD,OAAO,EAAE,wBAAwB,EAAE,SAAS,EAAE,MAAM,6BAA6B,CAAC;AAClF,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAChE,OAAO,EAAE,IAAI,EAAE,MAAM,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"tools.js","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { ExecutionConfig, ClientTool } from '@mondaydotcomorg/atp-protocol';
|
|
2
2
|
import type { ClientHooks } from '@mondaydotcomorg/atp-client';
|
|
3
|
+
import type { UIMessageStreamWriter } from './event-adapter.js';
|
|
3
4
|
export interface ApprovalRequest {
|
|
4
5
|
message: string;
|
|
5
6
|
context?: Record<string, unknown>;
|
|
@@ -14,26 +15,54 @@ export type ApprovalHandler = (message: string, context?: Record<string, unknown
|
|
|
14
15
|
export interface EmbeddingProvider {
|
|
15
16
|
embed(text: string): Promise<number[]>;
|
|
16
17
|
}
|
|
17
|
-
export interface
|
|
18
|
-
|
|
19
|
-
|
|
18
|
+
export interface InProcessServer {
|
|
19
|
+
start(): Promise<void>;
|
|
20
|
+
handleInit(ctx: unknown): Promise<unknown>;
|
|
21
|
+
getDefinitions(ctx?: unknown): Promise<unknown>;
|
|
22
|
+
getRuntimeDefinitions(ctx?: unknown): Promise<string>;
|
|
23
|
+
getInfo(): unknown;
|
|
24
|
+
handleSearch(ctx: unknown): Promise<unknown>;
|
|
25
|
+
handleExplore(ctx: unknown): Promise<unknown>;
|
|
26
|
+
handleExecute(ctx: unknown): Promise<unknown>;
|
|
27
|
+
handleResume(ctx: unknown, executionId: string): Promise<unknown>;
|
|
28
|
+
}
|
|
29
|
+
interface BaseClientOptions {
|
|
20
30
|
model: any;
|
|
21
31
|
embeddings?: EmbeddingProvider;
|
|
22
32
|
tools?: ClientTool[];
|
|
23
33
|
approvalHandler?: ApprovalHandler;
|
|
24
34
|
hooks?: ClientHooks;
|
|
25
35
|
}
|
|
26
|
-
|
|
36
|
+
/** HTTP mode options */
|
|
37
|
+
interface HttpModeOptions extends BaseClientOptions {
|
|
27
38
|
serverUrl: string;
|
|
28
39
|
headers?: Record<string, string>;
|
|
29
|
-
|
|
30
|
-
embeddings?: EmbeddingProvider;
|
|
31
|
-
approvalHandler?: ApprovalHandler;
|
|
32
|
-
defaultExecutionConfig?: Partial<ExecutionConfig>;
|
|
33
|
-
hooks?: ClientHooks;
|
|
40
|
+
server?: never;
|
|
34
41
|
}
|
|
42
|
+
/** In-process mode options */
|
|
43
|
+
interface InProcessModeOptions extends BaseClientOptions {
|
|
44
|
+
server: InProcessServer;
|
|
45
|
+
serverUrl?: never;
|
|
46
|
+
headers?: never;
|
|
47
|
+
}
|
|
48
|
+
export type VercelAIATPClientOptions = HttpModeOptions | InProcessModeOptions;
|
|
49
|
+
export type CreateATPToolsOptions = (HttpModeOptions | InProcessModeOptions) & {
|
|
50
|
+
defaultExecutionConfig?: Partial<ExecutionConfig>;
|
|
51
|
+
};
|
|
52
|
+
/**
|
|
53
|
+
* Options for creating ATP tools with streaming event support
|
|
54
|
+
*/
|
|
55
|
+
export type StreamingToolsOptions = CreateATPToolsOptions & {
|
|
56
|
+
/**
|
|
57
|
+
* UIMessageStreamWriter to forward events to.
|
|
58
|
+
* Events like 'thinking', 'tool_start', 'tool_end', 'text', 'source' will be
|
|
59
|
+
* converted to Vercel AI SDK format and written to this stream.
|
|
60
|
+
*/
|
|
61
|
+
dataStream: UIMessageStreamWriter;
|
|
62
|
+
};
|
|
35
63
|
export interface ATPToolsResult {
|
|
36
64
|
client: any;
|
|
37
65
|
tools: Record<string, any>;
|
|
38
66
|
}
|
|
67
|
+
export {};
|
|
39
68
|
//# sourceMappingURL=types.d.ts.map
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AACjF,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mondaydotcomorg/atp-vercel-sdk",
|
|
3
|
-
"version": "0.20.
|
|
3
|
+
"version": "0.20.2",
|
|
4
4
|
"description": "Vercel AI SDK integration for Agent Tool Protocol",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.cjs",
|
|
@@ -44,8 +44,8 @@
|
|
|
44
44
|
],
|
|
45
45
|
"license": "MIT",
|
|
46
46
|
"dependencies": {
|
|
47
|
-
"@mondaydotcomorg/atp-client": "0.19.
|
|
48
|
-
"@mondaydotcomorg/atp-protocol": "0.19.
|
|
47
|
+
"@mondaydotcomorg/atp-client": "0.19.15",
|
|
48
|
+
"@mondaydotcomorg/atp-protocol": "0.19.15"
|
|
49
49
|
},
|
|
50
50
|
"peerDependencies": {
|
|
51
51
|
"ai": "^4.0.0",
|
package/src/client.ts
CHANGED
|
@@ -15,14 +15,25 @@ export class VercelAIATPClient {
|
|
|
15
15
|
private approvalHandler?: ApprovalHandler;
|
|
16
16
|
|
|
17
17
|
constructor(options: VercelAIATPClientOptions) {
|
|
18
|
-
const {
|
|
18
|
+
const { model, embeddings, tools, approvalHandler, hooks } = options;
|
|
19
|
+
|
|
20
|
+
if ('server' in options && options.server) {
|
|
21
|
+
this.client = new AgentToolProtocolClient({
|
|
22
|
+
server: options.server,
|
|
23
|
+
hooks,
|
|
24
|
+
serviceProviders: tools ? { tools } : undefined,
|
|
25
|
+
});
|
|
26
|
+
} else if ('serverUrl' in options && options.serverUrl) {
|
|
27
|
+
this.client = new AgentToolProtocolClient({
|
|
28
|
+
baseUrl: options.serverUrl,
|
|
29
|
+
headers: options.headers,
|
|
30
|
+
hooks,
|
|
31
|
+
serviceProviders: tools ? { tools } : undefined,
|
|
32
|
+
});
|
|
33
|
+
} else {
|
|
34
|
+
throw new Error('Either serverUrl or server must be provided');
|
|
35
|
+
}
|
|
19
36
|
|
|
20
|
-
this.client = new AgentToolProtocolClient({
|
|
21
|
-
baseUrl: serverUrl,
|
|
22
|
-
headers,
|
|
23
|
-
hooks,
|
|
24
|
-
serviceProviders: tools ? { tools } : undefined,
|
|
25
|
-
});
|
|
26
37
|
this.model = model;
|
|
27
38
|
this.embeddings = embeddings;
|
|
28
39
|
this.approvalHandler = approvalHandler;
|
|
@@ -0,0 +1,275 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Vercel AI SDK Event Adapter
|
|
3
|
+
*
|
|
4
|
+
* Converts ATP streaming events to Vercel AI SDK UIMessageStream format.
|
|
5
|
+
* Use this to forward ATP events to the chat UI.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import { type ATPEvent, ATPEventType } from '@mondaydotcomorg/atp-protocol';
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* UIMessageStreamWriter interface (subset of Vercel AI SDK's UIMessageStreamWriter)
|
|
12
|
+
*/
|
|
13
|
+
export interface UIMessageStreamWriter {
|
|
14
|
+
write(event: UIStreamEvent): void;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* UI Stream event types that Vercel AI SDK understands
|
|
19
|
+
*/
|
|
20
|
+
export type UIStreamEvent =
|
|
21
|
+
| { type: 'text-start'; id: string }
|
|
22
|
+
| { type: 'text-delta'; id: string; delta: string }
|
|
23
|
+
| { type: 'text-end'; id: string }
|
|
24
|
+
| { type: 'reasoning-start'; id: string }
|
|
25
|
+
| { type: 'reasoning-delta'; id: string; delta: string }
|
|
26
|
+
| { type: 'reasoning-end'; id: string }
|
|
27
|
+
| { type: 'source-url'; url: string; title: string; sourceId: string; providerMetadata?: unknown }
|
|
28
|
+
| { type: string; data?: unknown; transient?: boolean };
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* Options for creating the Vercel event handler
|
|
32
|
+
*/
|
|
33
|
+
export interface CreateVercelEventHandlerOptions {
|
|
34
|
+
/**
|
|
35
|
+
* Prefix for generated text run IDs
|
|
36
|
+
* @default 'atp-text'
|
|
37
|
+
*/
|
|
38
|
+
textRunIdPrefix?: string;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* Creates an event handler that forwards ATP events to a Vercel AI SDK UIMessageStreamWriter.
|
|
43
|
+
*
|
|
44
|
+
* Handles nested tool calls properly:
|
|
45
|
+
* - First tool_start triggers agentStepStart
|
|
46
|
+
* - Inner tool_start/end emit agentStep updates (not start/end)
|
|
47
|
+
* - Last tool_end triggers agentStepEnd
|
|
48
|
+
*
|
|
49
|
+
* @param dataStream - The Vercel AI SDK UIMessageStreamWriter to write events to
|
|
50
|
+
* @param options - Optional configuration
|
|
51
|
+
* @returns An event handler function to pass to ATP's executeStream
|
|
52
|
+
*
|
|
53
|
+
* @example
|
|
54
|
+
* ```typescript
|
|
55
|
+
* const handler = createVercelEventHandler(dataStream);
|
|
56
|
+
*
|
|
57
|
+
* const result = await client.executeStream(code, {}, handler);
|
|
58
|
+
* ```
|
|
59
|
+
*/
|
|
60
|
+
export function createVercelEventHandler(
|
|
61
|
+
dataStream: UIMessageStreamWriter,
|
|
62
|
+
options: CreateVercelEventHandlerOptions = {}
|
|
63
|
+
): (event: ATPEvent) => void {
|
|
64
|
+
const { textRunIdPrefix = 'atp-text' } = options;
|
|
65
|
+
|
|
66
|
+
let currentTextRunId: string | undefined;
|
|
67
|
+
let textRunCounter = 0;
|
|
68
|
+
|
|
69
|
+
// Track reasoning state for proper start/delta/end events
|
|
70
|
+
let reasoningRunId: string | undefined;
|
|
71
|
+
let reasoningCounter = 0;
|
|
72
|
+
|
|
73
|
+
// Track nested tool calls with a stack
|
|
74
|
+
const toolStack: Array<{ toolName: string; apiGroup: string }> = [];
|
|
75
|
+
|
|
76
|
+
return (event: ATPEvent) => {
|
|
77
|
+
switch (event.type) {
|
|
78
|
+
case ATPEventType.THINKING: {
|
|
79
|
+
const data = event.data as { content: string; step?: string };
|
|
80
|
+
|
|
81
|
+
// Start new reasoning block if needed
|
|
82
|
+
if (!reasoningRunId) {
|
|
83
|
+
reasoningRunId = `atp-reasoning-${++reasoningCounter}`;
|
|
84
|
+
dataStream.write({
|
|
85
|
+
type: 'reasoning-start',
|
|
86
|
+
id: reasoningRunId,
|
|
87
|
+
} as UIStreamEvent);
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
// Write reasoning delta
|
|
91
|
+
dataStream.write({
|
|
92
|
+
type: 'reasoning-delta',
|
|
93
|
+
id: reasoningRunId,
|
|
94
|
+
delta: data.content + '\n',
|
|
95
|
+
} as UIStreamEvent);
|
|
96
|
+
break;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
case ATPEventType.TOOL_START: {
|
|
100
|
+
const data = event.data as { toolName: string; apiGroup: string; input: unknown };
|
|
101
|
+
const isFirstTool = toolStack.length === 0;
|
|
102
|
+
|
|
103
|
+
toolStack.push({ toolName: data.toolName, apiGroup: data.apiGroup });
|
|
104
|
+
|
|
105
|
+
if (isFirstTool) {
|
|
106
|
+
// First tool - emit agentStepStart
|
|
107
|
+
dataStream.write({
|
|
108
|
+
type: 'data-agentStepStart',
|
|
109
|
+
data: `Executing ${data.apiGroup}.${data.toolName}...`,
|
|
110
|
+
transient: true,
|
|
111
|
+
});
|
|
112
|
+
} else {
|
|
113
|
+
// Nested tool - emit progress update instead
|
|
114
|
+
dataStream.write({
|
|
115
|
+
type: 'data-agentStep',
|
|
116
|
+
data: `→ ${data.apiGroup}.${data.toolName}`,
|
|
117
|
+
transient: true,
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
break;
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
case ATPEventType.TOOL_END: {
|
|
124
|
+
const data = event.data as {
|
|
125
|
+
toolName: string;
|
|
126
|
+
apiGroup: string;
|
|
127
|
+
output: unknown;
|
|
128
|
+
duration: number;
|
|
129
|
+
success: boolean;
|
|
130
|
+
error?: string;
|
|
131
|
+
};
|
|
132
|
+
|
|
133
|
+
toolStack.pop();
|
|
134
|
+
const isLastTool = toolStack.length === 0;
|
|
135
|
+
|
|
136
|
+
// Close reasoning block when outer tool ends
|
|
137
|
+
if (isLastTool && reasoningRunId) {
|
|
138
|
+
dataStream.write({
|
|
139
|
+
type: 'reasoning-end',
|
|
140
|
+
id: reasoningRunId,
|
|
141
|
+
} as UIStreamEvent);
|
|
142
|
+
reasoningRunId = undefined;
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
if (isLastTool) {
|
|
146
|
+
// Last tool - emit agentStepEnd
|
|
147
|
+
dataStream.write({
|
|
148
|
+
type: 'data-agentStepEnd',
|
|
149
|
+
data: data.success
|
|
150
|
+
? `Completed ${data.apiGroup}.${data.toolName} (${data.duration}ms)`
|
|
151
|
+
: `Failed ${data.apiGroup}.${data.toolName}: ${data.error}`,
|
|
152
|
+
transient: true,
|
|
153
|
+
});
|
|
154
|
+
} else {
|
|
155
|
+
// Nested tool finished - emit progress update
|
|
156
|
+
dataStream.write({
|
|
157
|
+
type: 'data-agentStep',
|
|
158
|
+
data: data.success
|
|
159
|
+
? `✓ ${data.apiGroup}.${data.toolName} (${data.duration}ms)`
|
|
160
|
+
: `✗ ${data.apiGroup}.${data.toolName}: ${data.error}`,
|
|
161
|
+
transient: true,
|
|
162
|
+
});
|
|
163
|
+
}
|
|
164
|
+
break;
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
case ATPEventType.TEXT: {
|
|
168
|
+
const data = event.data as { text: string };
|
|
169
|
+
const runId = event.runId || `${textRunIdPrefix}-${++textRunCounter}`;
|
|
170
|
+
|
|
171
|
+
// If we're starting a new text run, close the previous one
|
|
172
|
+
if (currentTextRunId && currentTextRunId !== runId) {
|
|
173
|
+
dataStream.write({ type: 'text-end', id: currentTextRunId });
|
|
174
|
+
currentTextRunId = undefined;
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
// Start new text run if needed
|
|
178
|
+
if (!currentTextRunId || currentTextRunId !== runId) {
|
|
179
|
+
currentTextRunId = runId;
|
|
180
|
+
dataStream.write({ type: 'text-start', id: currentTextRunId });
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
// Write text delta
|
|
184
|
+
dataStream.write({
|
|
185
|
+
type: 'text-delta',
|
|
186
|
+
id: currentTextRunId,
|
|
187
|
+
delta: data.text,
|
|
188
|
+
});
|
|
189
|
+
break;
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
case ATPEventType.TEXT_END:
|
|
193
|
+
if (currentTextRunId) {
|
|
194
|
+
dataStream.write({ type: 'text-end', id: currentTextRunId });
|
|
195
|
+
currentTextRunId = undefined;
|
|
196
|
+
}
|
|
197
|
+
break;
|
|
198
|
+
|
|
199
|
+
case ATPEventType.SOURCE: {
|
|
200
|
+
const data = event.data as {
|
|
201
|
+
url: string;
|
|
202
|
+
title: string;
|
|
203
|
+
summary?: string;
|
|
204
|
+
createdAt?: string;
|
|
205
|
+
};
|
|
206
|
+
dataStream.write({
|
|
207
|
+
type: 'source-url',
|
|
208
|
+
url: data.url,
|
|
209
|
+
title: data.title,
|
|
210
|
+
sourceId: `${data.title}-${event.timestamp}`,
|
|
211
|
+
providerMetadata: {
|
|
212
|
+
aiChat: {
|
|
213
|
+
summary: data.summary,
|
|
214
|
+
createdAt: data.createdAt,
|
|
215
|
+
},
|
|
216
|
+
},
|
|
217
|
+
});
|
|
218
|
+
break;
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
case ATPEventType.PROGRESS: {
|
|
222
|
+
const data = event.data as { message: string; fraction: number };
|
|
223
|
+
dataStream.write({
|
|
224
|
+
type: 'data-agentStep',
|
|
225
|
+
data: `${data.message} (${Math.round(data.fraction * 100)}%)`,
|
|
226
|
+
transient: true,
|
|
227
|
+
});
|
|
228
|
+
break;
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
case ATPEventType.ERROR: {
|
|
232
|
+
const data = event.data as { message: string; code?: string };
|
|
233
|
+
dataStream.write({
|
|
234
|
+
type: 'data-error',
|
|
235
|
+
data: data.message,
|
|
236
|
+
});
|
|
237
|
+
break;
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
default:
|
|
241
|
+
// Forward unknown events as custom data events
|
|
242
|
+
dataStream.write({
|
|
243
|
+
type: `data-${event.type}`,
|
|
244
|
+
data: event.data,
|
|
245
|
+
transient: true,
|
|
246
|
+
});
|
|
247
|
+
break;
|
|
248
|
+
}
|
|
249
|
+
};
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
/**
|
|
253
|
+
* Creates an event handler that collects events into an array.
|
|
254
|
+
* Useful for testing or post-processing events.
|
|
255
|
+
*
|
|
256
|
+
* @returns Object with handler function and collected events array
|
|
257
|
+
*/
|
|
258
|
+
export function createEventCollector(): {
|
|
259
|
+
handler: (event: ATPEvent) => void;
|
|
260
|
+
events: ATPEvent[];
|
|
261
|
+
clear: () => void;
|
|
262
|
+
} {
|
|
263
|
+
const events: ATPEvent[] = [];
|
|
264
|
+
|
|
265
|
+
return {
|
|
266
|
+
handler: (event: ATPEvent) => {
|
|
267
|
+
events.push(event);
|
|
268
|
+
},
|
|
269
|
+
events,
|
|
270
|
+
clear: () => {
|
|
271
|
+
events.length = 0;
|
|
272
|
+
},
|
|
273
|
+
};
|
|
274
|
+
}
|
|
275
|
+
|
package/src/index.ts
CHANGED
|
@@ -1,8 +1,16 @@
|
|
|
1
1
|
export { VercelAIATPClient } from './client.js';
|
|
2
|
-
export { createATPTools } from './tools.js';
|
|
2
|
+
export { createATPTools, createATPStreamingTools } from './tools.js';
|
|
3
|
+
export {
|
|
4
|
+
createVercelEventHandler,
|
|
5
|
+
createEventCollector,
|
|
6
|
+
type UIMessageStreamWriter,
|
|
7
|
+
type UIStreamEvent,
|
|
8
|
+
type CreateVercelEventHandlerOptions,
|
|
9
|
+
} from './event-adapter.js';
|
|
3
10
|
export type {
|
|
4
11
|
VercelAIATPClientOptions,
|
|
5
12
|
CreateATPToolsOptions,
|
|
13
|
+
StreamingToolsOptions,
|
|
6
14
|
ATPToolsResult,
|
|
7
15
|
ApprovalHandler,
|
|
8
16
|
ApprovalRequest,
|
package/src/tools.ts
CHANGED
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
2
|
import { VercelAIATPClient } from './client.js';
|
|
3
|
-
import type { CreateATPToolsOptions, ATPToolsResult } from './types.js';
|
|
3
|
+
import type { CreateATPToolsOptions, ATPToolsResult, StreamingToolsOptions } from './types.js';
|
|
4
4
|
import { createToolsFromATPClient, ToolNames } from '@mondaydotcomorg/atp-client';
|
|
5
5
|
import { ExecutionStatus } from '@mondaydotcomorg/atp-protocol';
|
|
6
6
|
import { tool } from 'ai';
|
|
7
|
+
import { createVercelEventHandler, type UIMessageStreamWriter } from './event-adapter.js';
|
|
7
8
|
|
|
8
9
|
export async function createATPTools(options: CreateATPToolsOptions): Promise<ATPToolsResult> {
|
|
9
10
|
const { defaultExecutionConfig, ...clientOptions } = options;
|
|
@@ -102,3 +103,109 @@ export async function createATPTools(options: CreateATPToolsOptions): Promise<AT
|
|
|
102
103
|
tools: vercelTools,
|
|
103
104
|
};
|
|
104
105
|
}
|
|
106
|
+
|
|
107
|
+
/**
|
|
108
|
+
* Creates ATP tools with streaming event support.
|
|
109
|
+
* Events from tool execution will be forwarded to the provided dataStream.
|
|
110
|
+
*
|
|
111
|
+
* @param options - Tool creation options including dataStream for event forwarding
|
|
112
|
+
* @returns Promise resolving to client and tools with streaming support
|
|
113
|
+
*
|
|
114
|
+
* @example
|
|
115
|
+
* ```typescript
|
|
116
|
+
* // In your Vercel AI SDK route handler
|
|
117
|
+
* const dataStream = createUIMessageStream({...});
|
|
118
|
+
*
|
|
119
|
+
* const { tools } = await createATPStreamingTools({
|
|
120
|
+
* serverUrl: 'http://localhost:3333',
|
|
121
|
+
* model: openai('gpt-4'),
|
|
122
|
+
* dataStream,
|
|
123
|
+
* });
|
|
124
|
+
*
|
|
125
|
+
* // Use tools in streamText
|
|
126
|
+
* const result = streamText({
|
|
127
|
+
* model: openai('gpt-4'),
|
|
128
|
+
* messages,
|
|
129
|
+
* tools,
|
|
130
|
+
* });
|
|
131
|
+
* ```
|
|
132
|
+
*/
|
|
133
|
+
export async function createATPStreamingTools(
|
|
134
|
+
options: StreamingToolsOptions
|
|
135
|
+
): Promise<ATPToolsResult> {
|
|
136
|
+
const { dataStream, defaultExecutionConfig, ...clientOptions } = options;
|
|
137
|
+
|
|
138
|
+
const client = new VercelAIATPClient(clientOptions);
|
|
139
|
+
await client.connect();
|
|
140
|
+
|
|
141
|
+
const eventHandler = createVercelEventHandler(dataStream);
|
|
142
|
+
const underlyingClient = client.getUnderlyingClient();
|
|
143
|
+
|
|
144
|
+
const vercelTools: Record<string, any> = {};
|
|
145
|
+
|
|
146
|
+
vercelTools.atp_execute_code = tool({
|
|
147
|
+
description:
|
|
148
|
+
'Execute TypeScript code in ATP sandbox with streaming events for thinking, tool execution, and text output',
|
|
149
|
+
parameters: z.object({
|
|
150
|
+
code: z.string().describe('TypeScript code to execute in the ATP sandbox'),
|
|
151
|
+
}),
|
|
152
|
+
execute: async ({ code }: { code: string }) => {
|
|
153
|
+
try {
|
|
154
|
+
const result = await underlyingClient.executeStream(
|
|
155
|
+
code,
|
|
156
|
+
defaultExecutionConfig,
|
|
157
|
+
eventHandler
|
|
158
|
+
);
|
|
159
|
+
|
|
160
|
+
if (result.status === ExecutionStatus.COMPLETED) {
|
|
161
|
+
return {
|
|
162
|
+
success: true,
|
|
163
|
+
result: result.result,
|
|
164
|
+
stats: result.stats,
|
|
165
|
+
};
|
|
166
|
+
} else if (result.status === ExecutionStatus.FAILED) {
|
|
167
|
+
return {
|
|
168
|
+
success: false,
|
|
169
|
+
error: result.error,
|
|
170
|
+
stats: result.stats,
|
|
171
|
+
};
|
|
172
|
+
} else {
|
|
173
|
+
return {
|
|
174
|
+
success: false,
|
|
175
|
+
error: 'Execution in unexpected state: ' + result.status,
|
|
176
|
+
};
|
|
177
|
+
}
|
|
178
|
+
} catch (error: any) {
|
|
179
|
+
return {
|
|
180
|
+
success: false,
|
|
181
|
+
error: error.message || 'Unknown error',
|
|
182
|
+
};
|
|
183
|
+
}
|
|
184
|
+
},
|
|
185
|
+
});
|
|
186
|
+
|
|
187
|
+
vercelTools.atp_get_type_definitions = tool({
|
|
188
|
+
description:
|
|
189
|
+
'Get TypeScript type definitions for ATP runtime APIs to understand available functions',
|
|
190
|
+
parameters: z.object({}),
|
|
191
|
+
execute: async () => {
|
|
192
|
+
try {
|
|
193
|
+
const types = client.getTypeDefinitions();
|
|
194
|
+
return {
|
|
195
|
+
success: true,
|
|
196
|
+
types,
|
|
197
|
+
};
|
|
198
|
+
} catch (error: any) {
|
|
199
|
+
return {
|
|
200
|
+
success: false,
|
|
201
|
+
error: error.message,
|
|
202
|
+
};
|
|
203
|
+
}
|
|
204
|
+
},
|
|
205
|
+
});
|
|
206
|
+
|
|
207
|
+
return {
|
|
208
|
+
client,
|
|
209
|
+
tools: vercelTools,
|
|
210
|
+
};
|
|
211
|
+
}
|
package/src/types.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { ExecutionConfig, ClientTool } from '@mondaydotcomorg/atp-protocol';
|
|
2
2
|
import type { ClientHooks } from '@mondaydotcomorg/atp-client';
|
|
3
|
+
import type { UIMessageStreamWriter } from './event-adapter.js';
|
|
3
4
|
|
|
4
5
|
export interface ApprovalRequest {
|
|
5
6
|
message: string;
|
|
@@ -22,9 +23,19 @@ export interface EmbeddingProvider {
|
|
|
22
23
|
embed(text: string): Promise<number[]>;
|
|
23
24
|
}
|
|
24
25
|
|
|
25
|
-
export interface
|
|
26
|
-
|
|
27
|
-
|
|
26
|
+
export interface InProcessServer {
|
|
27
|
+
start(): Promise<void>;
|
|
28
|
+
handleInit(ctx: unknown): Promise<unknown>;
|
|
29
|
+
getDefinitions(ctx?: unknown): Promise<unknown>;
|
|
30
|
+
getRuntimeDefinitions(ctx?: unknown): Promise<string>;
|
|
31
|
+
getInfo(): unknown;
|
|
32
|
+
handleSearch(ctx: unknown): Promise<unknown>;
|
|
33
|
+
handleExplore(ctx: unknown): Promise<unknown>;
|
|
34
|
+
handleExecute(ctx: unknown): Promise<unknown>;
|
|
35
|
+
handleResume(ctx: unknown, executionId: string): Promise<unknown>;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
interface BaseClientOptions {
|
|
28
39
|
model: any;
|
|
29
40
|
embeddings?: EmbeddingProvider;
|
|
30
41
|
tools?: ClientTool[];
|
|
@@ -32,16 +43,38 @@ export interface VercelAIATPClientOptions {
|
|
|
32
43
|
hooks?: ClientHooks;
|
|
33
44
|
}
|
|
34
45
|
|
|
35
|
-
|
|
46
|
+
/** HTTP mode options */
|
|
47
|
+
interface HttpModeOptions extends BaseClientOptions {
|
|
36
48
|
serverUrl: string;
|
|
37
49
|
headers?: Record<string, string>;
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
50
|
+
server?: never;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/** In-process mode options */
|
|
54
|
+
interface InProcessModeOptions extends BaseClientOptions {
|
|
55
|
+
server: InProcessServer;
|
|
56
|
+
serverUrl?: never;
|
|
57
|
+
headers?: never;
|
|
43
58
|
}
|
|
44
59
|
|
|
60
|
+
export type VercelAIATPClientOptions = HttpModeOptions | InProcessModeOptions;
|
|
61
|
+
|
|
62
|
+
export type CreateATPToolsOptions = (HttpModeOptions | InProcessModeOptions) & {
|
|
63
|
+
defaultExecutionConfig?: Partial<ExecutionConfig>;
|
|
64
|
+
};
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* Options for creating ATP tools with streaming event support
|
|
68
|
+
*/
|
|
69
|
+
export type StreamingToolsOptions = CreateATPToolsOptions & {
|
|
70
|
+
/**
|
|
71
|
+
* UIMessageStreamWriter to forward events to.
|
|
72
|
+
* Events like 'thinking', 'tool_start', 'tool_end', 'text', 'source' will be
|
|
73
|
+
* converted to Vercel AI SDK format and written to this stream.
|
|
74
|
+
*/
|
|
75
|
+
dataStream: UIMessageStreamWriter;
|
|
76
|
+
};
|
|
77
|
+
|
|
45
78
|
export interface ATPToolsResult {
|
|
46
79
|
client: any;
|
|
47
80
|
tools: Record<string, any>;
|