@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.mjs 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
+ ...options?.filter,
18
+ topicName: options?.filter?.urlGroup
19
+ };
16
20
  const messagesPayload = await this.http.request({
17
21
  method: "GET",
18
22
  path: ["v2", "dlq"],
19
- query: { cursor: options?.cursor }
23
+ query: {
24
+ cursor: options?.cursor,
25
+ count: options?.count,
26
+ ...filterPayload
27
+ }
20
28
  });
21
29
  return {
22
30
  messages: messagesPayload.messages.map((message) => {
@@ -193,6 +201,130 @@ var HttpClient = class {
193
201
  }
194
202
  };
195
203
 
204
+ // src/client/llm/chat.ts
205
+ var Chat = class _Chat {
206
+ http;
207
+ constructor(http) {
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
+ 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
+ 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
+ prompt = async (request) => {
306
+ const chatRequest = _Chat.toChatRequest(request);
307
+ return this.create(chatRequest);
308
+ };
309
+ };
310
+
311
+ // src/client/llm/utils.ts
312
+ function appendLLMOptionsIfNeeded(request, headers) {
313
+ if (request.api?.provider?.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 (!provider?.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
  http;
@@ -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 = process.env.OPENAI_API_KEY ?? request.llmToken;
240
- request.url = request.url ?? `${PROVIDER_MAP[llmProvider]}/v1/chat/completion`;
241
- headers.set("Authorization", `Bearer ${token}`);
242
- }
243
- if (llmProvider === "togetherai") {
244
- const token = process.env.TOGETHER_API_KEY ?? request.llmToken;
245
- request.url = 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 request.url ?? request.urlGroup ?? `api/${request.api}`;
422
+ return request.url ?? request.urlGroup ?? `api/${request.api?.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 = class _Chat {
581
- http;
582
- constructor(http) {
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
- 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
- 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
- prompt = async (request) => {
684
- const chatRequest = _Chat.toChatRequest(request);
685
- return this.create(chatRequest);
686
- };
687
- };
688
-
689
704
  // src/client/client.ts
690
705
  var Client = class {
691
706
  http;
@@ -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);
@@ -857,6 +872,28 @@ var Client = class {
857
872
  };
858
873
  }
859
874
  };
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
+ };
860
897
  export {
861
898
  Chat,
862
899
  Client,
@@ -867,5 +904,8 @@ export {
867
904
  Receiver,
868
905
  Schedules,
869
906
  SignatureError,
870
- UrlGroups
907
+ UrlGroups,
908
+ custom,
909
+ openai,
910
+ upstash
871
911
  };
package/package.json CHANGED
@@ -1 +1 @@
1
- {"version":"v2.6.0","name":"@upstash/qstash","description":"Official Typescript client for QStash","author":"Andreas Thomas <dev@chronark.com>","license":"MIT","homepage":"https://github.com/upstash/sdk-qstash-ts#readme","repository":{"type":"git","url":"git+https://github.com/upstash/sdk-qstash-ts.git"},"bugs":{"url":"https://github.com/upstash/sdk-qstash-ts/issues"},"main":"./index.js","module":"./index.mjs","types":"./index.d.ts","files":["./**"],"exports":{".":{"import":"./index.mjs","require":"./index.js"},"./nextjs":{"import":"./nextjs.js","require":"./nextjs.js"},"./dist/nextjs":{"import":"./nextjs.js","require":"./nextjs.js"}},"typesVersions":{"*":{"nextjs":["./nextjs.d.ts"]}},"keywords":["qstash","queue","events","serverless","upstash"],"scripts":{"build":"tsup && cp README.md ./dist/ && cp package.json ./dist/ && cp LICENSE ./dist/","test":"bun test","fmt":"prettier --write .","lint":"tsc && eslint \"src/**/*.{js,ts,tsx}\" --quiet --fix"},"devDependencies":{"@commitlint/cli":"^19.2.2","@commitlint/config-conventional":"^19.2.2","@types/bun":"^1.1.1","@types/crypto-js":"^4.2.0","@typescript-eslint/eslint-plugin":"^7.0.1","@typescript-eslint/parser":"^7.0.1","ai":"^3.1.28","bun-types":"^1.1.7","eslint":"^8","eslint-plugin-unicorn":"^51.0.1","husky":"^9.0.10","next":"^14.0.2","prettier":"^3.2.5","tsup":"latest","typescript":"^5.4.5","undici-types":"^6.16.0","vitest":"latest"},"dependencies":{"crypto-js":">=4.2.0","jose":"^ 5.2.3"}}
1
+ {"version":"v2.7.0-canary","name":"@upstash/qstash","description":"Official Typescript client for QStash","author":"Andreas Thomas <dev@chronark.com>","license":"MIT","homepage":"https://github.com/upstash/sdk-qstash-ts#readme","repository":{"type":"git","url":"git+https://github.com/upstash/sdk-qstash-ts.git"},"bugs":{"url":"https://github.com/upstash/sdk-qstash-ts/issues"},"main":"./index.js","module":"./index.mjs","types":"./index.d.ts","files":["./**"],"exports":{".":{"import":"./index.mjs","require":"./index.js"},"./nextjs":{"import":"./nextjs.js","require":"./nextjs.js"},"./dist/nextjs":{"import":"./nextjs.js","require":"./nextjs.js"}},"typesVersions":{"*":{"nextjs":["./nextjs.d.ts"]}},"keywords":["qstash","queue","events","serverless","upstash"],"scripts":{"build":"tsup && cp README.md ./dist/ && cp package.json ./dist/ && cp LICENSE ./dist/","test":"bun test","fmt":"prettier --write .","lint":"tsc && eslint \"src/**/*.{js,ts,tsx}\" --quiet --fix"},"devDependencies":{"@commitlint/cli":"^19.2.2","@commitlint/config-conventional":"^19.2.2","@types/bun":"^1.1.1","@types/crypto-js":"^4.2.0","@typescript-eslint/eslint-plugin":"^7.0.1","@typescript-eslint/parser":"^7.0.1","ai":"^3.1.28","bun-types":"^1.1.7","eslint":"^8","eslint-plugin-unicorn":"^51.0.1","husky":"^9.0.10","next":"^14.0.2","prettier":"^3.2.5","tsup":"latest","typescript":"^5.4.5","undici-types":"^6.16.0","vitest":"latest"},"dependencies":{"crypto-js":">=4.2.0","jose":"^ 5.2.3"}}