@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.
- package/LICENSE +19 -0
- package/dist/src/accounts-Bt1oJb1Z.cjs +219 -0
- package/dist/src/accounts-DjOU8Rm3.js +178 -0
- package/dist/src/agentic-utils-D03IiXQc.js +153 -0
- package/dist/src/agentic-utils-Dh7xaMQM.cjs +180 -0
- package/dist/src/agents-C6BIMlZa.js +231 -0
- package/dist/src/agents-DvIpNX1L.cjs +666 -0
- package/dist/src/agents-ZP0RP9vV.cjs +231 -0
- package/dist/src/agents-maJXdjbR.js +665 -0
- package/dist/src/aimlapi-BTbQjG2E.cjs +30 -0
- package/dist/src/aimlapi-CwMxqfXP.js +30 -0
- package/dist/src/audio-BBUdvsde.cjs +97 -0
- package/dist/src/audio-D5DPZ7I-.js +97 -0
- package/dist/src/base-BEysXrkq.cjs +222 -0
- package/dist/src/base-C451JQfq.js +193 -0
- package/dist/src/blobs-BY8MDmpo.js +230 -0
- package/dist/src/blobs-BgcNn97m.cjs +256 -0
- package/dist/src/cache-BBE_lsTA.cjs +4 -0
- package/dist/src/cache-BkrqU5Ba.js +237 -0
- package/dist/src/cache-DsCxFlsZ.cjs +297 -0
- package/dist/src/chat-CPJWDP6a.cjs +289 -0
- package/dist/src/chat-CXX3xzkk.cjs +811 -0
- package/dist/src/chat-CcDgZFJ4.js +787 -0
- package/dist/src/chat-Dz5ZeGO2.js +289 -0
- package/dist/src/chatkit-Dw0mKkML.cjs +1158 -0
- package/dist/src/chatkit-swAIVuea.js +1157 -0
- package/dist/src/chunk-DEq-mXcV.js +15 -0
- package/dist/src/claude-agent-sdk-BXZJtOg6.js +379 -0
- package/dist/src/claude-agent-sdk-CkfyjDoG.cjs +383 -0
- package/dist/src/cloudflare-ai-BzpJcqUH.js +161 -0
- package/dist/src/cloudflare-ai-Cmy_R1y2.cjs +161 -0
- package/dist/src/cloudflare-gateway-B9tVQKok.cjs +272 -0
- package/dist/src/cloudflare-gateway-DrD3ew3H.js +272 -0
- package/dist/src/codex-sdk-Dezj9Nwm.js +1056 -0
- package/dist/src/codex-sdk-Dl9D4k5B.cjs +1060 -0
- package/dist/src/cometapi-C-9YvCHC.js +54 -0
- package/dist/src/cometapi-DHgDKoO2.cjs +54 -0
- package/dist/src/completion-B8Ctyxpr.js +120 -0
- package/dist/src/completion-Cxrt08sj.cjs +131 -0
- package/dist/src/createHash-BwgE13yv.cjs +27 -0
- package/dist/src/createHash-DmPQkvBh.js +15 -0
- package/dist/src/docker-BiqcTwLv.js +80 -0
- package/dist/src/docker-C7tEJnP-.cjs +80 -0
- package/dist/src/esm-C62Zofr1.cjs +409 -0
- package/dist/src/esm-DMVc93eh.js +379 -0
- package/dist/src/evalResult-C3NJPQOo.cjs +301 -0
- package/dist/src/evalResult-C7JJAPBb.js +295 -0
- package/dist/src/evalResult-DoVTZZWI.cjs +2 -0
- package/dist/src/extractor-DnMD3fwt.cjs +391 -0
- package/dist/src/extractor-DtlL28vL.js +374 -0
- package/dist/src/fetch-BTxakTSg.cjs +1133 -0
- package/dist/src/fetch-DQckpUFz.js +928 -0
- package/dist/src/fileExtensions-DnqA1y9x.js +85 -0
- package/dist/src/fileExtensions-bYh77CN8.cjs +114 -0
- package/dist/src/genaiTracer-CyZrmaK0.cjs +268 -0
- package/dist/src/genaiTracer-D3fD9dNV.js +256 -0
- package/dist/src/graders-BNscxFrU.js +13644 -0
- package/dist/src/graders-D2oE9Msq.js +2 -0
- package/dist/src/graders-c0Ez_w-9.cjs +2 -0
- package/dist/src/graders-d0F2M3e9.cjs +14056 -0
- package/dist/src/image-0ZhE0VlR.cjs +280 -0
- package/dist/src/image-CWE1pdNv.js +257 -0
- package/dist/src/image-D9ZK6hwL.js +163 -0
- package/dist/src/image-DKZgZITg.cjs +163 -0
- package/dist/src/index.cjs +11366 -0
- package/dist/src/index.d.cts +19640 -0
- package/dist/src/index.d.ts +19641 -0
- package/dist/src/index.js +11306 -0
- package/dist/src/invariant-Ddh24eXh.js +25 -0
- package/dist/src/invariant-kfQ8Bu82.cjs +30 -0
- package/dist/src/knowledgeBase-BgPyGFUd.cjs +122 -0
- package/dist/src/knowledgeBase-DyHilYaP.js +122 -0
- package/dist/src/litellm-CyMeneHS.js +135 -0
- package/dist/src/litellm-DWDF73yF.cjs +135 -0
- package/dist/src/logger-C40ZGil9.js +717 -0
- package/dist/src/logger-DyfK9PBt.cjs +917 -0
- package/dist/src/luma-ray-BAU9X_ep.cjs +315 -0
- package/dist/src/luma-ray-nwVseBbv.js +313 -0
- package/dist/src/messages-B5ADWTTv.js +245 -0
- package/dist/src/messages-BCnZfqrS.cjs +257 -0
- package/dist/src/meteor-DLZZ3osF.cjs +134 -0
- package/dist/src/meteor-DUiCJRC-.js +134 -0
- package/dist/src/modelslab-00cveB8L.cjs +163 -0
- package/dist/src/modelslab-D9sCU_L7.js +163 -0
- package/dist/src/nova-reel-CTapvqYH.js +276 -0
- package/dist/src/nova-reel-DlWuuroF.cjs +278 -0
- package/dist/src/nova-sonic-5UPWfeMv.cjs +363 -0
- package/dist/src/nova-sonic-BhSwQNym.js +363 -0
- package/dist/src/openai-BWrJK9d8.cjs +52 -0
- package/dist/src/openai-DumO8WQn.js +47 -0
- package/dist/src/openclaw-B8brrjC_.cjs +577 -0
- package/dist/src/openclaw-Bkayww9q.js +571 -0
- package/dist/src/opencode-sdk-7xjoDNiM.cjs +562 -0
- package/dist/src/opencode-sdk-SGwAPxht.js +558 -0
- package/dist/src/otlpReceiver-CoAHfAN9.cjs +15 -0
- package/dist/src/otlpReceiver-oO3EQwI9.js +14 -0
- package/dist/src/providerRegistry-4yjhaEM8.js +45 -0
- package/dist/src/providerRegistry-DhV4rJIc.cjs +50 -0
- package/dist/src/providers-B5RJVG-7.cjs +33609 -0
- package/dist/src/providers-BdmZCLzV.js +33262 -0
- package/dist/src/providers-CxtRxn8e.js +2 -0
- package/dist/src/providers-DnQLNbx1.cjs +3 -0
- package/dist/src/pythonUtils-BD0druiM.cjs +275 -0
- package/dist/src/pythonUtils-IBhn5YGR.js +249 -0
- package/dist/src/quiverai-BDOwZBsM.cjs +213 -0
- package/dist/src/quiverai-D3JTF5lD.js +213 -0
- package/dist/src/responses-B2LCDCXZ.js +667 -0
- package/dist/src/responses-BvNm4Xv9.cjs +685 -0
- package/dist/src/rubyUtils-B0NwnfpY.cjs +245 -0
- package/dist/src/rubyUtils-BroxzZ7c.cjs +2 -0
- package/dist/src/rubyUtils-hqVw5UvJ.js +222 -0
- package/dist/src/sagemaker-Cno2V-Sx.js +689 -0
- package/dist/src/sagemaker-fV_KUgs5.cjs +691 -0
- package/dist/src/server-BOuAXb06.cjs +238 -0
- package/dist/src/server-CtI-EWzm.cjs +2 -0
- package/dist/src/server-Cy3DZymt.js +189 -0
- package/dist/src/slack-CP8xBePa.js +135 -0
- package/dist/src/slack-DSQ1yXVb.cjs +135 -0
- package/dist/src/store-BwDDaBjb.cjs +246 -0
- package/dist/src/store-DcbLC593.cjs +2 -0
- package/dist/src/store-IGpqMIkv.js +240 -0
- package/dist/src/tables-3Q2cL7So.cjs +373 -0
- package/dist/src/tables-Bi2fjr4W.js +288 -0
- package/dist/src/telemetry-Bg2WqF79.js +161 -0
- package/dist/src/telemetry-D0x6u5kX.cjs +166 -0
- package/dist/src/telemetry-DXNimrI0.cjs +2 -0
- package/dist/src/text-B_UCRPp2.js +22 -0
- package/dist/src/text-CW1cyrwj.cjs +33 -0
- package/dist/src/tokenUsageUtils-NYT-WKS6.js +138 -0
- package/dist/src/tokenUsageUtils-bVa1ga6f.cjs +173 -0
- package/dist/src/transcription-Cl_W16Pr.js +122 -0
- package/dist/src/transcription-yt1EecY8.cjs +124 -0
- package/dist/src/transform-BCtGrl_W.cjs +228 -0
- package/dist/src/transform-Bv6gG2MJ.cjs +1688 -0
- package/dist/src/transform-CY1wbpRy.js +1507 -0
- package/dist/src/transform-DU8rUL9P.cjs +2 -0
- package/dist/src/transform-yWaShiKr.js +216 -0
- package/dist/src/transformersAvailability-BGkzavwb.js +35 -0
- package/dist/src/transformersAvailability-DKoRtQLy.cjs +35 -0
- package/dist/src/types-5aqHpBwE.cjs +3769 -0
- package/dist/src/types-Bn6D9c4U.js +3300 -0
- package/dist/src/util-BkKlTkI2.js +293 -0
- package/dist/src/util-CTh0bfOm.cjs +1119 -0
- package/dist/src/util-D17oBwo7.cjs +328 -0
- package/dist/src/util-DsS_-v4p.js +613 -0
- package/dist/src/util-DuntT1Ga.js +951 -0
- package/dist/src/util-aWjdCYMI.cjs +667 -0
- package/dist/src/utils-CisQwpjA.js +94 -0
- package/dist/src/utils-yWamDvmz.cjs +123 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/drizzle/0000_lush_hellion.sql +36 -0
- package/drizzle/0001_wide_calypso.sql +3 -0
- package/drizzle/0002_tidy_juggernaut.sql +1 -0
- package/drizzle/0003_lively_naoko.sql +8 -0
- package/drizzle/0004_minor_peter_quill.sql +19 -0
- package/drizzle/0005_silky_millenium_guard.sql +2 -0
- package/drizzle/0006_harsh_caretaker.sql +42 -0
- package/drizzle/0007_cloudy_wong.sql +1 -0
- package/drizzle/0008_broad_boomer.sql +2 -0
- package/drizzle/0009_strong_marten_broadcloak.sql +19 -0
- package/drizzle/0010_needy_bishop.sql +11 -0
- package/drizzle/0011_moaning_millenium_guard.sql +1 -0
- package/drizzle/0012_late_marten_broadcloak.sql +2 -0
- package/drizzle/0013_previous_dormammu.sql +9 -0
- package/drizzle/0014_lazy_captain_universe.sql +2 -0
- package/drizzle/0015_zippy_wallop.sql +29 -0
- package/drizzle/0016_jazzy_zemo.sql +2 -0
- package/drizzle/0017_reflective_praxagora.sql +4 -0
- package/drizzle/0018_fat_vanisher.sql +22 -0
- package/drizzle/0019_new_clint_barton.sql +8 -0
- package/drizzle/0020_skinny_maverick.sql +1 -0
- package/drizzle/0021_mysterious_madelyne_pryor.sql +13 -0
- package/drizzle/0022_sleepy_ultimo.sql +25 -0
- package/drizzle/0023_wooden_mandrill.sql +2 -0
- package/drizzle/AGENTS.md +68 -0
- package/drizzle/CLAUDE.md +1 -0
- package/drizzle/meta/0000_snapshot.json +221 -0
- package/drizzle/meta/0001_snapshot.json +214 -0
- package/drizzle/meta/0002_snapshot.json +221 -0
- package/drizzle/meta/0005_snapshot.json +369 -0
- package/drizzle/meta/0006_snapshot.json +638 -0
- package/drizzle/meta/0007_snapshot.json +640 -0
- package/drizzle/meta/0008_snapshot.json +649 -0
- package/drizzle/meta/0009_snapshot.json +554 -0
- package/drizzle/meta/0010_snapshot.json +619 -0
- package/drizzle/meta/0011_snapshot.json +627 -0
- package/drizzle/meta/0012_snapshot.json +639 -0
- package/drizzle/meta/0013_snapshot.json +717 -0
- package/drizzle/meta/0014_snapshot.json +717 -0
- package/drizzle/meta/0015_snapshot.json +897 -0
- package/drizzle/meta/0016_snapshot.json +1031 -0
- package/drizzle/meta/0018_snapshot.json +1210 -0
- package/drizzle/meta/0019_snapshot.json +1165 -0
- package/drizzle/meta/0020_snapshot.json +1232 -0
- package/drizzle/meta/0021_snapshot.json +1311 -0
- package/drizzle/meta/0022_snapshot.json +1481 -0
- package/drizzle/meta/0023_snapshot.json +1496 -0
- package/drizzle/meta/_journal.json +174 -0
- package/package.json +240 -0
|
@@ -0,0 +1,363 @@
|
|
|
1
|
+
const require_logger = require("./logger-DyfK9PBt.cjs");
|
|
2
|
+
const require_tokenUsageUtils = require("./tokenUsageUtils-bVa1ga6f.cjs");
|
|
3
|
+
const require_base = require("./base-BEysXrkq.cjs");
|
|
4
|
+
let node_buffer = require("node:buffer");
|
|
5
|
+
let rxjs = require("rxjs");
|
|
6
|
+
let rxjs_operators = require("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 require_base.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
|
+
require_logger.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 rxjs.Subject(),
|
|
105
|
+
closeSignal: new rxjs.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") require_logger.logger.debug("sendEvent: " + Object.keys(event.event)[0]);
|
|
116
|
+
const session = this.sessions.get(sessionId);
|
|
117
|
+
if (!session?.isActive) {
|
|
118
|
+
require_logger.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
|
+
require_logger.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
|
+
require_logger.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
|
+
require_logger.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
|
+
require_logger.logger.debug("prompt: " + prompt.slice(0, 1e3));
|
|
176
|
+
session.responseHandlers.set("textOutput", (data) => {
|
|
177
|
+
require_logger.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
|
+
require_logger.logger.debug("contentEnd");
|
|
183
|
+
if (data.stopReason === "END_TURN") await this.endSession(sessionId);
|
|
184
|
+
});
|
|
185
|
+
session.responseHandlers.set("audioOutput", (data) => {
|
|
186
|
+
hasAudioContent = true;
|
|
187
|
+
require_logger.logger.debug("audioOutput");
|
|
188
|
+
audioContent += data.content;
|
|
189
|
+
});
|
|
190
|
+
session.responseHandlers.set("toolUse", async (data) => {
|
|
191
|
+
require_logger.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
|
+
require_logger.logger.debug("Sending sessionStart");
|
|
225
|
+
await this.sendEvent(sessionId, { event: { sessionStart: { inferenceConfiguration: this.config?.interfaceConfig || DEFAULT_CONFIG.inference } } });
|
|
226
|
+
require_logger.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
|
+
require_logger.logger.debug("Sending system prompt");
|
|
234
|
+
await this.sendSystemPrompt(sessionId, context?.test?.metadata?.systemPrompt || "");
|
|
235
|
+
require_logger.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
|
+
require_logger.logger.error(`Error processing conversation history: ${err}`);
|
|
245
|
+
}
|
|
246
|
+
require_logger.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
|
+
require_logger.logger.debug("Sending audioInput chunks");
|
|
256
|
+
const chunks = promptText?.match(/.{1,1024}/g)?.map((chunk) => node_buffer.Buffer.from(chunk)) || [];
|
|
257
|
+
require_logger.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
|
+
require_logger.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
|
+
require_logger.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(node_buffer.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: require_tokenUsageUtils.createEmptyTokenUsage(),
|
|
295
|
+
cached: false,
|
|
296
|
+
metadata: {
|
|
297
|
+
...audioOutput,
|
|
298
|
+
functionCallOccurred
|
|
299
|
+
}
|
|
300
|
+
};
|
|
301
|
+
} catch (error) {
|
|
302
|
+
const categorized = categorizeError(error);
|
|
303
|
+
require_logger.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([(0, rxjs.firstValueFrom)(session.queueSignal.pipe((0, rxjs_operators.take)(1))), (0, rxjs.firstValueFrom)(session.closeSignal.pipe((0, rxjs_operators.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 = node_buffer.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 node_buffer.Buffer.concat([header, audioData]);
|
|
358
|
+
}
|
|
359
|
+
};
|
|
360
|
+
//#endregion
|
|
361
|
+
exports.NovaSonicProvider = NovaSonicProvider;
|
|
362
|
+
|
|
363
|
+
//# sourceMappingURL=nova-sonic-5UPWfeMv.cjs.map
|