@upstash/qstash 2.6.0 → 2.7.0-canary

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.
Files changed (6) hide show
  1. package/README.md +7 -9
  2. package/index.d.mts +168 -68
  3. package/index.d.ts +168 -68
  4. package/index.js +184 -144
  5. package/index.mjs +179 -139
  6. package/package.json +1 -1
package/index.js CHANGED
@@ -13,10 +13,18 @@ var DLQ = class {
13
13
  * List messages in the dlq
14
14
  */
15
15
  async listMessages(options) {
16
+ const filterPayload = {
17
+ ..._optionalChain([options, 'optionalAccess', _ => _.filter]),
18
+ topicName: _optionalChain([options, 'optionalAccess', _2 => _2.filter, 'optionalAccess', _3 => _3.urlGroup])
19
+ };
16
20
  const messagesPayload = await this.http.request({
17
21
  method: "GET",
18
22
  path: ["v2", "dlq"],
19
- query: { cursor: _optionalChain([options, 'optionalAccess', _ => _.cursor]) }
23
+ query: {
24
+ cursor: _optionalChain([options, 'optionalAccess', _4 => _4.cursor]),
25
+ count: _optionalChain([options, 'optionalAccess', _5 => _5.count]),
26
+ ...filterPayload
27
+ }
20
28
  });
21
29
  return {
22
30
  messages: messagesPayload.messages.map((message) => {
@@ -84,8 +92,8 @@ var HttpClient = (_class = class {
84
92
  attempts: 1,
85
93
  backoff: () => 0
86
94
  } : {
87
- attempts: _optionalChain([config, 'access', _2 => _2.retry, 'optionalAccess', _3 => _3.retries]) ? config.retry.retries + 1 : 5,
88
- backoff: _nullishCoalesce(_optionalChain([config, 'access', _4 => _4.retry, 'optionalAccess', _5 => _5.backoff]), () => ( ((retryCount) => Math.exp(retryCount) * 50)))
95
+ attempts: _optionalChain([config, 'access', _6 => _6.retry, 'optionalAccess', _7 => _7.retries]) ? config.retry.retries + 1 : 5,
96
+ backoff: _nullishCoalesce(_optionalChain([config, 'access', _8 => _8.retry, 'optionalAccess', _9 => _9.backoff]), () => ( ((retryCount) => Math.exp(retryCount) * 50)))
89
97
  };
90
98
  }
91
99
  async request(request) {
@@ -193,6 +201,130 @@ var HttpClient = (_class = class {
193
201
  }
194
202
  }, _class);
195
203
 
204
+ // src/client/llm/chat.ts
205
+ var Chat = (_class2 = class _Chat {
206
+
207
+ constructor(http) {;_class2.prototype.__init3.call(this);_class2.prototype.__init4.call(this);_class2.prototype.__init5.call(this);
208
+ this.http = http;
209
+ }
210
+ static toChatRequest(request) {
211
+ const messages = [];
212
+ messages.push(
213
+ { role: "system", content: request.system },
214
+ { role: "user", content: request.user }
215
+ );
216
+ const chatRequest = { ...request, messages };
217
+ return chatRequest;
218
+ }
219
+ /**
220
+ * Calls the Upstash completions api given a ChatRequest.
221
+ *
222
+ * Returns a ChatCompletion or a stream of ChatCompletionChunks
223
+ * if stream is enabled.
224
+ *
225
+ * @param request ChatRequest with messages
226
+ * @returns Chat completion or stream
227
+ */
228
+ __init3() {this.create = async (request) => {
229
+ if (request.provider.owner === "openai" || request.provider.owner === "custom")
230
+ return this.createThirdParty(request);
231
+ const body = JSON.stringify(request);
232
+ if ("stream" in request && request.stream) {
233
+ return this.http.requestStream({
234
+ path: ["llm", "v1", "chat", "completions"],
235
+ method: "POST",
236
+ headers: {
237
+ "Content-Type": "application/json",
238
+ Connection: "keep-alive",
239
+ Accept: "text/event-stream",
240
+ "Cache-Control": "no-cache"
241
+ },
242
+ body
243
+ });
244
+ }
245
+ return this.http.request({
246
+ path: ["llm", "v1", "chat", "completions"],
247
+ method: "POST",
248
+ headers: { "Content-Type": "application/json" },
249
+ body
250
+ });
251
+ }}
252
+ /**
253
+ * Calls the Upstash completions api given a ChatRequest.
254
+ *
255
+ * Returns a ChatCompletion or a stream of ChatCompletionChunks
256
+ * if stream is enabled.
257
+ *
258
+ * @param request ChatRequest with messages
259
+ * @returns Chat completion or stream
260
+ */
261
+ __init4() {this.createThirdParty = async (request) => {
262
+ const { baseUrl, token, owner } = request.provider;
263
+ if (owner === "upstash")
264
+ throw new Error("Upstash is not 3rd party provider!");
265
+ delete request.provider;
266
+ delete request.system;
267
+ const body = JSON.stringify(request);
268
+ if ("stream" in request && request.stream) {
269
+ return this.http.requestStream({
270
+ path: ["v1", "chat", "completions"],
271
+ method: "POST",
272
+ headers: {
273
+ "Content-Type": "application/json",
274
+ Connection: "keep-alive",
275
+ Accept: "text/event-stream",
276
+ "Cache-Control": "no-cache",
277
+ Authorization: `Bearer ${token}`
278
+ },
279
+ body,
280
+ baseUrl
281
+ });
282
+ }
283
+ return this.http.request({
284
+ path: ["v1", "chat", "completions"],
285
+ method: "POST",
286
+ headers: {
287
+ "Content-Type": "application/json",
288
+ Authorization: `Bearer ${token}`
289
+ },
290
+ body,
291
+ baseUrl
292
+ });
293
+ }}
294
+ /**
295
+ * Calls the Upstash completions api given a PromptRequest.
296
+ *
297
+ * Returns a ChatCompletion or a stream of ChatCompletionChunks
298
+ * if stream is enabled.
299
+ *
300
+ * @param request PromptRequest with system and user messages.
301
+ * Note that system parameter shouldn't be passed in the case of
302
+ * mistralai/Mistral-7B-Instruct-v0.2 model.
303
+ * @returns Chat completion or stream
304
+ */
305
+ __init5() {this.prompt = async (request) => {
306
+ const chatRequest = _Chat.toChatRequest(request);
307
+ return this.create(chatRequest);
308
+ }}
309
+ }, _class2);
310
+
311
+ // src/client/llm/utils.ts
312
+ function appendLLMOptionsIfNeeded(request, headers) {
313
+ if (_optionalChain([request, 'access', _10 => _10.api, 'optionalAccess', _11 => _11.provider, 'optionalAccess', _12 => _12.owner]) === "upstash") {
314
+ request.api = { name: "llm" };
315
+ return;
316
+ }
317
+ if (request.api && "provider" in request.api) {
318
+ const provider = request.api.provider;
319
+ if (!_optionalChain([provider, 'optionalAccess', _13 => _13.baseUrl]))
320
+ throw new Error("baseUrl cannot be empty or undefined!");
321
+ if (!provider.token)
322
+ throw new Error("token cannot be empty or undefined!");
323
+ request.url = `${provider.baseUrl}/v1/chat/completion`;
324
+ headers.set("Authorization", `Bearer ${provider.token}`);
325
+ }
326
+ }
327
+
196
328
  // src/client/messages.ts
197
329
  var Messages = class {
198
330
 
@@ -223,30 +355,23 @@ var Messages = class {
223
355
  parseResponseAsJson: false
224
356
  });
225
357
  }
226
- };
227
-
228
- // src/client/llm/constants.ts
229
- var PROVIDER_MAP = {
230
- openai: "https://api.openai.com",
231
- togetherai: "https://api.together.xyz"
232
- };
233
-
234
- // src/client/llm/utils.ts
235
- function appendLLMOptions(request, headers) {
236
- if ("llmProvider" in request) {
237
- const llmProvider = request.llmProvider;
238
- if (llmProvider === "openai") {
239
- const token = _nullishCoalesce(process.env.OPENAI_API_KEY, () => ( request.llmToken));
240
- request.url = _nullishCoalesce(request.url, () => ( `${PROVIDER_MAP[llmProvider]}/v1/chat/completion`));
241
- headers.set("Authorization", `Bearer ${token}`);
242
- }
243
- if (llmProvider === "togetherai") {
244
- const token = _nullishCoalesce(process.env.TOGETHER_API_KEY, () => ( request.llmToken));
245
- request.url = _nullishCoalesce(request.url, () => ( `${PROVIDER_MAP[llmProvider]}/v1/chat/completion`));
246
- headers.set("Authorization", `Bearer ${token}`);
247
- }
358
+ async deleteMany(messageIds) {
359
+ const result = await this.http.request({
360
+ method: "DELETE",
361
+ path: ["v2", "messages"],
362
+ headers: { "Content-Type": "application/json" },
363
+ body: JSON.stringify({ messageIds })
364
+ });
365
+ return result.cancelled;
248
366
  }
249
- }
367
+ async deleteAll() {
368
+ const result = await this.http.request({
369
+ method: "DELETE",
370
+ path: ["v2", "messages"]
371
+ });
372
+ return result.cancelled;
373
+ }
374
+ };
250
375
 
251
376
  // src/client/utils.ts
252
377
  var isIgnoredHeader = (header) => {
@@ -294,7 +419,7 @@ function processHeaders(request) {
294
419
  return headers;
295
420
  }
296
421
  function getRequestPath(request) {
297
- return _nullishCoalesce(_nullishCoalesce(request.url, () => ( request.urlGroup)), () => ( `api/${request.api}`));
422
+ return _nullishCoalesce(_nullishCoalesce(request.url, () => ( request.urlGroup)), () => ( `api/${_optionalChain([request, 'access', _14 => _14.api, 'optionalAccess', _15 => _15.name])}`));
298
423
  }
299
424
 
300
425
  // src/client/queue.ts
@@ -384,7 +509,7 @@ var Queue = class {
384
509
  async enqueueJSON(request) {
385
510
  const headers = prefixHeaders(new Headers(request.headers));
386
511
  headers.set("Content-Type", "application/json");
387
- appendLLMOptions(request, headers);
512
+ appendLLMOptionsIfNeeded(request, headers);
388
513
  const response = await this.enqueue({
389
514
  ...request,
390
515
  body: JSON.stringify(request.body),
@@ -576,116 +701,6 @@ var UrlGroups = class {
576
701
  }
577
702
  };
578
703
 
579
- // src/client/llm/chat.ts
580
- var Chat = (_class2 = class _Chat {
581
-
582
- constructor(http) {;_class2.prototype.__init3.call(this);_class2.prototype.__init4.call(this);_class2.prototype.__init5.call(this);
583
- this.http = http;
584
- }
585
- static toChatRequest(request) {
586
- const messages = [];
587
- messages.push(
588
- { role: "system", content: request.system },
589
- { role: "user", content: request.user }
590
- );
591
- const chatRequest = { ...request, messages };
592
- return chatRequest;
593
- }
594
- /**
595
- * Calls the Upstash completions api given a ChatRequest.
596
- *
597
- * Returns a ChatCompletion or a stream of ChatCompletionChunks
598
- * if stream is enabled.
599
- *
600
- * @param request ChatRequest with messages
601
- * @returns Chat completion or stream
602
- */
603
- __init3() {this.create = async (request) => {
604
- if (request.provider === "openai" || request.provider === "togetherai")
605
- return this.createThirdParty(request);
606
- const body = JSON.stringify(request);
607
- if ("stream" in request && request.stream) {
608
- return this.http.requestStream({
609
- path: ["llm", "v1", "chat", "completions"],
610
- method: "POST",
611
- headers: {
612
- "Content-Type": "application/json",
613
- Connection: "keep-alive",
614
- Accept: "text/event-stream",
615
- "Cache-Control": "no-cache"
616
- },
617
- body
618
- });
619
- }
620
- return this.http.request({
621
- path: ["llm", "v1", "chat", "completions"],
622
- method: "POST",
623
- headers: { "Content-Type": "application/json" },
624
- body
625
- });
626
- }}
627
- /**
628
- * Calls the Upstash completions api given a ChatRequest.
629
- *
630
- * Returns a ChatCompletion or a stream of ChatCompletionChunks
631
- * if stream is enabled.
632
- *
633
- * @param request ChatRequest with messages
634
- * @returns Chat completion or stream
635
- */
636
- __init4() {this.createThirdParty = async (request) => {
637
- if (request.provider === "openai" || request.provider === "togetherai") {
638
- const baseUrl = PROVIDER_MAP[request.provider];
639
- const llmToken = request.llmToken;
640
- delete request.llmToken;
641
- delete request.system;
642
- delete request.provider;
643
- const body = JSON.stringify(request);
644
- if ("stream" in request && request.stream) {
645
- return this.http.requestStream({
646
- path: ["v1", "chat", "completions"],
647
- method: "POST",
648
- headers: {
649
- "Content-Type": "application/json",
650
- Connection: "keep-alive",
651
- Accept: "text/event-stream",
652
- "Cache-Control": "no-cache",
653
- Authorization: `Bearer ${llmToken}`
654
- },
655
- body,
656
- baseUrl
657
- });
658
- }
659
- return this.http.request({
660
- path: ["v1", "chat", "completions"],
661
- method: "POST",
662
- headers: {
663
- "Content-Type": "application/json",
664
- Authorization: `Bearer ${llmToken}`
665
- },
666
- body,
667
- baseUrl
668
- });
669
- }
670
- throw new Error("Could not find any third party provider");
671
- }}
672
- /**
673
- * Calls the Upstash completions api given a PromptRequest.
674
- *
675
- * Returns a ChatCompletion or a stream of ChatCompletionChunks
676
- * if stream is enabled.
677
- *
678
- * @param request PromptRequest with system and user messages.
679
- * Note that system parameter shouldn't be passed in the case of
680
- * mistralai/Mistral-7B-Instruct-v0.2 model.
681
- * @returns Chat completion or stream
682
- */
683
- __init5() {this.prompt = async (request) => {
684
- const chatRequest = _Chat.toChatRequest(request);
685
- return this.create(chatRequest);
686
- }}
687
- }, _class2);
688
-
689
704
  // src/client/client.ts
690
705
  var Client = class {
691
706
 
@@ -734,7 +749,7 @@ var Client = class {
734
749
  * Create, read, update or delete queues.
735
750
  */
736
751
  queue(request) {
737
- return new Queue(this.http, _optionalChain([request, 'optionalAccess', _6 => _6.queueName]));
752
+ return new Queue(this.http, _optionalChain([request, 'optionalAccess', _16 => _16.queueName]));
738
753
  }
739
754
  /**
740
755
  * Access the Chat API
@@ -761,7 +776,7 @@ var Client = class {
761
776
  async publishJSON(request) {
762
777
  const headers = prefixHeaders(new Headers(request.headers));
763
778
  headers.set("Content-Type", "application/json");
764
- appendLLMOptions(request, headers);
779
+ appendLLMOptionsIfNeeded(request, headers);
765
780
  const response = await this.publish({
766
781
  ...request,
767
782
  headers,
@@ -803,7 +818,7 @@ var Client = class {
803
818
  message.body = JSON.stringify(message.body);
804
819
  }
805
820
  message.headers = new Headers(message.headers);
806
- appendLLMOptions(message, message.headers);
821
+ appendLLMOptionsIfNeeded(message, message.headers);
807
822
  message.headers.set("Content-Type", "application/json");
808
823
  }
809
824
  const response = await this.batch(request);
@@ -830,10 +845,10 @@ var Client = class {
830
845
  */
831
846
  async events(request) {
832
847
  const query = {};
833
- if (_optionalChain([request, 'optionalAccess', _7 => _7.cursor]) && request.cursor > 0) {
848
+ if (_optionalChain([request, 'optionalAccess', _17 => _17.cursor]) && request.cursor > 0) {
834
849
  query.cursor = request.cursor.toString();
835
850
  }
836
- for (const [key, value] of Object.entries(_nullishCoalesce(_optionalChain([request, 'optionalAccess', _8 => _8.filter]), () => ( {})))) {
851
+ for (const [key, value] of Object.entries(_nullishCoalesce(_optionalChain([request, 'optionalAccess', _18 => _18.filter]), () => ( {})))) {
837
852
  if (typeof value === "number" && value < 0) {
838
853
  continue;
839
854
  }
@@ -858,6 +873,31 @@ var Client = class {
858
873
  }
859
874
  };
860
875
 
876
+ // src/client/llm/providers.ts
877
+ var upstash = () => {
878
+ if (!process.env.QSTASH_TOKEN)
879
+ throw new Error("QSTASH_TOKEN cannot be empty or undefined!");
880
+ return {
881
+ owner: "upstash",
882
+ baseUrl: "https://qstash.upstash.io/llm",
883
+ token: process.env.QSTASH_TOKEN
884
+ };
885
+ };
886
+ var openai = ({
887
+ token
888
+ }) => {
889
+ return { token, owner: "openai", baseUrl: "https://api.openai.com" };
890
+ };
891
+ var custom = ({
892
+ baseUrl,
893
+ token
894
+ }) => {
895
+ return { token, owner: "custom", baseUrl };
896
+ };
897
+
898
+
899
+
900
+
861
901
 
862
902
 
863
903
 
@@ -868,4 +908,4 @@ var Client = class {
868
908
 
869
909
 
870
910
 
871
- exports.Chat = Chat; exports.Client = Client; exports.Messages = Messages; exports.QstashChatRatelimitError = QstashChatRatelimitError; exports.QstashError = QstashError; exports.QstashRatelimitError = QstashRatelimitError; exports.Receiver = _chunkUUR7N6E6js.Receiver; exports.Schedules = Schedules; exports.SignatureError = _chunkUUR7N6E6js.SignatureError; exports.UrlGroups = UrlGroups;
911
+ exports.Chat = Chat; exports.Client = Client; exports.Messages = Messages; exports.QstashChatRatelimitError = QstashChatRatelimitError; exports.QstashError = QstashError; exports.QstashRatelimitError = QstashRatelimitError; exports.Receiver = _chunkUUR7N6E6js.Receiver; exports.Schedules = Schedules; exports.SignatureError = _chunkUUR7N6E6js.SignatureError; exports.UrlGroups = UrlGroups; exports.custom = custom; exports.openai = openai; exports.upstash = upstash;