@delofarag/ai-utils 1.4.3 → 1.6.0

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 (122) hide show
  1. package/README.md +354 -216
  2. package/dist/heart/agent.d.ts +1 -1
  3. package/dist/heart/agent.d.ts.map +1 -1
  4. package/dist/heart/agent.js +4 -9
  5. package/dist/heart/agent.js.map +1 -1
  6. package/dist/heart/chain.d.ts +1 -1
  7. package/dist/heart/chain.d.ts.map +1 -1
  8. package/dist/heart/chain.js +4 -4
  9. package/dist/heart/chain.js.map +1 -1
  10. package/dist/heart/chatbot.d.ts +1 -1
  11. package/dist/heart/memorychain.d.ts +2 -2
  12. package/dist/heart/memorychain.js +6 -6
  13. package/dist/heart/memorychain.js.map +1 -1
  14. package/dist/heart/tools/zodios/ZodiosToolRegistry.d.ts +1 -1
  15. package/dist/heart/tools/zodios/ZodiosToolRegistry.d.ts.map +1 -1
  16. package/dist/helpers/chatbot.d.ts +31 -0
  17. package/dist/helpers/chatbot.d.ts.map +1 -0
  18. package/dist/helpers/chatbot.js +71 -0
  19. package/dist/helpers/chatbot.js.map +1 -0
  20. package/dist/helpers/helpers.d.ts +25 -0
  21. package/dist/helpers/helpers.d.ts.map +1 -0
  22. package/dist/helpers/helpers.js +43 -0
  23. package/dist/helpers/helpers.js.map +1 -0
  24. package/dist/helpers/llms.d.ts +95 -0
  25. package/dist/helpers/llms.d.ts.map +1 -0
  26. package/dist/helpers/llms.js +62 -0
  27. package/dist/helpers/llms.js.map +1 -0
  28. package/dist/helpers/memory.d.ts +107 -0
  29. package/dist/helpers/memory.d.ts.map +1 -0
  30. package/dist/helpers/memory.js +497 -0
  31. package/dist/helpers/memory.js.map +1 -0
  32. package/dist/helpers/rag.d.ts +42 -0
  33. package/dist/helpers/rag.d.ts.map +1 -0
  34. package/dist/helpers/rag.js +66 -0
  35. package/dist/helpers/rag.js.map +1 -0
  36. package/dist/helpers.d.ts +3 -3
  37. package/dist/index.d.ts +10 -10
  38. package/dist/index.d.ts.map +1 -1
  39. package/dist/index.js +10 -10
  40. package/dist/index.js.map +1 -1
  41. package/dist/magic-funcs/answerers/ask.d.ts +18 -2
  42. package/dist/magic-funcs/answerers/ask.d.ts.map +1 -1
  43. package/dist/magic-funcs/answerers/ask.js +20 -9
  44. package/dist/magic-funcs/answerers/ask.js.map +1 -1
  45. package/dist/magic-funcs/answerers/websearch.d.ts +15 -0
  46. package/dist/magic-funcs/answerers/websearch.d.ts.map +1 -1
  47. package/dist/magic-funcs/answerers/websearch.js +15 -0
  48. package/dist/magic-funcs/answerers/websearch.js.map +1 -1
  49. package/dist/magic-funcs/evaluators/classify.d.ts +20 -1
  50. package/dist/magic-funcs/evaluators/classify.d.ts.map +1 -1
  51. package/dist/magic-funcs/evaluators/classify.js +22 -3
  52. package/dist/magic-funcs/evaluators/classify.js.map +1 -1
  53. package/dist/magic-funcs/evaluators/decide.d.ts +18 -0
  54. package/dist/magic-funcs/evaluators/decide.d.ts.map +1 -1
  55. package/dist/magic-funcs/evaluators/decide.js +21 -3
  56. package/dist/magic-funcs/evaluators/decide.js.map +1 -1
  57. package/dist/magic-funcs/optimizers/promptify.d.ts +18 -0
  58. package/dist/magic-funcs/optimizers/promptify.d.ts.map +1 -1
  59. package/dist/magic-funcs/optimizers/promptify.js +21 -3
  60. package/dist/magic-funcs/optimizers/promptify.js.map +1 -1
  61. package/dist/magic-funcs/optimizers/ragify.d.ts +16 -0
  62. package/dist/magic-funcs/optimizers/ragify.d.ts.map +1 -1
  63. package/dist/magic-funcs/optimizers/ragify.js +19 -3
  64. package/dist/magic-funcs/optimizers/ragify.js.map +1 -1
  65. package/dist/magic-funcs/parsers/extract.d.ts +23 -0
  66. package/dist/magic-funcs/parsers/extract.d.ts.map +1 -1
  67. package/dist/magic-funcs/parsers/extract.js +26 -3
  68. package/dist/magic-funcs/parsers/extract.js.map +1 -1
  69. package/dist/magic-funcs/parsers/rewrite.d.ts +19 -0
  70. package/dist/magic-funcs/parsers/rewrite.d.ts.map +1 -1
  71. package/dist/magic-funcs/parsers/rewrite.js +22 -2
  72. package/dist/magic-funcs/parsers/rewrite.js.map +1 -1
  73. package/dist/magic-funcs/parsers/structure.d.ts +22 -0
  74. package/dist/magic-funcs/parsers/structure.d.ts.map +1 -1
  75. package/dist/magic-funcs/parsers/structure.js +27 -4
  76. package/dist/magic-funcs/parsers/structure.js.map +1 -1
  77. package/dist/magic-funcs/parsers/summarize.d.ts +20 -0
  78. package/dist/magic-funcs/parsers/summarize.d.ts.map +1 -1
  79. package/dist/magic-funcs/parsers/summarize.js +23 -3
  80. package/dist/magic-funcs/parsers/summarize.js.map +1 -1
  81. package/dist/memory.d.ts +1 -1
  82. package/dist/modalities/image-gen/generateImages.d.ts +56 -0
  83. package/dist/modalities/image-gen/generateImages.d.ts.map +1 -0
  84. package/dist/modalities/image-gen/generateImages.js +66 -0
  85. package/dist/modalities/image-gen/generateImages.js.map +1 -0
  86. package/dist/modalities/image-gen/helpers.d.ts +15 -0
  87. package/dist/modalities/image-gen/helpers.d.ts.map +1 -0
  88. package/dist/modalities/image-gen/helpers.js +17 -0
  89. package/dist/modalities/image-gen/helpers.js.map +1 -0
  90. package/dist/modalities/openrouter.d.ts +11 -0
  91. package/dist/modalities/openrouter.d.ts.map +1 -0
  92. package/dist/modalities/openrouter.js +39 -0
  93. package/dist/modalities/openrouter.js.map +1 -0
  94. package/dist/modalities/speech/VoiceEngine.d.ts +3 -0
  95. package/dist/modalities/speech/VoiceEngine.d.ts.map +1 -0
  96. package/dist/modalities/speech/VoiceEngine.js +3 -0
  97. package/dist/modalities/speech/VoiceEngine.js.map +1 -0
  98. package/dist/modalities/speech/stt/helpers.d.ts +3 -0
  99. package/dist/modalities/speech/stt/helpers.d.ts.map +1 -0
  100. package/dist/modalities/speech/stt/helpers.js +28 -0
  101. package/dist/modalities/speech/stt/helpers.js.map +1 -0
  102. package/dist/modalities/speech/stt/stt.d.ts +113 -0
  103. package/dist/modalities/speech/stt/stt.d.ts.map +1 -0
  104. package/dist/modalities/speech/stt/stt.js +177 -0
  105. package/dist/modalities/speech/stt/stt.js.map +1 -0
  106. package/dist/modalities/speech/tts/helpers.d.ts +12 -0
  107. package/dist/modalities/speech/tts/helpers.d.ts.map +1 -0
  108. package/dist/modalities/speech/tts/helpers.js +10 -0
  109. package/dist/modalities/speech/tts/helpers.js.map +1 -0
  110. package/dist/modalities/speech/tts/tts.d.ts +115 -0
  111. package/dist/modalities/speech/tts/tts.d.ts.map +1 -0
  112. package/dist/modalities/speech/tts/tts.js +142 -0
  113. package/dist/modalities/speech/tts/tts.js.map +1 -0
  114. package/dist/modalities/vision/helpers.d.ts +3 -0
  115. package/dist/modalities/vision/helpers.d.ts.map +1 -0
  116. package/dist/modalities/vision/helpers.js +7 -0
  117. package/dist/modalities/vision/helpers.js.map +1 -0
  118. package/dist/modalities/vision/vision.d.ts +55 -0
  119. package/dist/modalities/vision/vision.d.ts.map +1 -0
  120. package/dist/modalities/vision/vision.js +71 -0
  121. package/dist/modalities/vision/vision.js.map +1 -0
  122. package/package.json +2 -2
