substarte 120240617.1.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,152 @@
1
+ import { createParser } from "substrate/EventSource";
2
+ import { NodeMessage, SSEMessage } from "substrate/Streaming";
3
+ import { SubstrateError } from "substrate/Error";
4
+ import { AnyNode, NodeOutput } from "substrate/Nodes";
5
+
6
+ /**
7
+ * `StreamingResponse` is an async iterator that is used to interact with a stream of Server-Sent Events
8
+ */
9
+ export class StreamingResponse {
10
+ apiResponse: Response;
11
+ iterator: any;
12
+
13
+ constructor(response: Response, iterator: any) {
14
+ this.apiResponse = response;
15
+ this.iterator = iterator;
16
+ }
17
+
18
+ [Symbol.asyncIterator]() {
19
+ return this.iterator;
20
+ }
21
+
22
+ tee(n: number = 2) {
23
+ return tee(n, this.iterator).map(
24
+ (iterator) => new StreamingResponse(this.apiResponse, iterator),
25
+ );
26
+ }
27
+
28
+ static async fromReponse(response: Response) {
29
+ if (!response.body) {
30
+ throw new SubstrateError("Response body must be present");
31
+ }
32
+
33
+ const decoder = new TextDecoder("utf-8");
34
+ const parser = createParser();
35
+
36
+ async function* iterator(): AsyncGenerator<SSEMessage> {
37
+ for await (const chunk of readableStreamAsyncIterable(response.body)) {
38
+ for (const message of parser.getMessages(
39
+ decoder.decode(chunk as any),
40
+ )) {
41
+ if (message.data) {
42
+ try {
43
+ const sseMessage = JSON.parse(message.data);
44
+ yield sseMessage as SSEMessage;
45
+ } catch (_err) {
46
+ throw new SubstrateError(
47
+ `Bad Server-Sent Event message: ${message}`,
48
+ );
49
+ }
50
+ }
51
+ }
52
+ }
53
+ }
54
+
55
+ return new StreamingResponse(response, iterator());
56
+ }
57
+ }
58
+
59
+ /**
60
+ * `SubstrateStreamingResponse`
61
+ */
62
+ export class SubstrateStreamingResponse extends StreamingResponse {
63
+ public apiRequest: Request;
64
+
65
+ constructor(request: Request, response: Response, iterator: any) {
66
+ super(response, iterator);
67
+ this.apiRequest = request;
68
+ }
69
+
70
+ async *get<T extends AnyNode>(
71
+ node: T,
72
+ ): AsyncGenerator<NodeMessage<NodeOutput<T>>> {
73
+ for await (let message of this) {
74
+ if (message?.node_id === node.id) {
75
+ yield message as NodeMessage<NodeOutput<T>>;
76
+ }
77
+ }
78
+ }
79
+
80
+ override tee(n: number = 2) {
81
+ return tee(n, this.iterator).map(
82
+ (iterator) =>
83
+ new SubstrateStreamingResponse(
84
+ this.apiRequest,
85
+ this.apiResponse,
86
+ iterator,
87
+ ),
88
+ );
89
+ }
90
+
91
+ static async fromRequestReponse(request: Request, response: Response) {
92
+ const streamingResponse = await StreamingResponse.fromReponse(response);
93
+ return new SubstrateStreamingResponse(
94
+ request,
95
+ response,
96
+ streamingResponse.iterator,
97
+ );
98
+ }
99
+ }
100
+
101
+ function readableStreamAsyncIterable(stream: any) {
102
+ // When stream is already an iterator we return it. This is the case when using a
103
+ // `response.body` from node-fetch.
104
+ if (stream[Symbol.asyncIterator]) return stream;
105
+
106
+ // Otherwise we use getReader and produce an async iterable from the ReadableStream.
107
+ // This is the variant we would see when using an implementation of fetch closer to
108
+ // the web.
109
+ const reader = stream.getReader();
110
+ return {
111
+ async next() {
112
+ try {
113
+ const result = await reader.read();
114
+ if (result?.done) reader.releaseLock(); // release lock when stream becomes closed
115
+ return result;
116
+ } catch (e) {
117
+ reader.releaseLock(); // release lock when stream becomes errored
118
+ throw e;
119
+ }
120
+ },
121
+ async return() {
122
+ const cancelPromise = reader.cancel();
123
+ reader.releaseLock();
124
+ await cancelPromise;
125
+ return { done: true, value: undefined };
126
+ },
127
+ [Symbol.asyncIterator]() {
128
+ return this;
129
+ },
130
+ };
131
+ }
132
+
133
+ function tee(n: number = 2, iterator: any) {
134
+ const queues: any[] = [];
135
+ for (let i = 0; i < n; i++) {
136
+ queues.push([]);
137
+ }
138
+
139
+ const teeIterator = (queue: SSEMessage[]) => {
140
+ return {
141
+ next: () => {
142
+ if (queue.length === 0) {
143
+ const result = iterator.next();
144
+ for (let q of queues) q.push(result);
145
+ }
146
+ return queue.shift();
147
+ },
148
+ };
149
+ };
150
+
151
+ return queues.map((q) => teeIterator(q));
152
+ }
@@ -0,0 +1,20 @@
1
+ export function randomString(length: number): string {
2
+ const alphabet: string =
3
+ "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_-";
4
+ let randomString: string = "";
5
+ for (let i = 0; i < length; i++) {
6
+ const randomIndex: number = Math.floor(Math.random() * alphabet.length);
7
+ randomString += alphabet[randomIndex];
8
+ }
9
+ return randomString;
10
+ }
11
+
12
+ // Generates incrementing ids, for better legibility
13
+ export function idGenerator(prefix: string, start: number = 1): any {
14
+ let n = start;
15
+ return () => {
16
+ const id = `${prefix}${n.toString()}_${randomString(8)}`;
17
+ n = n + 1;
18
+ return id;
19
+ };
20
+ }
package/src/index.ts ADDED
@@ -0,0 +1,58 @@
1
+ /**
2
+ * 𐃏 Substrate TypeScript SDK
3
+ * @generated file
4
+ * 20240617.20240806
5
+ */
6
+
7
+ export { SubstrateError } from "substrate/Error";
8
+ export {
9
+ Experimental,
10
+ Box,
11
+ If,
12
+ ComputeText,
13
+ MultiComputeText,
14
+ BatchComputeText,
15
+ BatchComputeJSON,
16
+ ComputeJSON,
17
+ MultiComputeJSON,
18
+ Mistral7BInstruct,
19
+ Mixtral8x7BInstruct,
20
+ Llama3Instruct8B,
21
+ Llama3Instruct70B,
22
+ Firellava13B,
23
+ GenerateImage,
24
+ MultiGenerateImage,
25
+ InpaintImage,
26
+ MultiInpaintImage,
27
+ StableDiffusionXLLightning,
28
+ StableDiffusionXLInpaint,
29
+ StableDiffusionXLControlNet,
30
+ StableVideoDiffusion,
31
+ InterpolateFrames,
32
+ TranscribeSpeech,
33
+ GenerateSpeech,
34
+ RemoveBackground,
35
+ EraseImage,
36
+ UpscaleImage,
37
+ SegmentUnderPoint,
38
+ SegmentAnything,
39
+ SplitDocument,
40
+ EmbedText,
41
+ MultiEmbedText,
42
+ EmbedImage,
43
+ MultiEmbedImage,
44
+ JinaV2,
45
+ CLIP,
46
+ FindOrCreateVectorStore,
47
+ ListVectorStores,
48
+ DeleteVectorStore,
49
+ QueryVectorStore,
50
+ FetchVectors,
51
+ UpdateVectors,
52
+ DeleteVectors,
53
+ } from "substrate/Nodes";
54
+
55
+ export { sb } from "substrate/sb";
56
+ export { Substrate };
57
+ import { Substrate } from "substrate/Substrate";
58
+ export default Substrate;
@@ -0,0 +1,3 @@
1
+ // entrypoint for nodejs build
2
+ import "substrate/nodejs/polyfill";
3
+ export * from "..";
@@ -0,0 +1,16 @@
1
+ /**
2
+ * While we're generally aiming to support ES2022 and Node 18+ we're also including
3
+ * polyfill code for now for some of the Standard Web APIs that we use in this SDK.
4
+ */
5
+ import fetch, { Headers, Request, Response } from "node-fetch";
6
+
7
+ if (!globalThis.fetch) {
8
+ // @ts-ignore
9
+ globalThis.fetch = fetch;
10
+ // @ts-ignore
11
+ globalThis.Headers = Headers;
12
+ // @ts-ignore
13
+ globalThis.Request = Request;
14
+ // @ts-ignore
15
+ globalThis.Response = Response;
16
+ }