assistant-stream 0.2.5 → 0.2.6
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/core/tool/ToolCallReader.d.ts +8 -7
- package/dist/core/tool/ToolCallReader.d.ts.map +1 -1
- package/dist/core/tool/ToolCallReader.js +11 -4
- package/dist/core/tool/ToolCallReader.js.map +1 -1
- package/dist/core/tool/ToolExecutionStream.d.ts +3 -3
- package/dist/core/tool/ToolExecutionStream.d.ts.map +1 -1
- package/dist/core/tool/ToolExecutionStream.js.map +1 -1
- package/dist/core/tool/ToolResponse.d.ts +1 -1
- package/dist/core/tool/ToolResponse.d.ts.map +1 -1
- package/dist/core/tool/ToolResponse.js.map +1 -1
- package/dist/core/tool/tool-types.d.ts +4 -5
- package/dist/core/tool/tool-types.d.ts.map +1 -1
- package/dist/core/tool/toolResultStream.d.ts +2 -2
- package/dist/core/tool/toolResultStream.d.ts.map +1 -1
- package/dist/core/tool/toolResultStream.js +2 -1
- package/dist/core/tool/toolResultStream.js.map +1 -1
- package/dist/core/tool/type-path-utils.d.ts.map +1 -1
- package/dist/utils/index.d.ts +3 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +6 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/json/index.d.ts +2 -0
- package/dist/utils/json/index.d.ts.map +1 -0
- package/dist/utils/json/index.js +1 -0
- package/dist/utils/json/index.js.map +1 -0
- package/package.json +7 -7
- package/src/core/tool/ToolCallReader.ts +60 -36
- package/src/core/tool/ToolExecutionStream.ts +14 -5
- package/src/core/tool/ToolResponse.ts +3 -1
- package/src/core/tool/tool-types.ts +10 -5
- package/src/core/tool/toolResultStream.ts +17 -12
- package/src/core/tool/type-path-utils.ts +2 -0
- package/src/utils/index.ts +2 -0
- package/src/utils/json/index.ts +1 -0
|
@@ -1,23 +1,24 @@
|
|
|
1
1
|
import { ToolCallArgsReader, ToolCallReader, ToolCallResponseReader } from "./tool-types";
|
|
2
|
-
import { TypeAtPath, TypePath } from "./type-path-utils";
|
|
2
|
+
import { DeepPartial, TypeAtPath, TypePath } from "./type-path-utils";
|
|
3
3
|
import { ToolResponse } from "./ToolResponse";
|
|
4
|
-
|
|
4
|
+
import { AsyncIterableStream, ReadonlyJSONObject, ReadonlyJSONValue } from "../../utils";
|
|
5
|
+
export declare class ToolCallArgsReaderImpl<T extends ReadonlyJSONObject> implements ToolCallArgsReader<T> {
|
|
5
6
|
private argTextDeltas;
|
|
6
7
|
private handles;
|
|
7
8
|
private args;
|
|
8
9
|
constructor(argTextDeltas: ReadableStream<string>);
|
|
9
10
|
private processStream;
|
|
10
11
|
get<PathT extends TypePath<T>>(...fieldPath: PathT): Promise<TypeAtPath<T, PathT>>;
|
|
11
|
-
streamValues<PathT extends TypePath<T>>(...fieldPath: PathT):
|
|
12
|
-
streamText<PathT extends TypePath<T>>(...fieldPath: PathT):
|
|
13
|
-
forEach<PathT extends TypePath<T>>(...fieldPath: PathT):
|
|
12
|
+
streamValues<PathT extends TypePath<T>>(...fieldPath: PathT): AsyncIterableStream<DeepPartial<TypeAtPath<T, PathT>>>;
|
|
13
|
+
streamText<PathT extends TypePath<T>>(...fieldPath: PathT): TypeAtPath<T, PathT> extends string & infer U ? AsyncIterableStream<U> : never;
|
|
14
|
+
forEach<PathT extends TypePath<T>>(...fieldPath: PathT): TypeAtPath<T, PathT> extends Array<infer U> ? AsyncIterableStream<U> : never;
|
|
14
15
|
}
|
|
15
|
-
export declare class ToolCallResponseReaderImpl<TResult> implements ToolCallResponseReader<TResult> {
|
|
16
|
+
export declare class ToolCallResponseReaderImpl<TResult extends ReadonlyJSONValue> implements ToolCallResponseReader<TResult> {
|
|
16
17
|
private readonly promise;
|
|
17
18
|
constructor(promise: Promise<ToolResponse<TResult>>);
|
|
18
19
|
get(): Promise<ToolResponse<TResult>>;
|
|
19
20
|
}
|
|
20
|
-
export declare class ToolCallReaderImpl<TArgs, TResult> implements ToolCallReader<TArgs, TResult> {
|
|
21
|
+
export declare class ToolCallReaderImpl<TArgs extends ReadonlyJSONObject, TResult extends ReadonlyJSONValue> implements ToolCallReader<TArgs, TResult> {
|
|
21
22
|
readonly args: ToolCallArgsReaderImpl<TArgs>;
|
|
22
23
|
readonly response: ToolCallResponseReaderImpl<TResult>;
|
|
23
24
|
private readonly writable;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ToolCallReader.d.ts","sourceRoot":"","sources":["../../../src/core/tool/ToolCallReader.ts"],"names":[],"mappings":"AAKA,OAAO,EACL,kBAAkB,EAClB,cAAc,EACd,sBAAsB,EACvB,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"ToolCallReader.d.ts","sourceRoot":"","sources":["../../../src/core/tool/ToolCallReader.ts"],"names":[],"mappings":"AAKA,OAAO,EACL,kBAAkB,EAClB,cAAc,EACd,sBAAsB,EACvB,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AACtE,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAEL,mBAAmB,EACnB,kBAAkB,EAClB,iBAAiB,EAClB,MAAM,aAAa,CAAC;AAyNrB,qBAAa,sBAAsB,CAAC,CAAC,SAAS,kBAAkB,CAC9D,YAAW,kBAAkB,CAAC,CAAC,CAAC;IAEhC,OAAO,CAAC,aAAa,CAAyB;IAC9C,OAAO,CAAC,OAAO,CAA0B;IACzC,OAAO,CAAC,IAAI,CAAuC;gBAEvC,aAAa,EAAE,cAAc,CAAC,MAAM,CAAC;YAKnC,aAAa;IA6B3B,GAAG,CAAC,KAAK,SAAS,QAAQ,CAAC,CAAC,CAAC,EAC3B,GAAG,SAAS,EAAE,KAAK,GAClB,OAAO,CAAC,UAAU,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;IA4BhC,YAAY,CAAC,KAAK,SAAS,QAAQ,CAAC,CAAC,CAAC,EACpC,GAAG,SAAS,EAAE,KAAK,GAClB,mBAAmB,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC;IA4BzD,UAAU,CAAC,KAAK,SAAS,QAAQ,CAAC,CAAC,CAAC,EAClC,GAAG,SAAS,EAAE,KAAK,GAClB,UAAU,CAAC,CAAC,EAAE,KAAK,CAAC,SAAS,MAAM,GAAG,MAAM,CAAC,GAC5C,mBAAmB,CAAC,CAAC,CAAC,GACtB,KAAK;IA4BT,OAAO,CAAC,KAAK,SAAS,QAAQ,CAAC,CAAC,CAAC,EAC/B,GAAG,SAAS,EAAE,KAAK,GAClB,UAAU,CAAC,CAAC,EAAE,KAAK,CAAC,SAAS,KAAK,CAAC,MAAM,CAAC,CAAC,GAC1C,mBAAmB,CAAC,CAAC,CAAC,GACtB,KAAK;CA2BV;AAED,qBAAa,0BAA0B,CAAC,OAAO,SAAS,iBAAiB,CACvE,YAAW,sBAAsB,CAAC,OAAO,CAAC;IAE9B,OAAO,CAAC,QAAQ,CAAC,OAAO;gBAAP,OAAO,EAAE,OAAO,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;IAE7D,GAAG;CAGX;AAED,qBAAa,kBAAkB,CAC7B,KAAK,SAAS,kBAAkB,EAChC,OAAO,SAAS,iBAAiB,CACjC,YAAW,cAAc,CAAC,KAAK,EAAE,OAAO,CAAC;IAEzC,SAAgB,IAAI,EAAE,sBAAsB,CAAC,KAAK,CAAC,CAAC;IACpD,SAAgB,QAAQ,EAAE,0BAA0B,CAAC,OAAO,CAAC,CAAC;IAC9D,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAyB;IAClD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAyC;IAE1D,QAAQ,EAAE,MAAM,CAAM;;IAYvB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAatD,WAAW,CAAC,KAAK,EAAE,YAAY,CAAC,OAAO,CAAC,GAAG,IAAI;IAI/C,MAAM;;MAKJ;CACH"}
|
|
@@ -4,6 +4,9 @@ import {
|
|
|
4
4
|
parsePartialJsonObject,
|
|
5
5
|
getPartialJsonObjectFieldState
|
|
6
6
|
} from "../../utils/json/parse-partial-json-object.js";
|
|
7
|
+
import {
|
|
8
|
+
asAsyncIterableStream
|
|
9
|
+
} from "../../utils/index.js";
|
|
7
10
|
function getField(obj, fieldPath) {
|
|
8
11
|
let current = obj;
|
|
9
12
|
for (const key of fieldPath) {
|
|
@@ -188,7 +191,11 @@ var ToolCallArgsReaderImpl = class {
|
|
|
188
191
|
}
|
|
189
192
|
get(...fieldPath) {
|
|
190
193
|
return new Promise((resolve, reject) => {
|
|
191
|
-
const handle = new GetHandle(
|
|
194
|
+
const handle = new GetHandle(
|
|
195
|
+
resolve,
|
|
196
|
+
reject,
|
|
197
|
+
fieldPath
|
|
198
|
+
);
|
|
192
199
|
if (this.args && getPartialJsonObjectFieldState(
|
|
193
200
|
this.args,
|
|
194
201
|
fieldPath
|
|
@@ -221,7 +228,7 @@ var ToolCallArgsReaderImpl = class {
|
|
|
221
228
|
}
|
|
222
229
|
}
|
|
223
230
|
});
|
|
224
|
-
return stream;
|
|
231
|
+
return asAsyncIterableStream(stream);
|
|
225
232
|
}
|
|
226
233
|
streamText(...fieldPath) {
|
|
227
234
|
const simplePath = fieldPath;
|
|
@@ -241,7 +248,7 @@ var ToolCallArgsReaderImpl = class {
|
|
|
241
248
|
}
|
|
242
249
|
}
|
|
243
250
|
});
|
|
244
|
-
return stream;
|
|
251
|
+
return asAsyncIterableStream(stream);
|
|
245
252
|
}
|
|
246
253
|
forEach(...fieldPath) {
|
|
247
254
|
const simplePath = fieldPath;
|
|
@@ -261,7 +268,7 @@ var ToolCallArgsReaderImpl = class {
|
|
|
261
268
|
}
|
|
262
269
|
}
|
|
263
270
|
});
|
|
264
|
-
return stream;
|
|
271
|
+
return asAsyncIterableStream(stream);
|
|
265
272
|
}
|
|
266
273
|
};
|
|
267
274
|
var ToolCallResponseReaderImpl = class {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/core/tool/ToolCallReader.ts"],"sourcesContent":["import { promiseWithResolvers } from \"../../utils/promiseWithResolvers\";\nimport {\n parsePartialJsonObject,\n getPartialJsonObjectFieldState,\n} from \"../../utils/json/parse-partial-json-object\";\nimport {\n ToolCallArgsReader,\n ToolCallReader,\n ToolCallResponseReader,\n} from \"./tool-types\";\nimport { TypeAtPath, TypePath } from \"./type-path-utils\";\nimport { ToolResponse } from \"./ToolResponse\";\n\n// TODO: remove dispose\n\nfunction getField<T>(obj: T, fieldPath: (string | number)[]): any {\n let current: any = obj;\n for (const key of fieldPath) {\n if (current === undefined || current === null) {\n return undefined;\n }\n current = current[key as string | number];\n }\n return current;\n}\n\ninterface Handle {\n update(args: unknown): void;\n dispose(): void;\n}\n\nclass GetHandle<T> implements Handle {\n private resolve: (value: any) => void;\n private reject: (reason: unknown) => void;\n private disposed = false;\n private fieldPath: (string | number)[];\n\n constructor(\n resolve: (value: any) => void,\n reject: (reason: unknown) => void,\n fieldPath: (string | number)[],\n ) {\n this.resolve = resolve;\n this.reject = reject;\n this.fieldPath = fieldPath;\n }\n\n update(args: unknown): void {\n if (this.disposed) return;\n\n try {\n // Check if the field is complete\n if (\n getPartialJsonObjectFieldState(\n args as Record<string, unknown>,\n this.fieldPath,\n ) === \"complete\"\n ) {\n const value = getField(args as T, this.fieldPath);\n if (value !== undefined) {\n this.resolve(value);\n this.dispose();\n }\n }\n } catch (e) {\n this.reject(e);\n this.dispose();\n }\n }\n\n dispose(): void {\n this.disposed = true;\n }\n}\n\nclass StreamValuesHandle<T> implements Handle {\n private controller: ReadableStreamDefaultController<any>;\n private disposed = false;\n private fieldPath: (string | number)[];\n\n constructor(\n controller: ReadableStreamDefaultController<any>,\n fieldPath: (string | number)[],\n ) {\n this.controller = controller;\n this.fieldPath = fieldPath;\n }\n\n update(args: unknown): void {\n if (this.disposed) return;\n\n try {\n const value = getField(args as T, this.fieldPath);\n\n if (value !== undefined) {\n this.controller.enqueue(value);\n }\n\n // Check if the field is complete, if so close the stream\n if (\n getPartialJsonObjectFieldState(\n args as Record<string, unknown>,\n this.fieldPath,\n ) === \"complete\"\n ) {\n this.controller.close();\n this.dispose();\n }\n } catch (e) {\n this.controller.error(e);\n this.dispose();\n }\n }\n\n dispose(): void {\n this.disposed = true;\n }\n}\n\nclass StreamTextHandle<T> implements Handle {\n private controller: ReadableStreamDefaultController<any>;\n private disposed = false;\n private fieldPath: (string | number)[];\n private lastValue: any = undefined;\n\n constructor(\n controller: ReadableStreamDefaultController<any>,\n fieldPath: (string | number)[],\n ) {\n this.controller = controller;\n this.fieldPath = fieldPath;\n }\n\n update(args: unknown): void {\n if (this.disposed) return;\n\n try {\n const value = getField(args as T, this.fieldPath);\n\n if (value !== undefined && typeof value === \"string\") {\n const delta = value.substring(this.lastValue?.length || 0);\n this.lastValue = value;\n this.controller.enqueue(delta);\n }\n\n // Check if the field is complete, if so close the stream\n if (\n getPartialJsonObjectFieldState(\n args as Record<string, unknown>,\n this.fieldPath,\n ) === \"complete\"\n ) {\n this.controller.close();\n this.dispose();\n }\n } catch (e) {\n this.controller.error(e);\n this.dispose();\n }\n }\n\n dispose(): void {\n this.disposed = true;\n }\n}\n\nclass ForEachHandle<T> implements Handle {\n private controller: ReadableStreamDefaultController<any>;\n private disposed = false;\n private fieldPath: (string | number)[];\n private processedIndexes = new Set<number>();\n\n constructor(\n controller: ReadableStreamDefaultController<any>,\n fieldPath: (string | number)[],\n ) {\n this.controller = controller;\n this.fieldPath = fieldPath;\n }\n\n update(args: unknown): void {\n if (this.disposed) return;\n\n try {\n const array = getField(args as T, this.fieldPath) as unknown as any[];\n\n if (!Array.isArray(array)) {\n return;\n }\n\n // Check each array element and emit completed ones that haven't been processed\n for (let i = 0; i < array.length; i++) {\n if (!this.processedIndexes.has(i)) {\n const elementPath = [...this.fieldPath, i];\n if (\n getPartialJsonObjectFieldState(\n args as Record<string, unknown>,\n elementPath,\n ) === \"complete\"\n ) {\n this.controller.enqueue(array[i]);\n this.processedIndexes.add(i);\n }\n }\n }\n\n // Check if the entire array is complete\n if (\n getPartialJsonObjectFieldState(\n args as Record<string, unknown>,\n this.fieldPath,\n ) === \"complete\"\n ) {\n this.controller.close();\n this.dispose();\n }\n } catch (e) {\n this.controller.error(e);\n this.dispose();\n }\n }\n\n dispose(): void {\n this.disposed = true;\n }\n}\n\n// Implementation of ToolCallReader that uses stream of partial JSON\nexport class ToolCallArgsReaderImpl<T> implements ToolCallArgsReader<T> {\n private argTextDeltas: ReadableStream<string>;\n private handles: Set<Handle> = new Set();\n private args: any = parsePartialJsonObject(\"\");\n\n constructor(argTextDeltas: ReadableStream<string>) {\n this.argTextDeltas = argTextDeltas;\n this.processStream();\n }\n\n private async processStream(): Promise<void> {\n try {\n let accumulatedText = \"\";\n const reader = this.argTextDeltas.getReader();\n\n while (true) {\n const { value, done } = await reader.read();\n if (done) break;\n\n accumulatedText += value;\n const parsedArgs = parsePartialJsonObject(accumulatedText);\n\n if (parsedArgs !== undefined) {\n this.args = parsedArgs;\n // Notify all handles of the updated args\n for (const handle of this.handles) {\n handle.update(parsedArgs);\n }\n }\n }\n } catch (error) {\n console.error(\"Error processing argument stream:\", error);\n // Notify handles of the error\n for (const handle of this.handles) {\n handle.dispose();\n }\n }\n }\n\n get<PathT extends TypePath<T>>(\n ...fieldPath: PathT\n ): Promise<TypeAtPath<T, PathT>> {\n return new Promise<any>((resolve, reject) => {\n const handle = new GetHandle<T>(resolve, reject, fieldPath);\n\n // Check if the field is already complete in current args\n if (\n this.args &&\n getPartialJsonObjectFieldState(\n this.args as Record<string, unknown>,\n fieldPath,\n ) === \"complete\"\n ) {\n const value = getField(this.args as T, fieldPath);\n if (value !== undefined) {\n resolve(value);\n return;\n }\n }\n\n this.handles.add(handle);\n handle.update(this.args);\n });\n }\n\n streamValues<PathT extends TypePath<T>>(...fieldPath: PathT): any {\n // Use a type assertion to convert the complex TypePath to a simple array\n const simplePath = fieldPath as unknown as (string | number)[];\n\n const stream = new ReadableStream<any>({\n start: (controller) => {\n const handle = new StreamValuesHandle<T>(controller, simplePath);\n this.handles.add(handle);\n\n // Check current args immediately\n handle.update(this.args);\n },\n cancel: () => {\n // Find and dispose the corresponding handle\n for (const handle of this.handles) {\n if (handle instanceof StreamValuesHandle) {\n handle.dispose();\n this.handles.delete(handle);\n break;\n }\n }\n },\n });\n\n // For type compatibility, cast the stream to the required type\n return stream as any;\n }\n\n streamText<PathT extends TypePath<T>>(...fieldPath: PathT): any {\n // Use a type assertion to convert the complex TypePath to a simple array\n const simplePath = fieldPath as unknown as (string | number)[];\n\n const stream = new ReadableStream<any>({\n start: (controller) => {\n const handle = new StreamTextHandle<T>(controller, simplePath);\n this.handles.add(handle);\n\n // Check current args immediately\n handle.update(this.args);\n },\n cancel: () => {\n // Find and dispose the corresponding handle\n for (const handle of this.handles) {\n if (handle instanceof StreamTextHandle) {\n handle.dispose();\n this.handles.delete(handle);\n break;\n }\n }\n },\n });\n\n // For type compatibility, cast the stream to the required type\n return stream as any;\n }\n\n forEach<PathT extends TypePath<T>>(...fieldPath: PathT): any {\n // Use a type assertion to convert the complex TypePath to a simple array\n const simplePath = fieldPath as unknown as (string | number)[];\n\n const stream = new ReadableStream<any>({\n start: (controller) => {\n const handle = new ForEachHandle<T>(controller, simplePath);\n this.handles.add(handle);\n\n // Check current args immediately\n handle.update(this.args);\n },\n cancel: () => {\n // Find and dispose the corresponding handle\n for (const handle of this.handles) {\n if (handle instanceof ForEachHandle) {\n handle.dispose();\n this.handles.delete(handle);\n break;\n }\n }\n },\n });\n\n // For type compatibility, cast the stream to the required type\n return stream as any;\n }\n}\n\nexport class ToolCallResponseReaderImpl<TResult>\n implements ToolCallResponseReader<TResult>\n{\n constructor(private readonly promise: Promise<ToolResponse<TResult>>) {}\n\n public get() {\n return this.promise;\n }\n}\n\nexport class ToolCallReaderImpl<TArgs, TResult>\n implements ToolCallReader<TArgs, TResult>\n{\n public readonly args: ToolCallArgsReaderImpl<TArgs>;\n public readonly response: ToolCallResponseReaderImpl<TResult>;\n private readonly writable: WritableStream<string>;\n private readonly resolve: (value: ToolResponse<TResult>) => void;\n\n public argsText: string = \"\";\n\n constructor() {\n const stream = new TransformStream<string, string>();\n this.writable = stream.writable;\n this.args = new ToolCallArgsReaderImpl<TArgs>(stream.readable);\n\n const { promise, resolve } = promiseWithResolvers<ToolResponse<TResult>>();\n this.resolve = resolve;\n this.response = new ToolCallResponseReaderImpl<TResult>(promise);\n }\n\n async appendArgsTextDelta(text: string): Promise<void> {\n const writer = this.writable.getWriter();\n try {\n await writer.write(text);\n } catch (err) {\n console.warn(err);\n } finally {\n writer.releaseLock();\n }\n\n this.argsText += text;\n }\n\n setResponse(value: ToolResponse<TResult>): void {\n this.resolve(value);\n }\n\n result = {\n get: async () => {\n const response = await this.response.get();\n return response.result;\n },\n };\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../../src/core/tool/ToolCallReader.ts"],"sourcesContent":["import { promiseWithResolvers } from \"../../utils/promiseWithResolvers\";\nimport {\n parsePartialJsonObject,\n getPartialJsonObjectFieldState,\n} from \"../../utils/json/parse-partial-json-object\";\nimport {\n ToolCallArgsReader,\n ToolCallReader,\n ToolCallResponseReader,\n} from \"./tool-types\";\nimport { DeepPartial, TypeAtPath, TypePath } from \"./type-path-utils\";\nimport { ToolResponse } from \"./ToolResponse\";\nimport {\n asAsyncIterableStream,\n AsyncIterableStream,\n ReadonlyJSONObject,\n ReadonlyJSONValue,\n} from \"../../utils\";\n\n// TODO: remove dispose\n\nfunction getField<T>(obj: T, fieldPath: (string | number)[]): unknown {\n let current: unknown = obj;\n for (const key of fieldPath) {\n if (current === undefined || current === null) {\n return undefined;\n }\n current = current[key as keyof typeof current];\n }\n return current;\n}\n\ninterface Handle {\n update(args: unknown): void;\n dispose(): void;\n}\n\nclass GetHandle<T, TValue> implements Handle {\n private resolve: (value: TValue) => void;\n private reject: (reason: unknown) => void;\n private disposed = false;\n private fieldPath: (string | number)[];\n\n constructor(\n resolve: (value: TValue) => void,\n reject: (reason: unknown) => void,\n fieldPath: (string | number)[],\n ) {\n this.resolve = resolve;\n this.reject = reject;\n this.fieldPath = fieldPath;\n }\n\n update(args: unknown): void {\n if (this.disposed) return;\n\n try {\n // Check if the field is complete\n if (\n getPartialJsonObjectFieldState(\n args as Record<string, unknown>,\n this.fieldPath,\n ) === \"complete\"\n ) {\n const value = getField(args as T, this.fieldPath);\n if (value !== undefined) {\n this.resolve(value as TValue);\n this.dispose();\n }\n }\n } catch (e) {\n this.reject(e);\n this.dispose();\n }\n }\n\n dispose(): void {\n this.disposed = true;\n }\n}\n\nclass StreamValuesHandle<T> implements Handle {\n private controller: ReadableStreamDefaultController<unknown>;\n private disposed = false;\n private fieldPath: (string | number)[];\n\n constructor(\n controller: ReadableStreamDefaultController<unknown>,\n fieldPath: (string | number)[],\n ) {\n this.controller = controller;\n this.fieldPath = fieldPath;\n }\n\n update(args: unknown): void {\n if (this.disposed) return;\n\n try {\n const value = getField(args as T, this.fieldPath);\n\n if (value !== undefined) {\n this.controller.enqueue(value);\n }\n\n // Check if the field is complete, if so close the stream\n if (\n getPartialJsonObjectFieldState(\n args as Record<string, unknown>,\n this.fieldPath,\n ) === \"complete\"\n ) {\n this.controller.close();\n this.dispose();\n }\n } catch (e) {\n this.controller.error(e);\n this.dispose();\n }\n }\n\n dispose(): void {\n this.disposed = true;\n }\n}\n\nclass StreamTextHandle<T> implements Handle {\n private controller: ReadableStreamDefaultController<unknown>;\n private disposed = false;\n private fieldPath: (string | number)[];\n private lastValue: string | undefined = undefined;\n\n constructor(\n controller: ReadableStreamDefaultController<unknown>,\n fieldPath: (string | number)[],\n ) {\n this.controller = controller;\n this.fieldPath = fieldPath;\n }\n\n update(args: unknown): void {\n if (this.disposed) return;\n\n try {\n const value = getField(args as T, this.fieldPath);\n\n if (value !== undefined && typeof value === \"string\") {\n const delta = value.substring(this.lastValue?.length || 0);\n this.lastValue = value;\n this.controller.enqueue(delta);\n }\n\n // Check if the field is complete, if so close the stream\n if (\n getPartialJsonObjectFieldState(\n args as Record<string, unknown>,\n this.fieldPath,\n ) === \"complete\"\n ) {\n this.controller.close();\n this.dispose();\n }\n } catch (e) {\n this.controller.error(e);\n this.dispose();\n }\n }\n\n dispose(): void {\n this.disposed = true;\n }\n}\n\nclass ForEachHandle<T> implements Handle {\n private controller: ReadableStreamDefaultController<unknown>;\n private disposed = false;\n private fieldPath: (string | number)[];\n private processedIndexes = new Set<number>();\n\n constructor(\n controller: ReadableStreamDefaultController<unknown>,\n fieldPath: (string | number)[],\n ) {\n this.controller = controller;\n this.fieldPath = fieldPath;\n }\n\n update(args: unknown): void {\n if (this.disposed) return;\n\n try {\n const array = getField(args as T, this.fieldPath);\n\n if (!Array.isArray(array)) {\n return;\n }\n\n // Check each array element and emit completed ones that haven't been processed\n for (let i = 0; i < array.length; i++) {\n if (!this.processedIndexes.has(i)) {\n const elementPath = [...this.fieldPath, i];\n if (\n getPartialJsonObjectFieldState(\n args as Record<string, unknown>,\n elementPath,\n ) === \"complete\"\n ) {\n this.controller.enqueue(array[i]);\n this.processedIndexes.add(i);\n }\n }\n }\n\n // Check if the entire array is complete\n if (\n getPartialJsonObjectFieldState(\n args as Record<string, unknown>,\n this.fieldPath,\n ) === \"complete\"\n ) {\n this.controller.close();\n this.dispose();\n }\n } catch (e) {\n this.controller.error(e);\n this.dispose();\n }\n }\n\n dispose(): void {\n this.disposed = true;\n }\n}\n\n// Implementation of ToolCallReader that uses stream of partial JSON\nexport class ToolCallArgsReaderImpl<T extends ReadonlyJSONObject>\n implements ToolCallArgsReader<T>\n{\n private argTextDeltas: ReadableStream<string>;\n private handles: Set<Handle> = new Set();\n private args: unknown = parsePartialJsonObject(\"\");\n\n constructor(argTextDeltas: ReadableStream<string>) {\n this.argTextDeltas = argTextDeltas;\n this.processStream();\n }\n\n private async processStream(): Promise<void> {\n try {\n let accumulatedText = \"\";\n const reader = this.argTextDeltas.getReader();\n\n while (true) {\n const { value, done } = await reader.read();\n if (done) break;\n\n accumulatedText += value;\n const parsedArgs = parsePartialJsonObject(accumulatedText);\n\n if (parsedArgs !== undefined) {\n this.args = parsedArgs;\n // Notify all handles of the updated args\n for (const handle of this.handles) {\n handle.update(parsedArgs);\n }\n }\n }\n } catch (error) {\n console.error(\"Error processing argument stream:\", error);\n // Notify handles of the error\n for (const handle of this.handles) {\n handle.dispose();\n }\n }\n }\n\n get<PathT extends TypePath<T>>(\n ...fieldPath: PathT\n ): Promise<TypeAtPath<T, PathT>> {\n return new Promise<TypeAtPath<T, PathT>>((resolve, reject) => {\n const handle = new GetHandle<T, TypeAtPath<T, PathT>>(\n resolve,\n reject,\n fieldPath,\n );\n\n // Check if the field is already complete in current args\n if (\n this.args &&\n getPartialJsonObjectFieldState(\n this.args as Record<string, unknown>,\n fieldPath,\n ) === \"complete\"\n ) {\n const value = getField(this.args as T, fieldPath);\n if (value !== undefined) {\n resolve(value as TypeAtPath<T, PathT>);\n return;\n }\n }\n\n this.handles.add(handle);\n handle.update(this.args);\n });\n }\n\n streamValues<PathT extends TypePath<T>>(\n ...fieldPath: PathT\n ): AsyncIterableStream<DeepPartial<TypeAtPath<T, PathT>>> {\n // Use a type assertion to convert the complex TypePath to a simple array\n const simplePath = fieldPath as unknown as (string | number)[];\n\n const stream = new ReadableStream<DeepPartial<TypeAtPath<T, PathT>>>({\n start: (controller) => {\n const handle = new StreamValuesHandle<T>(controller, simplePath);\n this.handles.add(handle);\n\n // Check current args immediately\n handle.update(this.args);\n },\n cancel: () => {\n // Find and dispose the corresponding handle\n for (const handle of this.handles) {\n if (handle instanceof StreamValuesHandle) {\n handle.dispose();\n this.handles.delete(handle);\n break;\n }\n }\n },\n });\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return asAsyncIterableStream(stream) as any;\n }\n\n streamText<PathT extends TypePath<T>>(\n ...fieldPath: PathT\n ): TypeAtPath<T, PathT> extends string & infer U\n ? AsyncIterableStream<U>\n : never {\n // Use a type assertion to convert the complex TypePath to a simple array\n const simplePath = fieldPath as unknown as (string | number)[];\n\n const stream = new ReadableStream<unknown>({\n start: (controller) => {\n const handle = new StreamTextHandle<T>(controller, simplePath);\n this.handles.add(handle);\n\n // Check current args immediately\n handle.update(this.args);\n },\n cancel: () => {\n // Find and dispose the corresponding handle\n for (const handle of this.handles) {\n if (handle instanceof StreamTextHandle) {\n handle.dispose();\n this.handles.delete(handle);\n break;\n }\n }\n },\n });\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return asAsyncIterableStream(stream) as any;\n }\n\n forEach<PathT extends TypePath<T>>(\n ...fieldPath: PathT\n ): TypeAtPath<T, PathT> extends Array<infer U>\n ? AsyncIterableStream<U>\n : never {\n // Use a type assertion to convert the complex TypePath to a simple array\n const simplePath = fieldPath as unknown as (string | number)[];\n\n const stream = new ReadableStream<unknown>({\n start: (controller) => {\n const handle = new ForEachHandle<T>(controller, simplePath);\n this.handles.add(handle);\n\n // Check current args immediately\n handle.update(this.args);\n },\n cancel: () => {\n // Find and dispose the corresponding handle\n for (const handle of this.handles) {\n if (handle instanceof ForEachHandle) {\n handle.dispose();\n this.handles.delete(handle);\n break;\n }\n }\n },\n });\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return asAsyncIterableStream(stream) as any;\n }\n}\n\nexport class ToolCallResponseReaderImpl<TResult extends ReadonlyJSONValue>\n implements ToolCallResponseReader<TResult>\n{\n constructor(private readonly promise: Promise<ToolResponse<TResult>>) {}\n\n public get() {\n return this.promise;\n }\n}\n\nexport class ToolCallReaderImpl<\n TArgs extends ReadonlyJSONObject,\n TResult extends ReadonlyJSONValue,\n> implements ToolCallReader<TArgs, TResult>\n{\n public readonly args: ToolCallArgsReaderImpl<TArgs>;\n public readonly response: ToolCallResponseReaderImpl<TResult>;\n private readonly writable: WritableStream<string>;\n private readonly resolve: (value: ToolResponse<TResult>) => void;\n\n public argsText: string = \"\";\n\n constructor() {\n const stream = new TransformStream<string, string>();\n this.writable = stream.writable;\n this.args = new ToolCallArgsReaderImpl<TArgs>(stream.readable);\n\n const { promise, resolve } = promiseWithResolvers<ToolResponse<TResult>>();\n this.resolve = resolve;\n this.response = new ToolCallResponseReaderImpl<TResult>(promise);\n }\n\n async appendArgsTextDelta(text: string): Promise<void> {\n const writer = this.writable.getWriter();\n try {\n await writer.write(text);\n } catch (err) {\n console.warn(err);\n } finally {\n writer.releaseLock();\n }\n\n this.argsText += text;\n }\n\n setResponse(value: ToolResponse<TResult>): void {\n this.resolve(value);\n }\n\n result = {\n get: async () => {\n const response = await this.response.get();\n return response.result;\n },\n };\n}\n"],"mappings":"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","names":[]}
|
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
import { AssistantStreamChunk } from "../AssistantStreamChunk";
|
|
2
2
|
import { PipeableTransformStream } from "../utils/stream/PipeableTransformStream";
|
|
3
|
-
import { ReadonlyJSONValue } from "../../utils/json/json-value";
|
|
3
|
+
import { ReadonlyJSONObject, ReadonlyJSONValue } from "../../utils/json/json-value";
|
|
4
4
|
import { ToolResponse } from "./ToolResponse";
|
|
5
5
|
import { ToolCallReader } from "./tool-types";
|
|
6
6
|
type ToolCallback = (toolCall: {
|
|
7
7
|
toolCallId: string;
|
|
8
8
|
toolName: string;
|
|
9
|
-
args:
|
|
9
|
+
args: ReadonlyJSONObject;
|
|
10
10
|
}) => Promise<ToolResponse<ReadonlyJSONValue>> | ToolResponse<ReadonlyJSONValue> | undefined;
|
|
11
|
-
type ToolStreamCallback = <TArgs, TResult>(toolCall: {
|
|
11
|
+
type ToolStreamCallback = <TArgs extends ReadonlyJSONObject = ReadonlyJSONObject, TResult extends ReadonlyJSONValue = ReadonlyJSONValue>(toolCall: {
|
|
12
12
|
reader: ToolCallReader<TArgs, TResult>;
|
|
13
13
|
toolCallId: string;
|
|
14
14
|
toolName: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ToolExecutionStream.d.ts","sourceRoot":"","sources":["../../../src/core/tool/ToolExecutionStream.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAK/D,OAAO,EAAE,uBAAuB,EAAE,MAAM,yCAAyC,CAAC;AAClF,OAAO,
|
|
1
|
+
{"version":3,"file":"ToolExecutionStream.d.ts","sourceRoot":"","sources":["../../../src/core/tool/ToolExecutionStream.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAK/D,OAAO,EAAE,uBAAuB,EAAE,MAAM,yCAAyC,CAAC;AAClF,OAAO,EACL,kBAAkB,EAClB,iBAAiB,EAClB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAG9C,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAE9C,KAAK,YAAY,GAAG,CAAC,QAAQ,EAAE;IAC7B,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,kBAAkB,CAAC;CAC1B,KACG,OAAO,CAAC,YAAY,CAAC,iBAAiB,CAAC,CAAC,GACxC,YAAY,CAAC,iBAAiB,CAAC,GAC/B,SAAS,CAAC;AAEd,KAAK,kBAAkB,GAAG,CACxB,KAAK,SAAS,kBAAkB,GAAG,kBAAkB,EACrD,OAAO,SAAS,iBAAiB,GAAG,iBAAiB,EACrD,QAAQ,EAAE;IACV,MAAM,EAAE,cAAc,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IACvC,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;CAClB,KAAK,IAAI,CAAC;AAEX,KAAK,oBAAoB,GAAG;IAC1B,OAAO,EAAE,YAAY,CAAC;IACtB,UAAU,EAAE,kBAAkB,CAAC;CAChC,CAAC;AAEF,qBAAa,mBAAoB,SAAQ,uBAAuB,CAC9D,oBAAoB,EACpB,oBAAoB,CACrB;gBACa,OAAO,EAAE,oBAAoB;CAiK1C"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/core/tool/ToolExecutionStream.ts"],"sourcesContent":["import sjson from \"secure-json-parse\";\nimport { AssistantStreamChunk } from \"../AssistantStreamChunk\";\nimport {\n AssistantMetaStreamChunk,\n AssistantMetaTransformStream,\n} from \"../utils/stream/AssistantMetaTransformStream\";\nimport { PipeableTransformStream } from \"../utils/stream/PipeableTransformStream\";\nimport {
|
|
1
|
+
{"version":3,"sources":["../../../src/core/tool/ToolExecutionStream.ts"],"sourcesContent":["import sjson from \"secure-json-parse\";\nimport { AssistantStreamChunk } from \"../AssistantStreamChunk\";\nimport {\n AssistantMetaStreamChunk,\n AssistantMetaTransformStream,\n} from \"../utils/stream/AssistantMetaTransformStream\";\nimport { PipeableTransformStream } from \"../utils/stream/PipeableTransformStream\";\nimport {\n ReadonlyJSONObject,\n ReadonlyJSONValue,\n} from \"../../utils/json/json-value\";\nimport { ToolResponse } from \"./ToolResponse\";\nimport { withPromiseOrValue } from \"../utils/withPromiseOrValue\";\nimport { ToolCallReaderImpl } from \"./ToolCallReader\";\nimport { ToolCallReader } from \"./tool-types\";\n\ntype ToolCallback = (toolCall: {\n toolCallId: string;\n toolName: string;\n args: ReadonlyJSONObject;\n}) =>\n | Promise<ToolResponse<ReadonlyJSONValue>>\n | ToolResponse<ReadonlyJSONValue>\n | undefined;\n\ntype ToolStreamCallback = <\n TArgs extends ReadonlyJSONObject = ReadonlyJSONObject,\n TResult extends ReadonlyJSONValue = ReadonlyJSONValue,\n>(toolCall: {\n reader: ToolCallReader<TArgs, TResult>;\n toolCallId: string;\n toolName: string;\n}) => void;\n\ntype ToolExecutionOptions = {\n execute: ToolCallback;\n streamCall: ToolStreamCallback;\n};\n\nexport class ToolExecutionStream extends PipeableTransformStream<\n AssistantStreamChunk,\n AssistantStreamChunk\n> {\n constructor(options: ToolExecutionOptions) {\n const toolCallPromises = new Map<string, PromiseLike<void>>();\n const toolCallControllers = new Map<\n string,\n ToolCallReaderImpl<ReadonlyJSONObject, ReadonlyJSONValue>\n >();\n\n super((readable) => {\n const transform = new TransformStream<\n AssistantMetaStreamChunk,\n AssistantStreamChunk\n >({\n transform(chunk, controller) {\n // forward everything\n if (chunk.type !== \"part-finish\" || chunk.meta.type !== \"tool-call\") {\n controller.enqueue(chunk);\n }\n\n const type = chunk.type;\n\n switch (type) {\n case \"part-start\":\n if (chunk.part.type === \"tool-call\") {\n const reader = new ToolCallReaderImpl<\n ReadonlyJSONObject,\n ReadonlyJSONValue\n >();\n toolCallControllers.set(chunk.part.toolCallId, reader);\n\n options.streamCall({\n reader,\n toolCallId: chunk.part.toolCallId,\n toolName: chunk.part.toolName,\n });\n }\n break;\n case \"text-delta\": {\n if (chunk.meta.type === \"tool-call\") {\n const toolCallId = chunk.meta.toolCallId;\n\n const controller = toolCallControllers.get(toolCallId);\n if (!controller)\n throw new Error(\"No controller found for tool call\");\n controller.appendArgsTextDelta(chunk.textDelta);\n }\n break;\n }\n case \"result\": {\n if (chunk.meta.type !== \"tool-call\") break;\n\n const { toolCallId } = chunk.meta;\n const controller = toolCallControllers.get(toolCallId);\n if (!controller)\n throw new Error(\"No controller found for tool call\");\n controller.setResponse(\n new ToolResponse({\n result: chunk.result,\n artifact: chunk.artifact,\n isError: chunk.isError,\n }),\n );\n break;\n }\n case \"tool-call-args-text-finish\": {\n if (chunk.meta.type !== \"tool-call\") break;\n\n const { toolCallId, toolName } = chunk.meta;\n const streamController = toolCallControllers.get(toolCallId)!;\n if (!streamController)\n throw new Error(\"No controller found for tool call\");\n\n const promise = withPromiseOrValue(\n () => {\n if (!streamController.argsText) {\n console.log(\n \"Encountered tool call without args, this should never happen\",\n );\n throw new Error(\n \"Encountered tool call without args, this is unexpected.\",\n );\n }\n\n let args;\n try {\n args = sjson.parse(streamController.argsText);\n } catch (e) {\n throw new Error(\n `Function parameter parsing failed. ${JSON.stringify((e as Error).message)}`,\n );\n }\n\n return options.execute({\n toolCallId,\n toolName,\n args,\n });\n },\n (c) => {\n if (c === undefined) return;\n\n // TODO how to handle new ToolResult({ result: undefined })?\n const result = new ToolResponse({\n artifact: c.artifact,\n result: c.result,\n isError: c.isError,\n });\n streamController.setResponse(result);\n controller.enqueue({\n type: \"result\",\n path: chunk.path,\n ...result,\n });\n },\n (e) => {\n const result = new ToolResponse({\n result: String(e),\n isError: true,\n });\n\n streamController.setResponse(result);\n controller.enqueue({\n type: \"result\",\n path: chunk.path,\n ...result,\n });\n },\n );\n if (promise) {\n toolCallPromises.set(toolCallId, promise);\n }\n break;\n }\n\n case \"part-finish\": {\n if (chunk.meta.type !== \"tool-call\") break;\n\n const { toolCallId } = chunk.meta;\n const toolCallPromise = toolCallPromises.get(toolCallId);\n if (toolCallPromise) {\n toolCallPromise.then(() => {\n toolCallPromises.delete(toolCallId);\n toolCallControllers.delete(toolCallId);\n\n controller.enqueue(chunk);\n });\n } else {\n controller.enqueue(chunk);\n }\n }\n }\n },\n async flush() {\n await Promise.all(toolCallPromises.values());\n },\n });\n\n return readable\n .pipeThrough(new AssistantMetaTransformStream())\n .pipeThrough(transform);\n });\n }\n}\n"],"mappings":"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","names":["controller"]}
|
|
@@ -11,7 +11,7 @@ export declare class ToolResponse<TResult> {
|
|
|
11
11
|
readonly result: TResult;
|
|
12
12
|
readonly isError: boolean;
|
|
13
13
|
constructor(options: ToolResponseInit<TResult>);
|
|
14
|
-
static [Symbol.hasInstance](obj: unknown): obj is ToolResponse<
|
|
14
|
+
static [Symbol.hasInstance](obj: unknown): obj is ToolResponse<ReadonlyJSONValue>;
|
|
15
15
|
}
|
|
16
16
|
export {};
|
|
17
17
|
//# sourceMappingURL=ToolResponse.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ToolResponse.d.ts","sourceRoot":"","sources":["../../../src/core/tool/ToolResponse.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AAEhE,QAAA,MAAM,oBAAoB,eAAkC,CAAC;AAE7D,MAAM,MAAM,gBAAgB,CAAC,OAAO,IAAI;IACtC,MAAM,EAAE,OAAO,CAAC;IAChB,QAAQ,CAAC,EAAE,iBAAiB,GAAG,SAAS,CAAC;IACzC,OAAO,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;CAC/B,CAAC;AAEF,qBAAa,YAAY,CAAC,OAAO;IAC/B,IAAI,CAAC,oBAAoB,CAAC,YAEzB;IAED,QAAQ,CAAC,QAAQ,CAAC,EAAE,iBAAiB,GAAG,SAAS,CAAC;IAClD,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;gBAEd,OAAO,EAAE,gBAAgB,CAAC,OAAO,CAAC;IAM9C,MAAM,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,
|
|
1
|
+
{"version":3,"file":"ToolResponse.d.ts","sourceRoot":"","sources":["../../../src/core/tool/ToolResponse.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AAEhE,QAAA,MAAM,oBAAoB,eAAkC,CAAC;AAE7D,MAAM,MAAM,gBAAgB,CAAC,OAAO,IAAI;IACtC,MAAM,EAAE,OAAO,CAAC;IAChB,QAAQ,CAAC,EAAE,iBAAiB,GAAG,SAAS,CAAC;IACzC,OAAO,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;CAC/B,CAAC;AAEF,qBAAa,YAAY,CAAC,OAAO;IAC/B,IAAI,CAAC,oBAAoB,CAAC,YAEzB;IAED,QAAQ,CAAC,QAAQ,CAAC,EAAE,iBAAiB,GAAG,SAAS,CAAC;IAClD,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;gBAEd,OAAO,EAAE,gBAAgB,CAAC,OAAO,CAAC;IAM9C,MAAM,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,CACzB,GAAG,EAAE,OAAO,GACX,GAAG,IAAI,YAAY,CAAC,iBAAiB,CAAC;CAK1C"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/core/tool/ToolResponse.ts"],"sourcesContent":["import { ReadonlyJSONValue } from \"../../utils/json/json-value\";\n\nconst TOOL_RESPONSE_SYMBOL = Symbol.for(\"aui.tool-response\");\n\nexport type ToolResponseInit<TResult> = {\n result: TResult;\n artifact?: ReadonlyJSONValue | undefined;\n isError?: boolean | undefined;\n};\n\nexport class ToolResponse<TResult> {\n get [TOOL_RESPONSE_SYMBOL]() {\n return true;\n }\n\n readonly artifact?: ReadonlyJSONValue | undefined;\n readonly result: TResult;\n readonly isError: boolean;\n\n constructor(options: ToolResponseInit<TResult>) {\n this.artifact = options.artifact;\n this.result = options.result;\n this.isError = options.isError ?? false;\n }\n\n static [Symbol.hasInstance](obj: unknown): obj is ToolResponse<
|
|
1
|
+
{"version":3,"sources":["../../../src/core/tool/ToolResponse.ts"],"sourcesContent":["import { ReadonlyJSONValue } from \"../../utils/json/json-value\";\n\nconst TOOL_RESPONSE_SYMBOL = Symbol.for(\"aui.tool-response\");\n\nexport type ToolResponseInit<TResult> = {\n result: TResult;\n artifact?: ReadonlyJSONValue | undefined;\n isError?: boolean | undefined;\n};\n\nexport class ToolResponse<TResult> {\n get [TOOL_RESPONSE_SYMBOL]() {\n return true;\n }\n\n readonly artifact?: ReadonlyJSONValue | undefined;\n readonly result: TResult;\n readonly isError: boolean;\n\n constructor(options: ToolResponseInit<TResult>) {\n this.artifact = options.artifact;\n this.result = options.result;\n this.isError = options.isError ?? false;\n }\n\n static [Symbol.hasInstance](\n obj: unknown,\n ): obj is ToolResponse<ReadonlyJSONValue> {\n return (\n typeof obj === \"object\" && obj !== null && TOOL_RESPONSE_SYMBOL in obj\n );\n }\n}\n"],"mappings":";AAEA,IAAM,uBAAuB,OAAO,IAAI,mBAAmB;AAQpD,IAAM,eAAN,MAA4B;AAAA,EACjC,KAAK,oBAAoB,IAAI;AAC3B,WAAO;AAAA,EACT;AAAA,EAES;AAAA,EACA;AAAA,EACA;AAAA,EAET,YAAY,SAAoC;AAC9C,SAAK,WAAW,QAAQ;AACxB,SAAK,SAAS,QAAQ;AACtB,SAAK,UAAU,QAAQ,WAAW;AAAA,EACpC;AAAA,EAEA,QAAQ,OAAO,WAAW,EACxB,KACwC;AACxC,WACE,OAAO,QAAQ,YAAY,QAAQ,QAAQ,wBAAwB;AAAA,EAEvE;AACF;","names":[]}
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { JSONSchema7 } from "json-schema";
|
|
2
|
-
import { TypeAtPath, TypePath } from "./type-path-utils";
|
|
3
|
-
import { DeepPartial } from "ai";
|
|
2
|
+
import { DeepPartial, TypeAtPath, TypePath } from "./type-path-utils";
|
|
4
3
|
import { AsyncIterableStream } from "../../utils";
|
|
5
4
|
import type { StandardSchemaV1 } from "@standard-schema/spec";
|
|
6
5
|
import { ToolResponse } from "./ToolResponse";
|
|
@@ -12,7 +11,7 @@ import { ToolResponse } from "./ToolResponse";
|
|
|
12
11
|
*
|
|
13
12
|
* @template TArgs The type of arguments being read.
|
|
14
13
|
*/
|
|
15
|
-
export interface ToolCallArgsReader<TArgs
|
|
14
|
+
export interface ToolCallArgsReader<TArgs extends Record<string, unknown>> {
|
|
16
15
|
/**
|
|
17
16
|
* Returns a promise that will resolve to the value at the given path,
|
|
18
17
|
* as soon as that path is generated by the LLM.
|
|
@@ -45,7 +44,7 @@ export interface ToolCallArgsReader<TArgs> {
|
|
|
45
44
|
export interface ToolCallResponseReader<TResult> {
|
|
46
45
|
get: () => Promise<ToolResponse<TResult>>;
|
|
47
46
|
}
|
|
48
|
-
export interface ToolCallReader<TArgs, TResult> {
|
|
47
|
+
export interface ToolCallReader<TArgs extends Record<string, unknown> = Record<string, unknown>, TResult = unknown> {
|
|
49
48
|
args: ToolCallArgsReader<TArgs>;
|
|
50
49
|
response: ToolCallResponseReader<TResult>;
|
|
51
50
|
/**
|
|
@@ -60,7 +59,7 @@ type ToolExecutionContext = {
|
|
|
60
59
|
abortSignal: AbortSignal;
|
|
61
60
|
};
|
|
62
61
|
export type ToolExecuteFunction<TArgs, TResult> = (args: TArgs, context: ToolExecutionContext) => TResult | Promise<TResult>;
|
|
63
|
-
export type ToolStreamCallFunction<TArgs, TResult> = (reader: ToolCallReader<TArgs, TResult>, context: ToolExecutionContext) => void;
|
|
62
|
+
export type ToolStreamCallFunction<TArgs extends Record<string, unknown> = Record<string, unknown>, TResult = unknown> = (reader: ToolCallReader<TArgs, TResult>, context: ToolExecutionContext) => void;
|
|
64
63
|
type OnSchemaValidationErrorFunction<TResult> = ToolExecuteFunction<unknown, TResult>;
|
|
65
64
|
type ToolBase<TArgs extends Record<string, unknown> = Record<string, unknown>, TResult = unknown> = {
|
|
66
65
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tool-types.d.ts","sourceRoot":"","sources":["../../../src/core/tool/tool-types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"tool-types.d.ts","sourceRoot":"","sources":["../../../src/core/tool/tool-types.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { Tool } from "./tool-types";
|
|
2
2
|
import { ToolExecutionStream } from "./ToolExecutionStream";
|
|
3
3
|
import { AssistantMessage } from "../utils/types";
|
|
4
|
-
export declare function unstable_runPendingTools(message: AssistantMessage, tools: Record<string, Tool
|
|
5
|
-
export declare function toolResultStream(tools: Record<string, Tool
|
|
4
|
+
export declare function unstable_runPendingTools(message: AssistantMessage, tools: Record<string, Tool> | undefined, abortSignal: AbortSignal): Promise<AssistantMessage>;
|
|
5
|
+
export declare function toolResultStream(tools: Record<string, Tool> | undefined, abortSignal: AbortSignal): ToolExecutionStream;
|
|
6
6
|
//# sourceMappingURL=toolResultStream.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"toolResultStream.d.ts","sourceRoot":"","sources":["../../../src/core/tool/toolResultStream.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAuC,MAAM,cAAc,CAAC;AAGzE,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"toolResultStream.d.ts","sourceRoot":"","sources":["../../../src/core/tool/toolResultStream.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAuC,MAAM,cAAc,CAAC;AAGzE,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AA4ElD,wBAAsB,wBAAwB,CAC5C,OAAO,EAAE,gBAAgB,EACzB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,GAAG,SAAS,EACvC,WAAW,EAAE,WAAW,6BA6BzB;AAED,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,GAAG,SAAS,EACvC,WAAW,EAAE,WAAW,uBAOzB"}
|
|
@@ -24,7 +24,8 @@ function getToolResponse(tools, abortSignal, toolCall) {
|
|
|
24
24
|
toolCallId: toolCall.toolCallId,
|
|
25
25
|
abortSignal
|
|
26
26
|
});
|
|
27
|
-
if (result instanceof ToolResponse)
|
|
27
|
+
if (result instanceof ToolResponse)
|
|
28
|
+
return result;
|
|
28
29
|
return new ToolResponse({
|
|
29
30
|
result: result === void 0 ? "<no result>" : result
|
|
30
31
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/core/tool/toolResultStream.ts"],"sourcesContent":["import { Tool, ToolCallReader, ToolExecuteFunction } from \"./tool-types\";\nimport { StandardSchemaV1 } from \"@standard-schema/spec\";\nimport { ToolResponse } from \"./ToolResponse\";\nimport { ToolExecutionStream } from \"./ToolExecutionStream\";\nimport { AssistantMessage } from \"../utils/types\";\n\nconst isStandardSchemaV1 = (\n schema: unknown,\n): schema is StandardSchemaV1<unknown> => {\n return (\n typeof schema === \"object\" &&\n schema !== null &&\n \"~standard\" in schema &&\n (schema as StandardSchemaV1<unknown>)[\"~standard\"].version === 1\n );\n};\n\nfunction getToolResponse(\n tools: Record<string, Tool
|
|
1
|
+
{"version":3,"sources":["../../../src/core/tool/toolResultStream.ts"],"sourcesContent":["import { Tool, ToolCallReader, ToolExecuteFunction } from \"./tool-types\";\nimport { StandardSchemaV1 } from \"@standard-schema/spec\";\nimport { ToolResponse } from \"./ToolResponse\";\nimport { ToolExecutionStream } from \"./ToolExecutionStream\";\nimport { AssistantMessage } from \"../utils/types\";\nimport { ReadonlyJSONObject, ReadonlyJSONValue } from \"../../utils\";\n\nconst isStandardSchemaV1 = (\n schema: unknown,\n): schema is StandardSchemaV1<unknown> => {\n return (\n typeof schema === \"object\" &&\n schema !== null &&\n \"~standard\" in schema &&\n (schema as StandardSchemaV1<unknown>)[\"~standard\"].version === 1\n );\n};\n\nfunction getToolResponse(\n tools: Record<string, Tool> | undefined,\n abortSignal: AbortSignal,\n toolCall: {\n toolCallId: string;\n toolName: string;\n args: ReadonlyJSONObject;\n },\n) {\n const tool = tools?.[toolCall.toolName];\n if (!tool || !tool.execute) return undefined;\n\n const getResult = async (\n toolExecute: ToolExecuteFunction<ReadonlyJSONObject, unknown>,\n ): Promise<ToolResponse<ReadonlyJSONValue>> => {\n let executeFn = toolExecute;\n\n if (isStandardSchemaV1(tool.parameters)) {\n let result = tool.parameters[\"~standard\"].validate(toolCall.args);\n if (result instanceof Promise) result = await result;\n\n if (result.issues) {\n executeFn =\n tool.experimental_onSchemaValidationError ??\n (() => {\n throw new Error(\n `Function parameter validation failed. ${JSON.stringify(result.issues)}`,\n );\n });\n }\n }\n\n const result = (await executeFn(toolCall.args, {\n toolCallId: toolCall.toolCallId,\n abortSignal,\n })) as unknown as ReadonlyJSONValue;\n if (result instanceof ToolResponse)\n return result as ToolResponse<ReadonlyJSONValue>;\n return new ToolResponse({\n result: result === undefined ? \"<no result>\" : result,\n });\n };\n\n return getResult(tool.execute);\n}\n\nfunction getToolStreamResponse(\n tools: Record<string, Tool> | undefined,\n abortSignal: AbortSignal,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n reader: ToolCallReader<any, ReadonlyJSONValue>,\n context: {\n toolCallId: string;\n toolName: string;\n },\n) {\n tools?.[context.toolName]?.streamCall?.(reader, {\n toolCallId: context.toolCallId,\n abortSignal,\n });\n}\n\nexport async function unstable_runPendingTools(\n message: AssistantMessage,\n tools: Record<string, Tool> | undefined,\n abortSignal: AbortSignal,\n) {\n // TODO parallel tool calling\n for (const part of message.parts) {\n if (part.type === \"tool-call\") {\n const promiseOrUndefined = getToolResponse(tools, abortSignal, part);\n if (promiseOrUndefined) {\n const result = await promiseOrUndefined;\n const updatedParts = message.parts.map((p) => {\n if (p.type === \"tool-call\" && p.toolCallId === part.toolCallId) {\n return {\n ...p,\n state: \"result\" as const,\n artifact: result.artifact,\n result: result.result as ReadonlyJSONValue,\n isError: result.isError,\n };\n }\n return p;\n });\n message = {\n ...message,\n parts: updatedParts,\n content: updatedParts,\n };\n }\n }\n }\n return message;\n}\n\nexport function toolResultStream(\n tools: Record<string, Tool> | undefined,\n abortSignal: AbortSignal,\n) {\n return new ToolExecutionStream({\n execute: (toolCall) => getToolResponse(tools, abortSignal, toolCall),\n streamCall: ({ reader, ...context }) =>\n getToolStreamResponse(tools, abortSignal, reader, context),\n });\n}\n"],"mappings":";AAEA,SAAS,oBAAoB;AAC7B,SAAS,2BAA2B;AAIpC,IAAM,qBAAqB,CACzB,WACwC;AACxC,SACE,OAAO,WAAW,YAClB,WAAW,QACX,eAAe,UACd,OAAqC,WAAW,EAAE,YAAY;AAEnE;AAEA,SAAS,gBACP,OACA,aACA,UAKA;AACA,QAAM,OAAO,QAAQ,SAAS,QAAQ;AACtC,MAAI,CAAC,QAAQ,CAAC,KAAK,QAAS,QAAO;AAEnC,QAAM,YAAY,OAChB,gBAC6C;AAC7C,QAAI,YAAY;AAEhB,QAAI,mBAAmB,KAAK,UAAU,GAAG;AACvC,UAAIA,UAAS,KAAK,WAAW,WAAW,EAAE,SAAS,SAAS,IAAI;AAChE,UAAIA,mBAAkB,QAAS,CAAAA,UAAS,MAAMA;AAE9C,UAAIA,QAAO,QAAQ;AACjB,oBACE,KAAK,yCACJ,MAAM;AACL,gBAAM,IAAI;AAAA,YACR,yCAAyC,KAAK,UAAUA,QAAO,MAAM,CAAC;AAAA,UACxE;AAAA,QACF;AAAA,MACJ;AAAA,IACF;AAEA,UAAM,SAAU,MAAM,UAAU,SAAS,MAAM;AAAA,MAC7C,YAAY,SAAS;AAAA,MACrB;AAAA,IACF,CAAC;AACD,QAAI,kBAAkB;AACpB,aAAO;AACT,WAAO,IAAI,aAAa;AAAA,MACtB,QAAQ,WAAW,SAAY,gBAAgB;AAAA,IACjD,CAAC;AAAA,EACH;AAEA,SAAO,UAAU,KAAK,OAAO;AAC/B;AAEA,SAAS,sBACP,OACA,aAEA,QACA,SAIA;AACA,UAAQ,QAAQ,QAAQ,GAAG,aAAa,QAAQ;AAAA,IAC9C,YAAY,QAAQ;AAAA,IACpB;AAAA,EACF,CAAC;AACH;AAEA,eAAsB,yBACpB,SACA,OACA,aACA;AAEA,aAAW,QAAQ,QAAQ,OAAO;AAChC,QAAI,KAAK,SAAS,aAAa;AAC7B,YAAM,qBAAqB,gBAAgB,OAAO,aAAa,IAAI;AACnE,UAAI,oBAAoB;AACtB,cAAM,SAAS,MAAM;AACrB,cAAM,eAAe,QAAQ,MAAM,IAAI,CAAC,MAAM;AAC5C,cAAI,EAAE,SAAS,eAAe,EAAE,eAAe,KAAK,YAAY;AAC9D,mBAAO;AAAA,cACL,GAAG;AAAA,cACH,OAAO;AAAA,cACP,UAAU,OAAO;AAAA,cACjB,QAAQ,OAAO;AAAA,cACf,SAAS,OAAO;AAAA,YAClB;AAAA,UACF;AACA,iBAAO;AAAA,QACT,CAAC;AACD,kBAAU;AAAA,UACR,GAAG;AAAA,UACH,OAAO;AAAA,UACP,SAAS;AAAA,QACX;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AAEO,SAAS,iBACd,OACA,aACA;AACA,SAAO,IAAI,oBAAoB;AAAA,IAC7B,SAAS,CAAC,aAAa,gBAAgB,OAAO,aAAa,QAAQ;AAAA,IACnE,YAAY,CAAC,EAAE,QAAQ,GAAG,QAAQ,MAChC,sBAAsB,OAAO,aAAa,QAAQ,OAAO;AAAA,EAC7D,CAAC;AACH;","names":["result"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"type-path-utils.d.ts","sourceRoot":"","sources":["../../../src/core/tool/type-path-utils.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"type-path-utils.d.ts","sourceRoot":"","sources":["../../../src/core/tool/type-path-utils.ts"],"names":[],"mappings":"AAEA,KAAK,QAAQ,CAAC,CAAC,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,SAAS,MAAM,EAAE,GAAG,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;AACzE,KAAK,UAAU,CAAC,CAAC,SAAS,SAAS,GAAG,EAAE,IAAI,OAAO,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,EAAE,CAAC,CAAC;AAC1E,KAAK,SAAS,CAAC,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,MAAM,GAAG,MAAM,CAAC,CAAC;AAEhD,MAAM,MAAM,QAAQ,CAAC,CAAC,IAClB,EAAE,GACF,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,GACZ,GAAG,EAAE,GACL,CAAC,SAAS,MAAM,GACd,CAAC,SAAS,SAAS,GAAG,EAAE,GACtB,MAAM,SAAS,CAAC,CAAC,QAAQ,CAAC,GAExB;KACG,CAAC,IAAI,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;CACvD,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,GAEhB;IAAC,MAAM;IAAE,GAAG,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;CAAC,GAElC;KAAG,CAAC,IAAI,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;CAAE,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,GAE/D;CAAE,CAAC,CAAC;AAEd,MAAM,MAAM,UAAU,CAAC,CAAC,EAAE,CAAC,SAAS,SAAS,GAAG,EAAE,IAAI,CAAC,SAAS;IAC9D,MAAM,IAAI;IACV,GAAG,MAAM,IAAI;CACd,GACG,IAAI,SAAS,MAAM,CAAC,GAClB,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,GACzB,KAAK,GACP,CAAC,CAAC;AAEN,MAAM,MAAM,WAAW,CAAC,CAAC,IAAI,CAAC,SAAS,SAAS,GAAG,EAAE,GACjD,SAAS,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,GACjC,CAAC,SAAS;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;CAAE,GAC9B;IAAE,QAAQ,EAAE,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;CAAE,GAC/C,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,KAAK,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AACxF,OAAO,EAAE,KAAK,kBAAkB,EAAE,KAAK,iBAAiB,EAAE,MAAM,QAAQ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/utils/index.ts"],"sourcesContent":["export { asAsyncIterableStream, type AsyncIterableStream } from \"./AsyncIterableStream\";\nexport { type ReadonlyJSONObject, type ReadonlyJSONValue } from \"./json\";\n"],"mappings":";AAAA,SAAS,6BAAuD;","names":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/utils/json/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,kBAAkB,EAAE,KAAK,iBAAiB,EAAE,MAAM,cAAc,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "assistant-stream",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.6",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"exports": {
|
|
@@ -30,13 +30,13 @@
|
|
|
30
30
|
"sideEffects": false,
|
|
31
31
|
"devDependencies": {
|
|
32
32
|
"@standard-schema/spec": "^1.0.0",
|
|
33
|
-
"ai": "^4.3.
|
|
34
|
-
"@types/node": "^22.
|
|
33
|
+
"ai": "^4.3.15",
|
|
34
|
+
"@types/node": "^22.15.18",
|
|
35
35
|
"eslint": "^9",
|
|
36
|
-
"eslint-config-next": "15.3.
|
|
37
|
-
"tsup": "8.
|
|
38
|
-
"tsx": "^4.19.
|
|
39
|
-
"vitest": "^3.1.
|
|
36
|
+
"eslint-config-next": "15.3.2",
|
|
37
|
+
"tsup": "8.5.0",
|
|
38
|
+
"tsx": "^4.19.4",
|
|
39
|
+
"vitest": "^3.1.3",
|
|
40
40
|
"@assistant-ui/x-buildutils": "0.0.1"
|
|
41
41
|
},
|
|
42
42
|
"publishConfig": {
|
|
@@ -8,18 +8,24 @@ import {
|
|
|
8
8
|
ToolCallReader,
|
|
9
9
|
ToolCallResponseReader,
|
|
10
10
|
} from "./tool-types";
|
|
11
|
-
import { TypeAtPath, TypePath } from "./type-path-utils";
|
|
11
|
+
import { DeepPartial, TypeAtPath, TypePath } from "./type-path-utils";
|
|
12
12
|
import { ToolResponse } from "./ToolResponse";
|
|
13
|
+
import {
|
|
14
|
+
asAsyncIterableStream,
|
|
15
|
+
AsyncIterableStream,
|
|
16
|
+
ReadonlyJSONObject,
|
|
17
|
+
ReadonlyJSONValue,
|
|
18
|
+
} from "../../utils";
|
|
13
19
|
|
|
14
20
|
// TODO: remove dispose
|
|
15
21
|
|
|
16
|
-
function getField<T>(obj: T, fieldPath: (string | number)[]):
|
|
17
|
-
let current:
|
|
22
|
+
function getField<T>(obj: T, fieldPath: (string | number)[]): unknown {
|
|
23
|
+
let current: unknown = obj;
|
|
18
24
|
for (const key of fieldPath) {
|
|
19
25
|
if (current === undefined || current === null) {
|
|
20
26
|
return undefined;
|
|
21
27
|
}
|
|
22
|
-
current = current[key as
|
|
28
|
+
current = current[key as keyof typeof current];
|
|
23
29
|
}
|
|
24
30
|
return current;
|
|
25
31
|
}
|
|
@@ -29,14 +35,14 @@ interface Handle {
|
|
|
29
35
|
dispose(): void;
|
|
30
36
|
}
|
|
31
37
|
|
|
32
|
-
class GetHandle<T> implements Handle {
|
|
33
|
-
private resolve: (value:
|
|
38
|
+
class GetHandle<T, TValue> implements Handle {
|
|
39
|
+
private resolve: (value: TValue) => void;
|
|
34
40
|
private reject: (reason: unknown) => void;
|
|
35
41
|
private disposed = false;
|
|
36
42
|
private fieldPath: (string | number)[];
|
|
37
43
|
|
|
38
44
|
constructor(
|
|
39
|
-
resolve: (value:
|
|
45
|
+
resolve: (value: TValue) => void,
|
|
40
46
|
reject: (reason: unknown) => void,
|
|
41
47
|
fieldPath: (string | number)[],
|
|
42
48
|
) {
|
|
@@ -58,7 +64,7 @@ class GetHandle<T> implements Handle {
|
|
|
58
64
|
) {
|
|
59
65
|
const value = getField(args as T, this.fieldPath);
|
|
60
66
|
if (value !== undefined) {
|
|
61
|
-
this.resolve(value);
|
|
67
|
+
this.resolve(value as TValue);
|
|
62
68
|
this.dispose();
|
|
63
69
|
}
|
|
64
70
|
}
|
|
@@ -74,12 +80,12 @@ class GetHandle<T> implements Handle {
|
|
|
74
80
|
}
|
|
75
81
|
|
|
76
82
|
class StreamValuesHandle<T> implements Handle {
|
|
77
|
-
private controller: ReadableStreamDefaultController<
|
|
83
|
+
private controller: ReadableStreamDefaultController<unknown>;
|
|
78
84
|
private disposed = false;
|
|
79
85
|
private fieldPath: (string | number)[];
|
|
80
86
|
|
|
81
87
|
constructor(
|
|
82
|
-
controller: ReadableStreamDefaultController<
|
|
88
|
+
controller: ReadableStreamDefaultController<unknown>,
|
|
83
89
|
fieldPath: (string | number)[],
|
|
84
90
|
) {
|
|
85
91
|
this.controller = controller;
|
|
@@ -118,13 +124,13 @@ class StreamValuesHandle<T> implements Handle {
|
|
|
118
124
|
}
|
|
119
125
|
|
|
120
126
|
class StreamTextHandle<T> implements Handle {
|
|
121
|
-
private controller: ReadableStreamDefaultController<
|
|
127
|
+
private controller: ReadableStreamDefaultController<unknown>;
|
|
122
128
|
private disposed = false;
|
|
123
129
|
private fieldPath: (string | number)[];
|
|
124
|
-
private lastValue:
|
|
130
|
+
private lastValue: string | undefined = undefined;
|
|
125
131
|
|
|
126
132
|
constructor(
|
|
127
|
-
controller: ReadableStreamDefaultController<
|
|
133
|
+
controller: ReadableStreamDefaultController<unknown>,
|
|
128
134
|
fieldPath: (string | number)[],
|
|
129
135
|
) {
|
|
130
136
|
this.controller = controller;
|
|
@@ -165,13 +171,13 @@ class StreamTextHandle<T> implements Handle {
|
|
|
165
171
|
}
|
|
166
172
|
|
|
167
173
|
class ForEachHandle<T> implements Handle {
|
|
168
|
-
private controller: ReadableStreamDefaultController<
|
|
174
|
+
private controller: ReadableStreamDefaultController<unknown>;
|
|
169
175
|
private disposed = false;
|
|
170
176
|
private fieldPath: (string | number)[];
|
|
171
177
|
private processedIndexes = new Set<number>();
|
|
172
178
|
|
|
173
179
|
constructor(
|
|
174
|
-
controller: ReadableStreamDefaultController<
|
|
180
|
+
controller: ReadableStreamDefaultController<unknown>,
|
|
175
181
|
fieldPath: (string | number)[],
|
|
176
182
|
) {
|
|
177
183
|
this.controller = controller;
|
|
@@ -182,7 +188,7 @@ class ForEachHandle<T> implements Handle {
|
|
|
182
188
|
if (this.disposed) return;
|
|
183
189
|
|
|
184
190
|
try {
|
|
185
|
-
const array = getField(args as T, this.fieldPath)
|
|
191
|
+
const array = getField(args as T, this.fieldPath);
|
|
186
192
|
|
|
187
193
|
if (!Array.isArray(array)) {
|
|
188
194
|
return;
|
|
@@ -226,10 +232,12 @@ class ForEachHandle<T> implements Handle {
|
|
|
226
232
|
}
|
|
227
233
|
|
|
228
234
|
// Implementation of ToolCallReader that uses stream of partial JSON
|
|
229
|
-
export class ToolCallArgsReaderImpl<T
|
|
235
|
+
export class ToolCallArgsReaderImpl<T extends ReadonlyJSONObject>
|
|
236
|
+
implements ToolCallArgsReader<T>
|
|
237
|
+
{
|
|
230
238
|
private argTextDeltas: ReadableStream<string>;
|
|
231
239
|
private handles: Set<Handle> = new Set();
|
|
232
|
-
private args:
|
|
240
|
+
private args: unknown = parsePartialJsonObject("");
|
|
233
241
|
|
|
234
242
|
constructor(argTextDeltas: ReadableStream<string>) {
|
|
235
243
|
this.argTextDeltas = argTextDeltas;
|
|
@@ -268,8 +276,12 @@ export class ToolCallArgsReaderImpl<T> implements ToolCallArgsReader<T> {
|
|
|
268
276
|
get<PathT extends TypePath<T>>(
|
|
269
277
|
...fieldPath: PathT
|
|
270
278
|
): Promise<TypeAtPath<T, PathT>> {
|
|
271
|
-
return new Promise<
|
|
272
|
-
const handle = new GetHandle<T
|
|
279
|
+
return new Promise<TypeAtPath<T, PathT>>((resolve, reject) => {
|
|
280
|
+
const handle = new GetHandle<T, TypeAtPath<T, PathT>>(
|
|
281
|
+
resolve,
|
|
282
|
+
reject,
|
|
283
|
+
fieldPath,
|
|
284
|
+
);
|
|
273
285
|
|
|
274
286
|
// Check if the field is already complete in current args
|
|
275
287
|
if (
|
|
@@ -281,7 +293,7 @@ export class ToolCallArgsReaderImpl<T> implements ToolCallArgsReader<T> {
|
|
|
281
293
|
) {
|
|
282
294
|
const value = getField(this.args as T, fieldPath);
|
|
283
295
|
if (value !== undefined) {
|
|
284
|
-
resolve(value);
|
|
296
|
+
resolve(value as TypeAtPath<T, PathT>);
|
|
285
297
|
return;
|
|
286
298
|
}
|
|
287
299
|
}
|
|
@@ -291,11 +303,13 @@ export class ToolCallArgsReaderImpl<T> implements ToolCallArgsReader<T> {
|
|
|
291
303
|
});
|
|
292
304
|
}
|
|
293
305
|
|
|
294
|
-
streamValues<PathT extends TypePath<T>>(
|
|
306
|
+
streamValues<PathT extends TypePath<T>>(
|
|
307
|
+
...fieldPath: PathT
|
|
308
|
+
): AsyncIterableStream<DeepPartial<TypeAtPath<T, PathT>>> {
|
|
295
309
|
// Use a type assertion to convert the complex TypePath to a simple array
|
|
296
310
|
const simplePath = fieldPath as unknown as (string | number)[];
|
|
297
311
|
|
|
298
|
-
const stream = new ReadableStream<
|
|
312
|
+
const stream = new ReadableStream<DeepPartial<TypeAtPath<T, PathT>>>({
|
|
299
313
|
start: (controller) => {
|
|
300
314
|
const handle = new StreamValuesHandle<T>(controller, simplePath);
|
|
301
315
|
this.handles.add(handle);
|
|
@@ -315,15 +329,19 @@ export class ToolCallArgsReaderImpl<T> implements ToolCallArgsReader<T> {
|
|
|
315
329
|
},
|
|
316
330
|
});
|
|
317
331
|
|
|
318
|
-
//
|
|
319
|
-
return stream as any;
|
|
332
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
333
|
+
return asAsyncIterableStream(stream) as any;
|
|
320
334
|
}
|
|
321
335
|
|
|
322
|
-
streamText<PathT extends TypePath<T>>(
|
|
336
|
+
streamText<PathT extends TypePath<T>>(
|
|
337
|
+
...fieldPath: PathT
|
|
338
|
+
): TypeAtPath<T, PathT> extends string & infer U
|
|
339
|
+
? AsyncIterableStream<U>
|
|
340
|
+
: never {
|
|
323
341
|
// Use a type assertion to convert the complex TypePath to a simple array
|
|
324
342
|
const simplePath = fieldPath as unknown as (string | number)[];
|
|
325
343
|
|
|
326
|
-
const stream = new ReadableStream<
|
|
344
|
+
const stream = new ReadableStream<unknown>({
|
|
327
345
|
start: (controller) => {
|
|
328
346
|
const handle = new StreamTextHandle<T>(controller, simplePath);
|
|
329
347
|
this.handles.add(handle);
|
|
@@ -343,15 +361,19 @@ export class ToolCallArgsReaderImpl<T> implements ToolCallArgsReader<T> {
|
|
|
343
361
|
},
|
|
344
362
|
});
|
|
345
363
|
|
|
346
|
-
//
|
|
347
|
-
return stream as any;
|
|
364
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
365
|
+
return asAsyncIterableStream(stream) as any;
|
|
348
366
|
}
|
|
349
367
|
|
|
350
|
-
forEach<PathT extends TypePath<T>>(
|
|
368
|
+
forEach<PathT extends TypePath<T>>(
|
|
369
|
+
...fieldPath: PathT
|
|
370
|
+
): TypeAtPath<T, PathT> extends Array<infer U>
|
|
371
|
+
? AsyncIterableStream<U>
|
|
372
|
+
: never {
|
|
351
373
|
// Use a type assertion to convert the complex TypePath to a simple array
|
|
352
374
|
const simplePath = fieldPath as unknown as (string | number)[];
|
|
353
375
|
|
|
354
|
-
const stream = new ReadableStream<
|
|
376
|
+
const stream = new ReadableStream<unknown>({
|
|
355
377
|
start: (controller) => {
|
|
356
378
|
const handle = new ForEachHandle<T>(controller, simplePath);
|
|
357
379
|
this.handles.add(handle);
|
|
@@ -371,12 +393,12 @@ export class ToolCallArgsReaderImpl<T> implements ToolCallArgsReader<T> {
|
|
|
371
393
|
},
|
|
372
394
|
});
|
|
373
395
|
|
|
374
|
-
//
|
|
375
|
-
return stream as any;
|
|
396
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
397
|
+
return asAsyncIterableStream(stream) as any;
|
|
376
398
|
}
|
|
377
399
|
}
|
|
378
400
|
|
|
379
|
-
export class ToolCallResponseReaderImpl<TResult>
|
|
401
|
+
export class ToolCallResponseReaderImpl<TResult extends ReadonlyJSONValue>
|
|
380
402
|
implements ToolCallResponseReader<TResult>
|
|
381
403
|
{
|
|
382
404
|
constructor(private readonly promise: Promise<ToolResponse<TResult>>) {}
|
|
@@ -386,8 +408,10 @@ export class ToolCallResponseReaderImpl<TResult>
|
|
|
386
408
|
}
|
|
387
409
|
}
|
|
388
410
|
|
|
389
|
-
export class ToolCallReaderImpl<
|
|
390
|
-
|
|
411
|
+
export class ToolCallReaderImpl<
|
|
412
|
+
TArgs extends ReadonlyJSONObject,
|
|
413
|
+
TResult extends ReadonlyJSONValue,
|
|
414
|
+
> implements ToolCallReader<TArgs, TResult>
|
|
391
415
|
{
|
|
392
416
|
public readonly args: ToolCallArgsReaderImpl<TArgs>;
|
|
393
417
|
public readonly response: ToolCallResponseReaderImpl<TResult>;
|
|
@@ -5,7 +5,10 @@ import {
|
|
|
5
5
|
AssistantMetaTransformStream,
|
|
6
6
|
} from "../utils/stream/AssistantMetaTransformStream";
|
|
7
7
|
import { PipeableTransformStream } from "../utils/stream/PipeableTransformStream";
|
|
8
|
-
import {
|
|
8
|
+
import {
|
|
9
|
+
ReadonlyJSONObject,
|
|
10
|
+
ReadonlyJSONValue,
|
|
11
|
+
} from "../../utils/json/json-value";
|
|
9
12
|
import { ToolResponse } from "./ToolResponse";
|
|
10
13
|
import { withPromiseOrValue } from "../utils/withPromiseOrValue";
|
|
11
14
|
import { ToolCallReaderImpl } from "./ToolCallReader";
|
|
@@ -14,13 +17,16 @@ import { ToolCallReader } from "./tool-types";
|
|
|
14
17
|
type ToolCallback = (toolCall: {
|
|
15
18
|
toolCallId: string;
|
|
16
19
|
toolName: string;
|
|
17
|
-
args:
|
|
20
|
+
args: ReadonlyJSONObject;
|
|
18
21
|
}) =>
|
|
19
22
|
| Promise<ToolResponse<ReadonlyJSONValue>>
|
|
20
23
|
| ToolResponse<ReadonlyJSONValue>
|
|
21
24
|
| undefined;
|
|
22
25
|
|
|
23
|
-
type ToolStreamCallback = <
|
|
26
|
+
type ToolStreamCallback = <
|
|
27
|
+
TArgs extends ReadonlyJSONObject = ReadonlyJSONObject,
|
|
28
|
+
TResult extends ReadonlyJSONValue = ReadonlyJSONValue,
|
|
29
|
+
>(toolCall: {
|
|
24
30
|
reader: ToolCallReader<TArgs, TResult>;
|
|
25
31
|
toolCallId: string;
|
|
26
32
|
toolName: string;
|
|
@@ -39,7 +45,7 @@ export class ToolExecutionStream extends PipeableTransformStream<
|
|
|
39
45
|
const toolCallPromises = new Map<string, PromiseLike<void>>();
|
|
40
46
|
const toolCallControllers = new Map<
|
|
41
47
|
string,
|
|
42
|
-
ToolCallReaderImpl<
|
|
48
|
+
ToolCallReaderImpl<ReadonlyJSONObject, ReadonlyJSONValue>
|
|
43
49
|
>();
|
|
44
50
|
|
|
45
51
|
super((readable) => {
|
|
@@ -58,7 +64,10 @@ export class ToolExecutionStream extends PipeableTransformStream<
|
|
|
58
64
|
switch (type) {
|
|
59
65
|
case "part-start":
|
|
60
66
|
if (chunk.part.type === "tool-call") {
|
|
61
|
-
const reader = new ToolCallReaderImpl<
|
|
67
|
+
const reader = new ToolCallReaderImpl<
|
|
68
|
+
ReadonlyJSONObject,
|
|
69
|
+
ReadonlyJSONValue
|
|
70
|
+
>();
|
|
62
71
|
toolCallControllers.set(chunk.part.toolCallId, reader);
|
|
63
72
|
|
|
64
73
|
options.streamCall({
|
|
@@ -23,7 +23,9 @@ export class ToolResponse<TResult> {
|
|
|
23
23
|
this.isError = options.isError ?? false;
|
|
24
24
|
}
|
|
25
25
|
|
|
26
|
-
static [Symbol.hasInstance](
|
|
26
|
+
static [Symbol.hasInstance](
|
|
27
|
+
obj: unknown,
|
|
28
|
+
): obj is ToolResponse<ReadonlyJSONValue> {
|
|
27
29
|
return (
|
|
28
30
|
typeof obj === "object" && obj !== null && TOOL_RESPONSE_SYMBOL in obj
|
|
29
31
|
);
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { JSONSchema7 } from "json-schema";
|
|
2
|
-
import { TypeAtPath, TypePath } from "./type-path-utils";
|
|
3
|
-
import { DeepPartial } from "ai";
|
|
2
|
+
import { DeepPartial, TypeAtPath, TypePath } from "./type-path-utils";
|
|
4
3
|
import { AsyncIterableStream } from "../../utils";
|
|
5
4
|
import type { StandardSchemaV1 } from "@standard-schema/spec";
|
|
6
5
|
import { ToolResponse } from "./ToolResponse";
|
|
@@ -13,7 +12,7 @@ import { ToolResponse } from "./ToolResponse";
|
|
|
13
12
|
*
|
|
14
13
|
* @template TArgs The type of arguments being read.
|
|
15
14
|
*/
|
|
16
|
-
export interface ToolCallArgsReader<TArgs
|
|
15
|
+
export interface ToolCallArgsReader<TArgs extends Record<string, unknown>> {
|
|
17
16
|
/**
|
|
18
17
|
* Returns a promise that will resolve to the value at the given path,
|
|
19
18
|
* as soon as that path is generated by the LLM.
|
|
@@ -63,7 +62,10 @@ export interface ToolCallResponseReader<TResult> {
|
|
|
63
62
|
get: () => Promise<ToolResponse<TResult>>;
|
|
64
63
|
}
|
|
65
64
|
|
|
66
|
-
export interface ToolCallReader<
|
|
65
|
+
export interface ToolCallReader<
|
|
66
|
+
TArgs extends Record<string, unknown> = Record<string, unknown>,
|
|
67
|
+
TResult = unknown,
|
|
68
|
+
> {
|
|
67
69
|
args: ToolCallArgsReader<TArgs>;
|
|
68
70
|
response: ToolCallResponseReader<TResult>;
|
|
69
71
|
|
|
@@ -85,7 +87,10 @@ export type ToolExecuteFunction<TArgs, TResult> = (
|
|
|
85
87
|
context: ToolExecutionContext,
|
|
86
88
|
) => TResult | Promise<TResult>;
|
|
87
89
|
|
|
88
|
-
export type ToolStreamCallFunction<
|
|
90
|
+
export type ToolStreamCallFunction<
|
|
91
|
+
TArgs extends Record<string, unknown> = Record<string, unknown>,
|
|
92
|
+
TResult = unknown,
|
|
93
|
+
> = (
|
|
89
94
|
reader: ToolCallReader<TArgs, TResult>,
|
|
90
95
|
context: ToolExecutionContext,
|
|
91
96
|
) => void;
|
|
@@ -3,6 +3,7 @@ import { StandardSchemaV1 } from "@standard-schema/spec";
|
|
|
3
3
|
import { ToolResponse } from "./ToolResponse";
|
|
4
4
|
import { ToolExecutionStream } from "./ToolExecutionStream";
|
|
5
5
|
import { AssistantMessage } from "../utils/types";
|
|
6
|
+
import { ReadonlyJSONObject, ReadonlyJSONValue } from "../../utils";
|
|
6
7
|
|
|
7
8
|
const isStandardSchemaV1 = (
|
|
8
9
|
schema: unknown,
|
|
@@ -16,18 +17,20 @@ const isStandardSchemaV1 = (
|
|
|
16
17
|
};
|
|
17
18
|
|
|
18
19
|
function getToolResponse(
|
|
19
|
-
tools: Record<string, Tool
|
|
20
|
+
tools: Record<string, Tool> | undefined,
|
|
20
21
|
abortSignal: AbortSignal,
|
|
21
22
|
toolCall: {
|
|
22
23
|
toolCallId: string;
|
|
23
24
|
toolName: string;
|
|
24
|
-
args:
|
|
25
|
+
args: ReadonlyJSONObject;
|
|
25
26
|
},
|
|
26
27
|
) {
|
|
27
28
|
const tool = tools?.[toolCall.toolName];
|
|
28
29
|
if (!tool || !tool.execute) return undefined;
|
|
29
30
|
|
|
30
|
-
const getResult = async (
|
|
31
|
+
const getResult = async (
|
|
32
|
+
toolExecute: ToolExecuteFunction<ReadonlyJSONObject, unknown>,
|
|
33
|
+
): Promise<ToolResponse<ReadonlyJSONValue>> => {
|
|
31
34
|
let executeFn = toolExecute;
|
|
32
35
|
|
|
33
36
|
if (isStandardSchemaV1(tool.parameters)) {
|
|
@@ -45,11 +48,12 @@ function getToolResponse(
|
|
|
45
48
|
}
|
|
46
49
|
}
|
|
47
50
|
|
|
48
|
-
const result = await executeFn(toolCall.args, {
|
|
51
|
+
const result = (await executeFn(toolCall.args, {
|
|
49
52
|
toolCallId: toolCall.toolCallId,
|
|
50
53
|
abortSignal,
|
|
51
|
-
});
|
|
52
|
-
if (result instanceof ToolResponse)
|
|
54
|
+
})) as unknown as ReadonlyJSONValue;
|
|
55
|
+
if (result instanceof ToolResponse)
|
|
56
|
+
return result as ToolResponse<ReadonlyJSONValue>;
|
|
53
57
|
return new ToolResponse({
|
|
54
58
|
result: result === undefined ? "<no result>" : result,
|
|
55
59
|
});
|
|
@@ -58,10 +62,11 @@ function getToolResponse(
|
|
|
58
62
|
return getResult(tool.execute);
|
|
59
63
|
}
|
|
60
64
|
|
|
61
|
-
function getToolStreamResponse
|
|
62
|
-
tools: Record<string, Tool
|
|
65
|
+
function getToolStreamResponse(
|
|
66
|
+
tools: Record<string, Tool> | undefined,
|
|
63
67
|
abortSignal: AbortSignal,
|
|
64
|
-
|
|
68
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
69
|
+
reader: ToolCallReader<any, ReadonlyJSONValue>,
|
|
65
70
|
context: {
|
|
66
71
|
toolCallId: string;
|
|
67
72
|
toolName: string;
|
|
@@ -75,7 +80,7 @@ function getToolStreamResponse<TArgs, TResult>(
|
|
|
75
80
|
|
|
76
81
|
export async function unstable_runPendingTools(
|
|
77
82
|
message: AssistantMessage,
|
|
78
|
-
tools: Record<string, Tool
|
|
83
|
+
tools: Record<string, Tool> | undefined,
|
|
79
84
|
abortSignal: AbortSignal,
|
|
80
85
|
) {
|
|
81
86
|
// TODO parallel tool calling
|
|
@@ -90,7 +95,7 @@ export async function unstable_runPendingTools(
|
|
|
90
95
|
...p,
|
|
91
96
|
state: "result" as const,
|
|
92
97
|
artifact: result.artifact,
|
|
93
|
-
result: result.result,
|
|
98
|
+
result: result.result as ReadonlyJSONValue,
|
|
94
99
|
isError: result.isError,
|
|
95
100
|
};
|
|
96
101
|
}
|
|
@@ -108,7 +113,7 @@ export async function unstable_runPendingTools(
|
|
|
108
113
|
}
|
|
109
114
|
|
|
110
115
|
export function toolResultStream(
|
|
111
|
-
tools: Record<string, Tool
|
|
116
|
+
tools: Record<string, Tool> | undefined,
|
|
112
117
|
abortSignal: AbortSignal,
|
|
113
118
|
) {
|
|
114
119
|
return new ToolExecutionStream({
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { type ReadonlyJSONObject, type ReadonlyJSONValue } from "./json-value";
|