@@ -0,0 +1,142 @@
1
+ import { getLLM } from "../../../helpers/llms";
2
+ import { getOpenRouterRuntime } from "../../openrouter";
3
+ import { createTTSPayload } from "./helpers";
4
+ /**
5
+ * Converts text to speech via OpenRouter's dedicated `/audio/speech` endpoint.
6
+ *
7
+ * Internally this function calls OpenRouter directly and returns raw audio bytes.
8
+ * If no `llm` is provided, it creates one with
9
+ * `getLLM({ provider: "openrouter", type: "tts" })` and reads
10
+ * `process.env.OPENROUTER_API_KEY`.
11
+ *
12
+ * Make sure `OPENROUTER_API_KEY` is set in your `.env`.
13
+ *
14
+ * @param params.llm Optional LLM instance from `getLLM(...)`.
15
+ * @param params.text Text that should be synthesized to audio.
16
+ * @param params.model Voice identifier to use for speech generation.
17
+ * @param params.responseFormat Audio response format (`mp3` or `pcm`).
18
+ * @param params.speed Playback speed multiplier (default `1.0`).
19
+ * @returns Promise with `audioBytes` and optional response metadata headers.
20
+ *
21
+ * @example
22
+ * CONFIG:
23
+ * ```ts
24
+ * tts({
25
+ * llm = getLLM({ provider: "openrouter", type: "tts" }),
26
+ * responseFormat = "mp3",
27
+ * speed = 1.0,
28
+ * text,
29
+ * model
30
+ * })
31
+ * ```
32
+ *
33
+ * @example
34
+ * ```ts
35
+ * const speech = await tts({
36
+ * text: "Hallo! Das ist ein Test.",
37
+ * model: "nova",
38
+ * responseFormat: "mp3"
39
+ * });
40
+ *
41
+ * console.log(speech.audioBytes.length);
42
+ * ```
43
+ */
44
+ export async function tts({ llm = getLLM({ provider: "openrouter", type: "tts" }), responseFormat = "mp3", speed = 1.0, text, model }) {
45
+ const runtime = getOpenRouterRuntime(llm);
46
+ const payload = createTTSPayload({
47
+ model: runtime.model,
48
+ input: text,
49
+ voice: model,
50
+ response_format: responseFormat,
51
+ speed
52
+ });
53
+ const response = await fetch(`${runtime.baseURL}/audio/speech`, {
54
+ method: "POST",
55
+ headers: {
56
+ Authorization: `Bearer ${runtime.apiKey}`,
57
+ "Content-Type": "application/json"
58
+ },
59
+ body: JSON.stringify(payload)
60
+ });
61
+ if (!response.ok) {
62
+ const errorText = await response.text();
63
+ throw new Error(`OpenRouter TTS failed (${response.status}): ${errorText}`);
64
+ }
65
+ const audioBuffer = await response.arrayBuffer();
66
+ return {
67
+ audioBytes: new Uint8Array(audioBuffer),
68
+ contentType: response.headers.get("content-type") ?? undefined,
69
+ generationId: response.headers.get("x-generation-id") ?? undefined
70
+ };
71
+ }
72
+ /**
73
+ * Streams synthesized TTS audio as sequential chunks for phone socket pipelines
74
+ * (for example Twilio/Telnyx websocket media send loops).
75
+ *
76
+ * Internally this helper calls `tts()` once and splits the returned audio into
77
+ * chunked payloads that can be forwarded to a live call socket.
78
+ *
79
+ * @param params.llm Optional LLM instance from `getLLM(...)`.
80
+ * @param params.text Text that should be synthesized to audio.
81
+ * @param params.model Voice identifier for speech generation.
82
+ * @param params.responseFormat Audio response format (`mp3` or `pcm`).
83
+ * @param params.speed Playback speed multiplier.
84
+ * @param params.chunkSizeBytes Size of each emitted audio chunk.
85
+ * @param params.emitBase64 If true, emits base64 chunks; otherwise emits `Uint8Array`.
86
+ * @param params.onChunk Callback that receives each emitted chunk in order.
87
+ * @returns Promise with total emitted chunks and response metadata.
88
+ *
89
+ * @example
90
+ * CONFIG:
91
+ * ```ts
92
+ * streamTTSOverPhoneSocket({
93
+ * llm = getLLM({ provider: "openrouter", type: "tts" }),
94
+ speed = 1.0,
95
+ chunkSizeBytes = 3200,
96
+ emitBase64 = true,
97
+ responseFormat = "mp3",
98
+ text,
99
+ model,
100
+ onChunk
101
+ * })
102
+ * ```
103
+ *
104
+ * @example
105
+ * ```ts
106
+ * await streamTTSOverPhoneSocket({
107
+ model,
108
+ onChunk
109
+ * })
110
+ * ```
111
+ *
112
+ * @example
113
+ * ```ts
114
+ * await streamTTSOverPhoneSocket({
115
+ * text: "Willkommen beim Support.",
116
+ * model: "nova",
117
+ * onChunk: async (chunk) => socket.send(String(chunk))
118
+ * });
119
+ * ```
120
+ */
121
+ export async function streamTTSOverPhoneSocket({ llm = getLLM({ provider: "openrouter", type: "tts" }), speed = 1.0, chunkSizeBytes = 3200, emitBase64 = true, responseFormat = "mp3", text, model, onChunk }) {
122
+ const result = await tts({
123
+ llm,
124
+ text,
125
+ model,
126
+ responseFormat,
127
+ speed
128
+ });
129
+ let index = 0;
130
+ for (let offset = 0; offset < result.audioBytes.length; offset += chunkSizeBytes) {
131
+ const chunk = result.audioBytes.slice(offset, offset + chunkSizeBytes);
132
+ const outgoing = emitBase64 ? Buffer.from(chunk).toString("base64") : chunk;
133
+ await onChunk(outgoing, index);
134
+ index += 1;
135
+ }
136
+ return {
137
+ totalChunks: index,
138
+ contentType: result.contentType,
139
+ generationId: result.generationId
140
+ };
141
+ }
142
+ //# sourceMappingURL=tts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tts.js","sourceRoot":"","sources":["../../../../src/modalities/speech/tts/tts.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export type VisionImageInput = string;
2
+ export declare function normalizeVisionImage(input: VisionImageInput): string;
3
+ //# sourceMappingURL=helpers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../../src/modalities/vision/helpers.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,gBAAgB,GAAG,MAAM,CAAA;AAErC,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,gBAAgB,GAAG,MAAM,CAMpE"}
@@ -0,0 +1,7 @@
1
+ export function normalizeVisionImage(input) {
2
+ if (input.startsWith("http://") || input.startsWith("https://") || input.startsWith("data:image/")) {
3
+ return input;
4
+ }
5
+ return `data:image/jpeg;base64,${input}`;
6
+ }
7
+ //# sourceMappingURL=helpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../../src/modalities/vision/helpers.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,oBAAoB,CAAC,KAAuB;IACxD,IAAI,KAAK,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,KAAK,CAAC,UAAU,CAAC,UAAU,CAAC,IAAI,KAAK,CAAC,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC;QACjG,OAAO,KAAK,CAAA;IAChB,CAAC;IAED,OAAO,0BAA0B,KAAK,EAAE,CAAA;AAC5C,CAAC"}
@@ -0,0 +1,55 @@
1
+ import { OpenRouterVisionModel } from "../../helpers/llms";
2
+ import { LLMInstance } from "../openrouter";
3
+ import { VisionImageInput } from "./helpers";
4
+ type VisionOptions = {
5
+ llm?: LLMInstance;
6
+ prompt: string;
7
+ images: VisionImageInput[];
8
+ detail?: "auto" | "low" | "high";
9
+ model?: OpenRouterVisionModel;
10
+ };
11
+ /**
12
+ * Analyzes one or more images with a vision-capable OpenRouter model.
13
+ *
14
+ * Internally this function sends `image_url` content parts through OpenRouter's
15
+ * chat-completions-compatible interface. If no `llm` is provided, it builds one
16
+ * with `getLLM({ provider: "openrouter", type: "vision" })` and reads
17
+ * `process.env.OPENROUTER_API_KEY`.
18
+ *
19
+ * Make sure `OPENROUTER_API_KEY` is set in your `.env`.
20
+ *
21
+ * @param params.llm Optional LLM instance from `getLLM(...)`.
22
+ * @param params.prompt Instruction/question for the model about the provided images.
23
+ * @param params.images Array of image URLs, data URLs, or base64 strings.
24
+ * @param params.detail Vision detail level (`auto`, `low`, `high`).
25
+ * @param params.model Optional model override for this call.
26
+ * @returns Promise with normalized `text` and full provider response in `raw`.
27
+ *
28
+ * @example
29
+ * CONFIG:
30
+ * ```ts
31
+ * vision({
32
+ * llm = getLLM({ provider: "openrouter", type: "vision" }),
33
+ * prompt = "Describe the image in detail.",
34
+ * detail = "auto",
35
+ * images,
36
+ * model
37
+ * })
38
+ * ```
39
+ *
40
+ * @example
41
+ * ```ts
42
+ * const result = await vision({
43
+ * prompt: "What objects do you see?",
44
+ * images: ["https://example.com/cat.jpg"]
45
+ * });
46
+ *
47
+ * console.log(result.text);
48
+ * ```
49
+ */
50
+ export declare function vision({ llm, prompt, detail, images, model }: VisionOptions): Promise<{
51
+ text: string;
52
+ raw: unknown;
53
+ }>;
54
+ export {};
55
+ //# sourceMappingURL=vision.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vision.d.ts","sourceRoot":"","sources":["../../../src/modalities/vision/vision.ts"],"names":[],"mappings":"AACA,OAAO,EAAU,qBAAqB,EAAE,MAAM,oBAAoB,CAAA;AAClE,OAAO,EAAE,WAAW,EAAwB,MAAM,eAAe,CAAA;AACjE,OAAO,EAAwB,gBAAgB,EAAE,MAAM,WAAW,CAAA;AAElE,KAAK,aAAa,GAAG;IACjB,GAAG,CAAC,EAAE,WAAW,CAAA;IACjB,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,gBAAgB,EAAE,CAAA;IAC1B,MAAM,CAAC,EAAE,MAAM,GAAG,KAAK,GAAG,MAAM,CAAA;IAChC,KAAK,CAAC,EAAE,qBAAqB,CAAA;CAChC,CAAA;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsCG;AACH,wBAAsB,MAAM,CAAC,EACzB,GAAwD,EACxD,MAAwC,EACxC,MAAe,EACf,MAAM,EACN,KAAK,EACR,EAAE,aAAa,GAAG,OAAO,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,OAAO,CAAA;CAAE,CAAC,CA+BzD"}
@@ -0,0 +1,71 @@
1
+ import { HumanMessage } from "../../imports";
2
+ import { getLLM } from "../../helpers/llms";
3
+ import { getOpenRouterRuntime } from "../openrouter";
4
+ import { normalizeVisionImage } from "./helpers";
5
+ /**
6
+ * Analyzes one or more images with a vision-capable OpenRouter model.
7
+ *
8
+ * Internally this function sends `image_url` content parts through OpenRouter's
9
+ * chat-completions-compatible interface. If no `llm` is provided, it builds one
10
+ * with `getLLM({ provider: "openrouter", type: "vision" })` and reads
11
+ * `process.env.OPENROUTER_API_KEY`.
12
+ *
13
+ * Make sure `OPENROUTER_API_KEY` is set in your `.env`.
14
+ *
15
+ * @param params.llm Optional LLM instance from `getLLM(...)`.
16
+ * @param params.prompt Instruction/question for the model about the provided images.
17
+ * @param params.images Array of image URLs, data URLs, or base64 strings.
18
+ * @param params.detail Vision detail level (`auto`, `low`, `high`).
19
+ * @param params.model Optional model override for this call.
20
+ * @returns Promise with normalized `text` and full provider response in `raw`.
21
+ *
22
+ * @example
23
+ * CONFIG:
24
+ * ```ts
25
+ * vision({
26
+ * llm = getLLM({ provider: "openrouter", type: "vision" }),
27
+ * prompt = "Describe the image in detail.",
28
+ * detail = "auto",
29
+ * images,
30
+ * model
31
+ * })
32
+ * ```
33
+ *
34
+ * @example
35
+ * ```ts
36
+ * const result = await vision({
37
+ * prompt: "What objects do you see?",
38
+ * images: ["https://example.com/cat.jpg"]
39
+ * });
40
+ *
41
+ * console.log(result.text);
42
+ * ```
43
+ */
44
+ export async function vision({ llm = getLLM({ provider: "openrouter", type: "vision" }), prompt = "Describe the image in detail.", detail = "auto", images, model }) {
45
+ const runtime = getOpenRouterRuntime(llm);
46
+ const content = [
47
+ { type: "text", text: prompt },
48
+ ...images.map((image) => ({
49
+ type: "image_url",
50
+ image_url: {
51
+ url: normalizeVisionImage(image),
52
+ detail
53
+ }
54
+ }))
55
+ ];
56
+ const runtimeLLM = model && model !== runtime.model
57
+ ? getLLM({
58
+ provider: "openrouter",
59
+ type: "vision",
60
+ model,
61
+ apikey: runtime.apiKey
62
+ })
63
+ : llm;
64
+ const response = await runtimeLLM.invoke([new HumanMessage({ content })]);
65
+ const text = typeof response.content === "string" ? response.content : JSON.stringify(response.content);
66
+ return {
67
+ text,
68
+ raw: response
69
+ };
70
+ }
71
+ //# sourceMappingURL=vision.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vision.js","sourceRoot":"","sources":["../../../src/modalities/vision/vision.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAA;AAC5C,OAAO,EAAE,MAAM,EAAyB,MAAM,oBAAoB,CAAA;AAClE,OAAO,EAAe,oBAAoB,EAAE,MAAM,eAAe,CAAA;AACjE,OAAO,EAAE,oBAAoB,EAAoB,MAAM,WAAW,CAAA;AAUlE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsCG;AACH,MAAM,CAAC,KAAK,UAAU,MAAM,CAAC,EACzB,GAAG,GAAG,MAAM,CAAC,EAAE,QAAQ,EAAE,YAAY,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,EACxD,MAAM,GAAG,+BAA+B,EACxC,MAAM,GAAG,MAAM,EACf,MAAM,EACN,KAAK,EACO;IACZ,MAAM,OAAO,GAAG,oBAAoB,CAAC,GAAG,CAAC,CAAA;IAEzC,MAAM,OAAO,GAAG;QACZ,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,MAAM,EAAE;QACvC,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;YACtB,IAAI,EAAE,WAAoB;YAC1B,SAAS,EAAE;gBACP,GAAG,EAAE,oBAAoB,CAAC,KAAK,CAAC;gBAChC,MAAM;aACT;SACJ,CAAC,CAAC;KACN,CAAA;IAED,MAAM,UAAU,GACZ,KAAK,IAAI,KAAK,KAAK,OAAO,CAAC,KAAK;QAC5B,CAAC,CAAC,MAAM,CAAC;YACH,QAAQ,EAAE,YAAY;YACtB,IAAI,EAAE,QAAQ;YACd,KAAK;YACL,MAAM,EAAE,OAAO,CAAC,MAAM;SACzB,CAAC;QACJ,CAAC,CAAC,GAAG,CAAA;IAEb,MAAM,QAAQ,GAAG,MAAM,UAAU,CAAC,MAAM,CAAC,CAAC,IAAI,YAAY,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,CAAA;IACzE,MAAM,IAAI,GAAG,OAAO,QAAQ,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAA;IAEvG,OAAO;QACH,IAAI;QACJ,GAAG,EAAE,QAAQ;KAChB,CAAA;AACL,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@delofarag/ai-utils",
3
- "version": "1.4.3",
3
+ "version": "1.6.0",
4
4
  "type": "module",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -34,7 +34,7 @@
34
34
  "zodios": "^5.1.0"
35
35
  },
36
36
  "peerDependencies": {
37
- "@delofarag/supabase-utils": "^1.0.1"
37
+ "@delofarag/supabase-utils": "^1.3.10"
38
38
  },
39
39
  "devDependencies": {
40
40
  "@types/node": "^20.0.0",