@use-lattice/litmus 0.121.3

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 (199) hide show
  1. package/LICENSE +19 -0
  2. package/dist/src/accounts-Bt1oJb1Z.cjs +219 -0
  3. package/dist/src/accounts-DjOU8Rm3.js +178 -0
  4. package/dist/src/agentic-utils-D03IiXQc.js +153 -0
  5. package/dist/src/agentic-utils-Dh7xaMQM.cjs +180 -0
  6. package/dist/src/agents-C6BIMlZa.js +231 -0
  7. package/dist/src/agents-DvIpNX1L.cjs +666 -0
  8. package/dist/src/agents-ZP0RP9vV.cjs +231 -0
  9. package/dist/src/agents-maJXdjbR.js +665 -0
  10. package/dist/src/aimlapi-BTbQjG2E.cjs +30 -0
  11. package/dist/src/aimlapi-CwMxqfXP.js +30 -0
  12. package/dist/src/audio-BBUdvsde.cjs +97 -0
  13. package/dist/src/audio-D5DPZ7I-.js +97 -0
  14. package/dist/src/base-BEysXrkq.cjs +222 -0
  15. package/dist/src/base-C451JQfq.js +193 -0
  16. package/dist/src/blobs-BY8MDmpo.js +230 -0
  17. package/dist/src/blobs-BgcNn97m.cjs +256 -0
  18. package/dist/src/cache-BBE_lsTA.cjs +4 -0
  19. package/dist/src/cache-BkrqU5Ba.js +237 -0
  20. package/dist/src/cache-DsCxFlsZ.cjs +297 -0
  21. package/dist/src/chat-CPJWDP6a.cjs +289 -0
  22. package/dist/src/chat-CXX3xzkk.cjs +811 -0
  23. package/dist/src/chat-CcDgZFJ4.js +787 -0
  24. package/dist/src/chat-Dz5ZeGO2.js +289 -0
  25. package/dist/src/chatkit-Dw0mKkML.cjs +1158 -0
  26. package/dist/src/chatkit-swAIVuea.js +1157 -0
  27. package/dist/src/chunk-DEq-mXcV.js +15 -0
  28. package/dist/src/claude-agent-sdk-BXZJtOg6.js +379 -0
  29. package/dist/src/claude-agent-sdk-CkfyjDoG.cjs +383 -0
  30. package/dist/src/cloudflare-ai-BzpJcqUH.js +161 -0
  31. package/dist/src/cloudflare-ai-Cmy_R1y2.cjs +161 -0
  32. package/dist/src/cloudflare-gateway-B9tVQKok.cjs +272 -0
  33. package/dist/src/cloudflare-gateway-DrD3ew3H.js +272 -0
  34. package/dist/src/codex-sdk-Dezj9Nwm.js +1056 -0
  35. package/dist/src/codex-sdk-Dl9D4k5B.cjs +1060 -0
  36. package/dist/src/cometapi-C-9YvCHC.js +54 -0
  37. package/dist/src/cometapi-DHgDKoO2.cjs +54 -0
  38. package/dist/src/completion-B8Ctyxpr.js +120 -0
  39. package/dist/src/completion-Cxrt08sj.cjs +131 -0
  40. package/dist/src/createHash-BwgE13yv.cjs +27 -0
  41. package/dist/src/createHash-DmPQkvBh.js +15 -0
  42. package/dist/src/docker-BiqcTwLv.js +80 -0
  43. package/dist/src/docker-C7tEJnP-.cjs +80 -0
  44. package/dist/src/esm-C62Zofr1.cjs +409 -0
  45. package/dist/src/esm-DMVc93eh.js +379 -0
  46. package/dist/src/evalResult-C3NJPQOo.cjs +301 -0
  47. package/dist/src/evalResult-C7JJAPBb.js +295 -0
  48. package/dist/src/evalResult-DoVTZZWI.cjs +2 -0
  49. package/dist/src/extractor-DnMD3fwt.cjs +391 -0
  50. package/dist/src/extractor-DtlL28vL.js +374 -0
  51. package/dist/src/fetch-BTxakTSg.cjs +1133 -0
  52. package/dist/src/fetch-DQckpUFz.js +928 -0
  53. package/dist/src/fileExtensions-DnqA1y9x.js +85 -0
  54. package/dist/src/fileExtensions-bYh77CN8.cjs +114 -0
  55. package/dist/src/genaiTracer-CyZrmaK0.cjs +268 -0
  56. package/dist/src/genaiTracer-D3fD9dNV.js +256 -0
  57. package/dist/src/graders-BNscxFrU.js +13644 -0
  58. package/dist/src/graders-D2oE9Msq.js +2 -0
  59. package/dist/src/graders-c0Ez_w-9.cjs +2 -0
  60. package/dist/src/graders-d0F2M3e9.cjs +14056 -0
  61. package/dist/src/image-0ZhE0VlR.cjs +280 -0
  62. package/dist/src/image-CWE1pdNv.js +257 -0
  63. package/dist/src/image-D9ZK6hwL.js +163 -0
  64. package/dist/src/image-DKZgZITg.cjs +163 -0
  65. package/dist/src/index.cjs +11366 -0
  66. package/dist/src/index.d.cts +19640 -0
  67. package/dist/src/index.d.ts +19641 -0
  68. package/dist/src/index.js +11306 -0
  69. package/dist/src/invariant-Ddh24eXh.js +25 -0
  70. package/dist/src/invariant-kfQ8Bu82.cjs +30 -0
  71. package/dist/src/knowledgeBase-BgPyGFUd.cjs +122 -0
  72. package/dist/src/knowledgeBase-DyHilYaP.js +122 -0
  73. package/dist/src/litellm-CyMeneHS.js +135 -0
  74. package/dist/src/litellm-DWDF73yF.cjs +135 -0
  75. package/dist/src/logger-C40ZGil9.js +717 -0
  76. package/dist/src/logger-DyfK9PBt.cjs +917 -0
  77. package/dist/src/luma-ray-BAU9X_ep.cjs +315 -0
  78. package/dist/src/luma-ray-nwVseBbv.js +313 -0
  79. package/dist/src/messages-B5ADWTTv.js +245 -0
  80. package/dist/src/messages-BCnZfqrS.cjs +257 -0
  81. package/dist/src/meteor-DLZZ3osF.cjs +134 -0
  82. package/dist/src/meteor-DUiCJRC-.js +134 -0
  83. package/dist/src/modelslab-00cveB8L.cjs +163 -0
  84. package/dist/src/modelslab-D9sCU_L7.js +163 -0
  85. package/dist/src/nova-reel-CTapvqYH.js +276 -0
  86. package/dist/src/nova-reel-DlWuuroF.cjs +278 -0
  87. package/dist/src/nova-sonic-5UPWfeMv.cjs +363 -0
  88. package/dist/src/nova-sonic-BhSwQNym.js +363 -0
  89. package/dist/src/openai-BWrJK9d8.cjs +52 -0
  90. package/dist/src/openai-DumO8WQn.js +47 -0
  91. package/dist/src/openclaw-B8brrjC_.cjs +577 -0
  92. package/dist/src/openclaw-Bkayww9q.js +571 -0
  93. package/dist/src/opencode-sdk-7xjoDNiM.cjs +562 -0
  94. package/dist/src/opencode-sdk-SGwAPxht.js +558 -0
  95. package/dist/src/otlpReceiver-CoAHfAN9.cjs +15 -0
  96. package/dist/src/otlpReceiver-oO3EQwI9.js +14 -0
  97. package/dist/src/providerRegistry-4yjhaEM8.js +45 -0
  98. package/dist/src/providerRegistry-DhV4rJIc.cjs +50 -0
  99. package/dist/src/providers-B5RJVG-7.cjs +33609 -0
  100. package/dist/src/providers-BdmZCLzV.js +33262 -0
  101. package/dist/src/providers-CxtRxn8e.js +2 -0
  102. package/dist/src/providers-DnQLNbx1.cjs +3 -0
  103. package/dist/src/pythonUtils-BD0druiM.cjs +275 -0
  104. package/dist/src/pythonUtils-IBhn5YGR.js +249 -0
  105. package/dist/src/quiverai-BDOwZBsM.cjs +213 -0
  106. package/dist/src/quiverai-D3JTF5lD.js +213 -0
  107. package/dist/src/responses-B2LCDCXZ.js +667 -0
  108. package/dist/src/responses-BvNm4Xv9.cjs +685 -0
  109. package/dist/src/rubyUtils-B0NwnfpY.cjs +245 -0
  110. package/dist/src/rubyUtils-BroxzZ7c.cjs +2 -0
  111. package/dist/src/rubyUtils-hqVw5UvJ.js +222 -0
  112. package/dist/src/sagemaker-Cno2V-Sx.js +689 -0
  113. package/dist/src/sagemaker-fV_KUgs5.cjs +691 -0
  114. package/dist/src/server-BOuAXb06.cjs +238 -0
  115. package/dist/src/server-CtI-EWzm.cjs +2 -0
  116. package/dist/src/server-Cy3DZymt.js +189 -0
  117. package/dist/src/slack-CP8xBePa.js +135 -0
  118. package/dist/src/slack-DSQ1yXVb.cjs +135 -0
  119. package/dist/src/store-BwDDaBjb.cjs +246 -0
  120. package/dist/src/store-DcbLC593.cjs +2 -0
  121. package/dist/src/store-IGpqMIkv.js +240 -0
  122. package/dist/src/tables-3Q2cL7So.cjs +373 -0
  123. package/dist/src/tables-Bi2fjr4W.js +288 -0
  124. package/dist/src/telemetry-Bg2WqF79.js +161 -0
  125. package/dist/src/telemetry-D0x6u5kX.cjs +166 -0
  126. package/dist/src/telemetry-DXNimrI0.cjs +2 -0
  127. package/dist/src/text-B_UCRPp2.js +22 -0
  128. package/dist/src/text-CW1cyrwj.cjs +33 -0
  129. package/dist/src/tokenUsageUtils-NYT-WKS6.js +138 -0
  130. package/dist/src/tokenUsageUtils-bVa1ga6f.cjs +173 -0
  131. package/dist/src/transcription-Cl_W16Pr.js +122 -0
  132. package/dist/src/transcription-yt1EecY8.cjs +124 -0
  133. package/dist/src/transform-BCtGrl_W.cjs +228 -0
  134. package/dist/src/transform-Bv6gG2MJ.cjs +1688 -0
  135. package/dist/src/transform-CY1wbpRy.js +1507 -0
  136. package/dist/src/transform-DU8rUL9P.cjs +2 -0
  137. package/dist/src/transform-yWaShiKr.js +216 -0
  138. package/dist/src/transformersAvailability-BGkzavwb.js +35 -0
  139. package/dist/src/transformersAvailability-DKoRtQLy.cjs +35 -0
  140. package/dist/src/types-5aqHpBwE.cjs +3769 -0
  141. package/dist/src/types-Bn6D9c4U.js +3300 -0
  142. package/dist/src/util-BkKlTkI2.js +293 -0
  143. package/dist/src/util-CTh0bfOm.cjs +1119 -0
  144. package/dist/src/util-D17oBwo7.cjs +328 -0
  145. package/dist/src/util-DsS_-v4p.js +613 -0
  146. package/dist/src/util-DuntT1Ga.js +951 -0
  147. package/dist/src/util-aWjdCYMI.cjs +667 -0
  148. package/dist/src/utils-CisQwpjA.js +94 -0
  149. package/dist/src/utils-yWamDvmz.cjs +123 -0
  150. package/dist/tsconfig.tsbuildinfo +1 -0
  151. package/drizzle/0000_lush_hellion.sql +36 -0
  152. package/drizzle/0001_wide_calypso.sql +3 -0
  153. package/drizzle/0002_tidy_juggernaut.sql +1 -0
  154. package/drizzle/0003_lively_naoko.sql +8 -0
  155. package/drizzle/0004_minor_peter_quill.sql +19 -0
  156. package/drizzle/0005_silky_millenium_guard.sql +2 -0
  157. package/drizzle/0006_harsh_caretaker.sql +42 -0
  158. package/drizzle/0007_cloudy_wong.sql +1 -0
  159. package/drizzle/0008_broad_boomer.sql +2 -0
  160. package/drizzle/0009_strong_marten_broadcloak.sql +19 -0
  161. package/drizzle/0010_needy_bishop.sql +11 -0
  162. package/drizzle/0011_moaning_millenium_guard.sql +1 -0
  163. package/drizzle/0012_late_marten_broadcloak.sql +2 -0
  164. package/drizzle/0013_previous_dormammu.sql +9 -0
  165. package/drizzle/0014_lazy_captain_universe.sql +2 -0
  166. package/drizzle/0015_zippy_wallop.sql +29 -0
  167. package/drizzle/0016_jazzy_zemo.sql +2 -0
  168. package/drizzle/0017_reflective_praxagora.sql +4 -0
  169. package/drizzle/0018_fat_vanisher.sql +22 -0
  170. package/drizzle/0019_new_clint_barton.sql +8 -0
  171. package/drizzle/0020_skinny_maverick.sql +1 -0
  172. package/drizzle/0021_mysterious_madelyne_pryor.sql +13 -0
  173. package/drizzle/0022_sleepy_ultimo.sql +25 -0
  174. package/drizzle/0023_wooden_mandrill.sql +2 -0
  175. package/drizzle/AGENTS.md +68 -0
  176. package/drizzle/CLAUDE.md +1 -0
  177. package/drizzle/meta/0000_snapshot.json +221 -0
  178. package/drizzle/meta/0001_snapshot.json +214 -0
  179. package/drizzle/meta/0002_snapshot.json +221 -0
  180. package/drizzle/meta/0005_snapshot.json +369 -0
  181. package/drizzle/meta/0006_snapshot.json +638 -0
  182. package/drizzle/meta/0007_snapshot.json +640 -0
  183. package/drizzle/meta/0008_snapshot.json +649 -0
  184. package/drizzle/meta/0009_snapshot.json +554 -0
  185. package/drizzle/meta/0010_snapshot.json +619 -0
  186. package/drizzle/meta/0011_snapshot.json +627 -0
  187. package/drizzle/meta/0012_snapshot.json +639 -0
  188. package/drizzle/meta/0013_snapshot.json +717 -0
  189. package/drizzle/meta/0014_snapshot.json +717 -0
  190. package/drizzle/meta/0015_snapshot.json +897 -0
  191. package/drizzle/meta/0016_snapshot.json +1031 -0
  192. package/drizzle/meta/0018_snapshot.json +1210 -0
  193. package/drizzle/meta/0019_snapshot.json +1165 -0
  194. package/drizzle/meta/0020_snapshot.json +1232 -0
  195. package/drizzle/meta/0021_snapshot.json +1311 -0
  196. package/drizzle/meta/0022_snapshot.json +1481 -0
  197. package/drizzle/meta/0023_snapshot.json +1496 -0
  198. package/drizzle/meta/_journal.json +174 -0
  199. package/package.json +240 -0
@@ -0,0 +1,363 @@
1
+ import { r as logger } from "./logger-C40ZGil9.js";
2
+ import { a as createEmptyTokenUsage } from "./tokenUsageUtils-NYT-WKS6.js";
3
+ import { t as AwsBedrockGenericProvider } from "./base-C451JQfq.js";
4
+ import { Buffer } from "node:buffer";
5
+ import { Subject, firstValueFrom } from "rxjs";
6
+ import { take } from "rxjs/operators";
7
+ //#region src/providers/bedrock/nova-sonic.ts
8
+ function categorizeError(error) {
9
+ const err = error instanceof Error ? error : new Error(String(error));
10
+ const message = err.message.toLowerCase();
11
+ if (message.includes("econnrefused") || message.includes("enotfound")) return {
12
+ type: "connection",
13
+ message: "Failed to connect to AWS Bedrock. Check your network and AWS configuration.",
14
+ originalError: err
15
+ };
16
+ if (message.includes("timeout") || message.includes("timed out") || message.includes("aborted")) return {
17
+ type: "timeout",
18
+ message: "Request timed out. The operation took too long to complete.",
19
+ originalError: err
20
+ };
21
+ if (message.includes("session") || message.includes("not found")) return {
22
+ type: "session",
23
+ message: "Session error. The bidirectional stream session may have been invalidated.",
24
+ originalError: err
25
+ };
26
+ if (message.includes("json") || message.includes("parse") || message.includes("unexpected")) return {
27
+ type: "parsing",
28
+ message: "Failed to parse response from Bedrock. The response format was unexpected.",
29
+ originalError: err
30
+ };
31
+ if (message.includes("access") || message.includes("credential") || message.includes("auth")) return {
32
+ type: "api",
33
+ message: "AWS authentication error. Check your credentials and permissions.",
34
+ originalError: err
35
+ };
36
+ return {
37
+ type: "unknown",
38
+ message: err.message,
39
+ originalError: err
40
+ };
41
+ }
42
+ const DEFAULT_CONFIG = {
43
+ inference: {
44
+ maxTokens: 1024,
45
+ topP: .9,
46
+ temperature: .7
47
+ },
48
+ audio: {
49
+ input: {
50
+ audioType: "SPEECH",
51
+ encoding: "base64",
52
+ mediaType: "audio/lpcm",
53
+ sampleRateHertz: 8e3,
54
+ sampleSizeBits: 16,
55
+ channelCount: 1
56
+ },
57
+ output: {
58
+ audioType: "SPEECH",
59
+ encoding: "base64",
60
+ mediaType: "audio/lpcm",
61
+ sampleRateHertz: 16e3,
62
+ sampleSizeBits: 16,
63
+ channelCount: 1,
64
+ voiceId: "tiffany"
65
+ }
66
+ },
67
+ text: { mediaType: "text/plain" }
68
+ };
69
+ var NovaSonicProvider = class extends AwsBedrockGenericProvider {
70
+ sessions = /* @__PURE__ */ new Map();
71
+ bedrockClient;
72
+ config;
73
+ constructor(modelName = "amazon.nova-sonic-v1:0", options = {}) {
74
+ super(modelName, options);
75
+ this.config = options.config;
76
+ }
77
+ async getBedrockClient() {
78
+ if (this.bedrockClient) return this.bedrockClient;
79
+ const sessionTimeout = this.config?.sessionTimeout ?? 3e5;
80
+ const requestTimeout = this.config?.requestTimeout ?? 3e5;
81
+ try {
82
+ const { BedrockRuntimeClient } = await import("@aws-sdk/client-bedrock-runtime");
83
+ const { NodeHttp2Handler } = await import("@smithy/node-http-handler");
84
+ this.bedrockClient = new BedrockRuntimeClient({
85
+ region: this.getRegion(),
86
+ requestHandler: new NodeHttp2Handler({
87
+ requestTimeout,
88
+ sessionTimeout,
89
+ disableConcurrentStreams: false,
90
+ maxConcurrentStreams: 20
91
+ })
92
+ });
93
+ return this.bedrockClient;
94
+ } catch (err) {
95
+ const categorized = categorizeError(err);
96
+ logger.error(`Error loading AWS SDK packages: ${categorized.message}`, { error: err });
97
+ throw new Error("The @aws-sdk/client-bedrock-runtime and @smithy/node-http-handler packages are required for Nova Sonic provider. Please install them: npm install @aws-sdk/client-bedrock-runtime @smithy/node-http-handler");
98
+ }
99
+ }
100
+ createSession(sessionId = crypto.randomUUID()) {
101
+ if (this.sessions.has(sessionId)) throw new Error(`Session ${sessionId} already exists`);
102
+ const session = {
103
+ queue: [],
104
+ queueSignal: new Subject(),
105
+ closeSignal: new Subject(),
106
+ responseHandlers: /* @__PURE__ */ new Map(),
107
+ isActive: true,
108
+ audioContentId: crypto.randomUUID(),
109
+ promptName: crypto.randomUUID()
110
+ };
111
+ this.sessions.set(sessionId, session);
112
+ return session;
113
+ }
114
+ async sendEvent(sessionId, event) {
115
+ if (Object.keys(event.event)[0] !== "audioInput") logger.debug("sendEvent: " + Object.keys(event.event)[0]);
116
+ const session = this.sessions.get(sessionId);
117
+ if (!session?.isActive) {
118
+ logger.error(`Session ${sessionId} is not active`);
119
+ return;
120
+ }
121
+ session.queue.push(event);
122
+ session.queueSignal.next();
123
+ }
124
+ async endSession(sessionId) {
125
+ const session = this.sessions.get(sessionId);
126
+ if (!session) throw new Error(`Session ${sessionId} not found`);
127
+ else if (!session.isActive) {
128
+ logger.debug(`Session ${sessionId} is not active`);
129
+ return;
130
+ }
131
+ await new Promise((resolve) => setTimeout(resolve, 1e3));
132
+ await this.sendEvent(sessionId, { event: { promptEnd: { promptName: session.promptName } } });
133
+ await new Promise((resolve) => setTimeout(resolve, 1e3));
134
+ await this.sendEvent(sessionId, { event: { sessionEnd: {} } });
135
+ session.isActive = false;
136
+ logger.debug("Session closed");
137
+ }
138
+ async sendTextMessage(sessionId, role, prompt) {
139
+ const session = this.sessions.get(sessionId);
140
+ if (!session) throw new Error(`Session ${sessionId} not found`);
141
+ const textPromptID = crypto.randomUUID();
142
+ logger.debug("sendTextMessage: " + prompt);
143
+ this.sendEvent(sessionId, { event: { contentStart: {
144
+ promptName: session.promptName,
145
+ contentName: textPromptID,
146
+ type: "TEXT",
147
+ interactive: false,
148
+ role,
149
+ textInputConfiguration: this.config?.textInputConfiguration || DEFAULT_CONFIG.text
150
+ } } });
151
+ this.sendEvent(sessionId, { event: { textInput: {
152
+ promptName: session.promptName,
153
+ contentName: textPromptID,
154
+ content: prompt
155
+ } } });
156
+ this.sendEvent(sessionId, { event: { contentEnd: {
157
+ promptName: session.promptName,
158
+ contentName: textPromptID
159
+ } } });
160
+ }
161
+ async sendSystemPrompt(sessionId, prompt) {
162
+ return this.sendTextMessage(sessionId, "SYSTEM", prompt);
163
+ }
164
+ async sendChatTextHistory(sessionId, role, prompt) {
165
+ return this.sendTextMessage(sessionId, role, prompt);
166
+ }
167
+ async callApi(prompt, context) {
168
+ const sessionId = crypto.randomUUID();
169
+ const session = this.createSession(sessionId);
170
+ let assistantTranscript = "";
171
+ let userTranscript = "";
172
+ let audioContent = "";
173
+ let hasAudioContent = false;
174
+ let functionCallOccurred = false;
175
+ logger.debug("prompt: " + prompt.slice(0, 1e3));
176
+ session.responseHandlers.set("textOutput", (data) => {
177
+ logger.debug("textOutput: " + JSON.stringify(data));
178
+ if (data.role === "USER") userTranscript += data.content + "\n";
179
+ else if (data.role === "ASSISTANT") assistantTranscript += data.content + "\n";
180
+ });
181
+ session.responseHandlers.set("contentEnd", async (data) => {
182
+ logger.debug("contentEnd");
183
+ if (data.stopReason === "END_TURN") await this.endSession(sessionId);
184
+ });
185
+ session.responseHandlers.set("audioOutput", (data) => {
186
+ hasAudioContent = true;
187
+ logger.debug("audioOutput");
188
+ audioContent += data.content;
189
+ });
190
+ session.responseHandlers.set("toolUse", async (data) => {
191
+ logger.debug("toolUse");
192
+ functionCallOccurred = true;
193
+ const result = "Tool result";
194
+ const toolResultId = crypto.randomUUID();
195
+ await this.sendEvent(sessionId, { event: { contentStart: {
196
+ promptName: session.promptName,
197
+ contentName: toolResultId,
198
+ interactive: false,
199
+ type: "TOOL",
200
+ role: "TOOL",
201
+ toolResultInputConfiguration: {
202
+ toolUseId: data.toolUseId,
203
+ type: "TEXT",
204
+ textInputConfiguration: { mediaType: "text/plain" }
205
+ }
206
+ } } });
207
+ await this.sendEvent(sessionId, { event: { toolResult: {
208
+ promptName: session.promptName,
209
+ contentName: toolResultId,
210
+ content: JSON.stringify(result)
211
+ } } });
212
+ await this.sendEvent(sessionId, { event: { contentEnd: {
213
+ promptName: session.promptName,
214
+ contentName: toolResultId
215
+ } } });
216
+ });
217
+ try {
218
+ const bedrockClient = await this.getBedrockClient();
219
+ const { InvokeModelWithBidirectionalStreamCommand } = await import("@aws-sdk/client-bedrock-runtime");
220
+ const request = bedrockClient.send(new InvokeModelWithBidirectionalStreamCommand({
221
+ modelId: this.modelName,
222
+ body: this.createAsyncIterable(sessionId)
223
+ }));
224
+ logger.debug("Sending sessionStart");
225
+ await this.sendEvent(sessionId, { event: { sessionStart: { inferenceConfiguration: this.config?.interfaceConfig || DEFAULT_CONFIG.inference } } });
226
+ logger.debug("Sending promptStart");
227
+ await this.sendEvent(sessionId, { event: { promptStart: {
228
+ promptName: session.promptName,
229
+ textOutputConfiguration: this.config?.textOutputConfiguration || DEFAULT_CONFIG.text,
230
+ audioOutputConfiguration: this.config?.audioOutputConfiguration || DEFAULT_CONFIG.audio.output,
231
+ ...this.config?.toolConfig && { toolConfiguration: this.config?.toolConfig }
232
+ } } });
233
+ logger.debug("Sending system prompt");
234
+ await this.sendSystemPrompt(sessionId, context?.test?.metadata?.systemPrompt || "");
235
+ logger.debug("Processing conversation history");
236
+ let promptText = prompt;
237
+ try {
238
+ const parsedPrompt = JSON.parse(prompt);
239
+ if (Array.isArray(parsedPrompt)) {
240
+ for (const [index, message] of parsedPrompt.entries()) if (message.role !== "system" && index !== parsedPrompt.length - 1) await this.sendTextMessage(sessionId, message.role.toUpperCase(), message.content[0].text);
241
+ promptText = parsedPrompt[parsedPrompt.length - 1].content[0].text;
242
+ }
243
+ } catch (err) {
244
+ logger.error(`Error processing conversation history: ${err}`);
245
+ }
246
+ logger.debug("Sending audioInput start");
247
+ await this.sendEvent(sessionId, { event: { contentStart: {
248
+ promptName: session.promptName,
249
+ contentName: session.audioContentId,
250
+ type: "AUDIO",
251
+ interactive: true,
252
+ role: "USER",
253
+ audioInputConfiguration: this.config?.audioInputConfiguration || DEFAULT_CONFIG.audio.input
254
+ } } });
255
+ logger.debug("Sending audioInput chunks");
256
+ const chunks = promptText?.match(/.{1,1024}/g)?.map((chunk) => Buffer.from(chunk)) || [];
257
+ logger.debug("audioInput in chunks: " + chunks.length);
258
+ for (const chunk of chunks) {
259
+ await this.sendEvent(sessionId, { event: { audioInput: {
260
+ promptName: session.promptName,
261
+ contentName: session.audioContentId,
262
+ content: chunk.toString()
263
+ } } });
264
+ await new Promise((resolve) => setTimeout(resolve, 30));
265
+ }
266
+ logger.debug("Sending audioInput end");
267
+ await this.sendEvent(sessionId, { event: { contentEnd: {
268
+ promptName: session.promptName,
269
+ contentName: session.audioContentId
270
+ } } });
271
+ const response = await request;
272
+ if (response.body) for await (const event of response.body) {
273
+ if (!session.isActive) break;
274
+ if (event.chunk?.bytes) {
275
+ const data = JSON.parse(new TextDecoder().decode(event.chunk.bytes));
276
+ const eventType = Object.keys(data.event || {})[0];
277
+ logger.debug("processing eventType: " + eventType);
278
+ const handler = session.responseHandlers.get(eventType);
279
+ if (handler) await handler(data.event[eventType]);
280
+ }
281
+ }
282
+ const audioConfig = this.config?.audioOutputConfiguration || DEFAULT_CONFIG.audio.output;
283
+ const audioOutput = hasAudioContent && audioContent ? {
284
+ audio: {
285
+ data: this.convertRawToWav(Buffer.from(audioContent, "base64"), audioConfig.sampleRateHertz, audioConfig.sampleSizeBits, audioConfig.channelCount).toString("base64"),
286
+ format: "wav",
287
+ transcript: assistantTranscript
288
+ },
289
+ userTranscript
290
+ } : {};
291
+ return {
292
+ output: assistantTranscript || "[No response received from API]",
293
+ ...audioOutput,
294
+ tokenUsage: createEmptyTokenUsage(),
295
+ cached: false,
296
+ metadata: {
297
+ ...audioOutput,
298
+ functionCallOccurred
299
+ }
300
+ };
301
+ } catch (error) {
302
+ const categorized = categorizeError(error);
303
+ logger.error(`Nova Sonic provider error [${categorized.type}]: ${categorized.message}`, { error });
304
+ return {
305
+ error: categorized.message,
306
+ metadata: { errorType: categorized.type }
307
+ };
308
+ } finally {
309
+ await this.endSession(sessionId);
310
+ this.sessions.delete(sessionId);
311
+ }
312
+ }
313
+ createAsyncIterable(sessionId) {
314
+ const session = this.sessions.get(sessionId);
315
+ if (!session) throw new Error(`Session ${sessionId} not found`);
316
+ return { [Symbol.asyncIterator]: () => ({ async next() {
317
+ if (!session.isActive) return {
318
+ done: true,
319
+ value: void 0
320
+ };
321
+ if (session.queue.length === 0) try {
322
+ await Promise.race([firstValueFrom(session.queueSignal.pipe(take(1))), firstValueFrom(session.closeSignal.pipe(take(1)))]);
323
+ } catch {
324
+ return {
325
+ done: true,
326
+ value: void 0
327
+ };
328
+ }
329
+ const nextEvent = session.queue.shift();
330
+ if (nextEvent) return {
331
+ value: { chunk: { bytes: new TextEncoder().encode(JSON.stringify(nextEvent)) } },
332
+ done: false
333
+ };
334
+ else return {
335
+ done: true,
336
+ value: void 0
337
+ };
338
+ } }) };
339
+ }
340
+ convertRawToWav(audioData, sampleRate = 8e3, bitsPerSample = 16, channels = 1) {
341
+ const dataLength = audioData.length;
342
+ const fileLength = 44 + dataLength;
343
+ const header = Buffer.alloc(44);
344
+ header.write("RIFF", 0);
345
+ header.writeUInt32LE(fileLength - 8, 4);
346
+ header.write("WAVE", 8);
347
+ header.write("fmt ", 12);
348
+ header.writeUInt32LE(16, 16);
349
+ header.writeUInt16LE(1, 20);
350
+ header.writeUInt16LE(channels, 22);
351
+ header.writeUInt32LE(sampleRate, 24);
352
+ header.writeUInt32LE(sampleRate * channels * bitsPerSample / 8, 28);
353
+ header.writeUInt16LE(channels * bitsPerSample / 8, 32);
354
+ header.writeUInt16LE(bitsPerSample, 34);
355
+ header.write("data", 36);
356
+ header.writeUInt32LE(dataLength, 40);
357
+ return Buffer.concat([header, audioData]);
358
+ }
359
+ };
360
+ //#endregion
361
+ export { NovaSonicProvider };
362
+
363
+ //# sourceMappingURL=nova-sonic-BhSwQNym.js.map
@@ -0,0 +1,52 @@
1
+ const require_logger = require("./logger-DyfK9PBt.cjs");
2
+ //#region src/providers/openai/index.ts
3
+ var OpenAiGenericProvider = class {
4
+ modelName;
5
+ config;
6
+ env;
7
+ constructor(modelName, options = {}) {
8
+ const { config, id, env } = options;
9
+ this.env = env;
10
+ this.modelName = modelName;
11
+ this.config = config || {};
12
+ this.id = id ? () => id : this.id;
13
+ }
14
+ id() {
15
+ return this.config.apiHost || this.config.apiBaseUrl ? this.modelName : `openai:${this.modelName}`;
16
+ }
17
+ toString() {
18
+ return `[OpenAI Provider ${this.modelName}]`;
19
+ }
20
+ getOrganization() {
21
+ return this.config.organization || this.env?.OPENAI_ORGANIZATION || require_logger.getEnvString("OPENAI_ORGANIZATION");
22
+ }
23
+ getApiUrlDefault() {
24
+ return "https://api.openai.com/v1";
25
+ }
26
+ getApiUrl() {
27
+ const apiHost = this.config.apiHost || this.env?.OPENAI_API_HOST || require_logger.getEnvString("OPENAI_API_HOST");
28
+ if (apiHost) return `https://${apiHost}/v1`;
29
+ return this.config.apiBaseUrl || this.env?.OPENAI_API_BASE_URL || this.env?.OPENAI_BASE_URL || require_logger.getEnvString("OPENAI_API_BASE_URL") || require_logger.getEnvString("OPENAI_BASE_URL") || this.getApiUrlDefault();
30
+ }
31
+ getApiKey() {
32
+ return this.config.apiKey || (this.config?.apiKeyEnvar ? require_logger.getEnvString(this.config.apiKeyEnvar) || this.env?.[this.config.apiKeyEnvar] : void 0) || this.env?.OPENAI_API_KEY || require_logger.getEnvString("OPENAI_API_KEY");
33
+ }
34
+ requiresApiKey() {
35
+ return this.config.apiKeyRequired ?? true;
36
+ }
37
+ getMissingApiKeyErrorMessage() {
38
+ return `API key is not set. Set the ${this.config.apiKeyEnvar || "OPENAI_API_KEY"} environment variable or add \`apiKey\` to the provider config.`;
39
+ }
40
+ async callApi(_prompt, _context, _callApiOptions) {
41
+ throw new Error("Not implemented");
42
+ }
43
+ };
44
+ //#endregion
45
+ Object.defineProperty(exports, "OpenAiGenericProvider", {
46
+ enumerable: true,
47
+ get: function() {
48
+ return OpenAiGenericProvider;
49
+ }
50
+ });
51
+
52
+ //# sourceMappingURL=openai-BWrJK9d8.cjs.map
@@ -0,0 +1,47 @@
1
+ import { x as getEnvString } from "./logger-C40ZGil9.js";
2
+ //#region src/providers/openai/index.ts
3
+ var OpenAiGenericProvider = class {
4
+ modelName;
5
+ config;
6
+ env;
7
+ constructor(modelName, options = {}) {
8
+ const { config, id, env } = options;
9
+ this.env = env;
10
+ this.modelName = modelName;
11
+ this.config = config || {};
12
+ this.id = id ? () => id : this.id;
13
+ }
14
+ id() {
15
+ return this.config.apiHost || this.config.apiBaseUrl ? this.modelName : `openai:${this.modelName}`;
16
+ }
17
+ toString() {
18
+ return `[OpenAI Provider ${this.modelName}]`;
19
+ }
20
+ getOrganization() {
21
+ return this.config.organization || this.env?.OPENAI_ORGANIZATION || getEnvString("OPENAI_ORGANIZATION");
22
+ }
23
+ getApiUrlDefault() {
24
+ return "https://api.openai.com/v1";
25
+ }
26
+ getApiUrl() {
27
+ const apiHost = this.config.apiHost || this.env?.OPENAI_API_HOST || getEnvString("OPENAI_API_HOST");
28
+ if (apiHost) return `https://${apiHost}/v1`;
29
+ return this.config.apiBaseUrl || this.env?.OPENAI_API_BASE_URL || this.env?.OPENAI_BASE_URL || getEnvString("OPENAI_API_BASE_URL") || getEnvString("OPENAI_BASE_URL") || this.getApiUrlDefault();
30
+ }
31
+ getApiKey() {
32
+ return this.config.apiKey || (this.config?.apiKeyEnvar ? getEnvString(this.config.apiKeyEnvar) || this.env?.[this.config.apiKeyEnvar] : void 0) || this.env?.OPENAI_API_KEY || getEnvString("OPENAI_API_KEY");
33
+ }
34
+ requiresApiKey() {
35
+ return this.config.apiKeyRequired ?? true;
36
+ }
37
+ getMissingApiKeyErrorMessage() {
38
+ return `API key is not set. Set the ${this.config.apiKeyEnvar || "OPENAI_API_KEY"} environment variable or add \`apiKey\` to the provider config.`;
39
+ }
40
+ async callApi(_prompt, _context, _callApiOptions) {
41
+ throw new Error("Not implemented");
42
+ }
43
+ };
44
+ //#endregion
45
+ export { OpenAiGenericProvider as t };
46
+
47
+ //# sourceMappingURL=openai-DumO8WQn.js.map