assemblyai 4.30.0 → 4.32.1
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/dist/assemblyai.umd.js +53 -11
- package/dist/assemblyai.umd.min.js +1 -1
- package/dist/browser.mjs +52 -8
- package/dist/bun.mjs +52 -8
- package/dist/deno.mjs +52 -8
- package/dist/index.cjs +53 -11
- package/dist/index.mjs +53 -11
- package/dist/node.cjs +52 -8
- package/dist/node.mjs +52 -8
- package/dist/services/streaming/service.d.ts +2 -1
- package/dist/types/openapi.generated.d.ts +21 -0
- package/dist/types/streaming/index.d.ts +13 -2
- package/dist/utils/errors/streaming.d.ts +5 -0
- package/dist/workerd.mjs +52 -8
- package/package.json +1 -1
- package/src/services/streaming/service.ts +66 -15
- package/src/types/openapi.generated.ts +21 -0
- package/src/types/streaming/index.ts +16 -1
- package/src/utils/errors/streaming.ts +12 -0
package/dist/assemblyai.umd.js
CHANGED
|
@@ -65,7 +65,7 @@
|
|
|
65
65
|
defaultUserAgentString += navigator.userAgent;
|
|
66
66
|
}
|
|
67
67
|
const defaultUserAgent = {
|
|
68
|
-
sdk: { name: "JavaScript", version: "4.
|
|
68
|
+
sdk: { name: "JavaScript", version: "4.32.1" },
|
|
69
69
|
};
|
|
70
70
|
if (typeof process !== "undefined") {
|
|
71
71
|
if (process.versions.node && defaultUserAgentString.indexOf("Node") === -1) {
|
|
@@ -288,8 +288,18 @@
|
|
|
288
288
|
BadSchema: 4101,
|
|
289
289
|
TooManyStreams: 4102,
|
|
290
290
|
Reconnected: 4103,
|
|
291
|
+
ServerError: 3005,
|
|
292
|
+
InputValidationError: 3006,
|
|
293
|
+
AudioChunkDurationViolation: 3007,
|
|
294
|
+
MaxSessionDurationExceeded: 3008,
|
|
295
|
+
ConcurrencyLimitExceeded: 3009,
|
|
291
296
|
};
|
|
292
297
|
const StreamingErrorMessages = {
|
|
298
|
+
[StreamingErrorType.ServerError]: "Server error",
|
|
299
|
+
[StreamingErrorType.InputValidationError]: "Input validation error",
|
|
300
|
+
[StreamingErrorType.AudioChunkDurationViolation]: "Audio chunk duration violation",
|
|
301
|
+
[StreamingErrorType.MaxSessionDurationExceeded]: "Session expired: maximum session duration exceeded",
|
|
302
|
+
[StreamingErrorType.ConcurrencyLimitExceeded]: "Too many concurrent sessions",
|
|
293
303
|
[StreamingErrorType.BadSampleRate]: "Sample rate must be a positive integer",
|
|
294
304
|
[StreamingErrorType.AuthFailed]: "Not Authorized",
|
|
295
305
|
[StreamingErrorType.InsufficientFunds]: "Insufficient funds",
|
|
@@ -893,7 +903,7 @@ Learn more at https://github.com/AssemblyAI/assemblyai-node-sdk/blob/main/docs/c
|
|
|
893
903
|
}
|
|
894
904
|
}
|
|
895
905
|
connectionUrl() {
|
|
896
|
-
var _a;
|
|
906
|
+
var _a, _b;
|
|
897
907
|
const url = new URL((_a = this.params.websocketBaseUrl) !== null && _a !== void 0 ? _a : "");
|
|
898
908
|
if (url.protocol !== "wss:") {
|
|
899
909
|
throw new Error("Invalid protocol, must be wss");
|
|
@@ -906,12 +916,17 @@ Learn more at https://github.com/AssemblyAI/assemblyai-node-sdk/blob/main/docs/c
|
|
|
906
916
|
if (this.params.endOfTurnConfidenceThreshold) {
|
|
907
917
|
searchParams.set("end_of_turn_confidence_threshold", this.params.endOfTurnConfidenceThreshold.toString());
|
|
908
918
|
}
|
|
909
|
-
if (this.params.
|
|
910
|
-
|
|
919
|
+
if (this.params.minEndOfTurnSilenceWhenConfident !== undefined) {
|
|
920
|
+
if (this.params.minTurnSilence !== undefined) {
|
|
921
|
+
console.warn("[Deprecation Warning] Both `minEndOfTurnSilenceWhenConfident` and `minTurnSilence` are set. Using `minTurnSilence`; `minEndOfTurnSilenceWhenConfident` is deprecated.");
|
|
922
|
+
}
|
|
923
|
+
else {
|
|
924
|
+
console.warn("[Deprecation Warning] `minEndOfTurnSilenceWhenConfident` is deprecated and will be removed in a future release. Please use `minTurnSilence` instead.");
|
|
925
|
+
}
|
|
911
926
|
}
|
|
912
|
-
|
|
913
|
-
|
|
914
|
-
searchParams.set("
|
|
927
|
+
const effectiveMinTurnSilence = (_b = this.params.minTurnSilence) !== null && _b !== void 0 ? _b : this.params.minEndOfTurnSilenceWhenConfident;
|
|
928
|
+
if (effectiveMinTurnSilence !== undefined) {
|
|
929
|
+
searchParams.set("min_turn_silence", effectiveMinTurnSilence.toString());
|
|
915
930
|
}
|
|
916
931
|
if (this.params.maxTurnSilence) {
|
|
917
932
|
searchParams.set("max_turn_silence", this.params.maxTurnSilence.toString());
|
|
@@ -957,6 +972,12 @@ Learn more at https://github.com/AssemblyAI/assemblyai-node-sdk/blob/main/docs/c
|
|
|
957
972
|
if (this.params.maxSpeakers !== undefined) {
|
|
958
973
|
searchParams.set("max_speakers", this.params.maxSpeakers.toString());
|
|
959
974
|
}
|
|
975
|
+
if (this.params.noiseSuppressionModel) {
|
|
976
|
+
searchParams.set("noise_suppression_model", this.params.noiseSuppressionModel);
|
|
977
|
+
}
|
|
978
|
+
if (this.params.noiseSuppressionThreshold !== undefined) {
|
|
979
|
+
searchParams.set("noise_suppression_threshold", this.params.noiseSuppressionThreshold.toString());
|
|
980
|
+
}
|
|
960
981
|
if (this.params.llmGateway !== undefined) {
|
|
961
982
|
searchParams.set("llm_gateway", JSON.stringify(this.params.llmGateway));
|
|
962
983
|
}
|
|
@@ -1004,10 +1025,15 @@ Learn more at https://github.com/AssemblyAI/assemblyai-node-sdk/blob/main/docs/c
|
|
|
1004
1025
|
(_d = (_c = this.listeners).error) === null || _d === void 0 ? void 0 : _d.call(_c, new Error(event.message));
|
|
1005
1026
|
};
|
|
1006
1027
|
this.socket.onmessage = ({ data }) => {
|
|
1007
|
-
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l;
|
|
1028
|
+
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o;
|
|
1008
1029
|
const message = JSON.parse(data.toString());
|
|
1009
1030
|
if ("error" in message) {
|
|
1010
|
-
|
|
1031
|
+
const err = new StreamingError(message.error);
|
|
1032
|
+
if ("error_code" in message) {
|
|
1033
|
+
err.code =
|
|
1034
|
+
message.error_code;
|
|
1035
|
+
}
|
|
1036
|
+
(_b = (_a = this.listeners).error) === null || _b === void 0 ? void 0 : _b.call(_a, err);
|
|
1011
1037
|
return;
|
|
1012
1038
|
}
|
|
1013
1039
|
switch (message.type) {
|
|
@@ -1028,8 +1054,14 @@ Learn more at https://github.com/AssemblyAI/assemblyai-node-sdk/blob/main/docs/c
|
|
|
1028
1054
|
(_k = (_j = this.listeners).llmGatewayResponse) === null || _k === void 0 ? void 0 : _k.call(_j, message);
|
|
1029
1055
|
break;
|
|
1030
1056
|
}
|
|
1057
|
+
case "Warning": {
|
|
1058
|
+
const warning = message;
|
|
1059
|
+
console.warn(`Streaming warning (code=${warning.warning_code}): ${warning.warning}`);
|
|
1060
|
+
(_m = (_l = this.listeners).warning) === null || _m === void 0 ? void 0 : _m.call(_l, warning);
|
|
1061
|
+
break;
|
|
1062
|
+
}
|
|
1031
1063
|
case "Termination": {
|
|
1032
|
-
(
|
|
1064
|
+
(_o = this.sessionTerminatedResolve) === null || _o === void 0 ? void 0 : _o.call(this);
|
|
1033
1065
|
break;
|
|
1034
1066
|
}
|
|
1035
1067
|
}
|
|
@@ -1051,7 +1083,17 @@ Learn more at https://github.com/AssemblyAI/assemblyai-node-sdk/blob/main/docs/c
|
|
|
1051
1083
|
* @param config - The configuration parameters to update
|
|
1052
1084
|
*/
|
|
1053
1085
|
updateConfiguration(config) {
|
|
1054
|
-
const
|
|
1086
|
+
const { min_end_of_turn_silence_when_confident, min_turn_silence } = config, rest = __rest(config, ["min_end_of_turn_silence_when_confident", "min_turn_silence"]);
|
|
1087
|
+
if (min_end_of_turn_silence_when_confident !== undefined) {
|
|
1088
|
+
if (min_turn_silence !== undefined) {
|
|
1089
|
+
console.warn("[Deprecation Warning] Both `min_end_of_turn_silence_when_confident` and `min_turn_silence` are set. Using `min_turn_silence`; `min_end_of_turn_silence_when_confident` is deprecated.");
|
|
1090
|
+
}
|
|
1091
|
+
else {
|
|
1092
|
+
console.warn("[Deprecation Warning] `min_end_of_turn_silence_when_confident` is deprecated and will be removed in a future release. Please use `min_turn_silence` instead.");
|
|
1093
|
+
}
|
|
1094
|
+
}
|
|
1095
|
+
const effective = min_turn_silence !== null && min_turn_silence !== void 0 ? min_turn_silence : min_end_of_turn_silence_when_confident;
|
|
1096
|
+
const message = Object.assign(Object.assign({ type: "UpdateConfiguration" }, rest), (effective !== undefined ? { min_turn_silence: effective } : {}));
|
|
1055
1097
|
this.send(JSON.stringify(message));
|
|
1056
1098
|
}
|
|
1057
1099
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).assemblyai={})}(this,(function(e){"use strict";function t(e,t,s,i){return new(s||(s=Promise))((function(n,r){function o(e){try{l(i.next(e))}catch(e){r(e)}}function a(e){try{l(i.throw(e))}catch(e){r(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(o,a)}l((i=i.apply(e,t||[])).next())}))}"function"==typeof SuppressedError&&SuppressedError;const s={cache:"no-store"};let i="";"undefined"!=typeof navigator&&navigator.userAgent&&(i+=navigator.userAgent);const n={sdk:{name:"JavaScript",version:"4.30.0"}};"undefined"!=typeof process&&(process.versions.node&&-1===i.indexOf("Node")&&(n.runtime_env={name:"Node",version:process.versions.node}),process.versions.bun&&-1===i.indexOf("Bun")&&(n.runtime_env={name:"Bun",version:process.versions.bun})),"undefined"!=typeof Deno&&process.versions.bun&&-1===i.indexOf("Deno")&&(n.runtime_env={name:"Deno",version:Deno.version.deno});class r{constructor(e){var t;this.params=e,!1===e.userAgent?this.userAgent=void 0:this.userAgent=(t=e.userAgent||{},i+(!1===t?"":" AssemblyAI/1.0 ("+Object.entries(Object.assign(Object.assign({},n),t)).map((([e,t])=>t?`${e}=${t.name}/${t.version}`:"")).join(" ")+")"))}fetch(e,i){return t(this,void 0,void 0,(function*(){i=Object.assign(Object.assign({},s),i);let t={Authorization:this.params.apiKey,"Content-Type":"application/json"};(null==s?void 0:s.headers)&&(t=Object.assign(Object.assign({},t),s.headers)),(null==i?void 0:i.headers)&&(t=Object.assign(Object.assign({},t),i.headers)),this.userAgent&&(t["User-Agent"]=this.userAgent,"undefined"!=typeof window&&"chrome"in window&&(t["AssemblyAI-Agent"]=this.userAgent)),i.headers=t,e.startsWith("http")||(e=this.params.baseUrl+e);const n=yield fetch(e,i);if(n.status>=400){let e;const t=yield n.text();if(t){try{e=JSON.parse(t)}catch(e){}if(null==e?void 0:e.error)throw new Error(e.error);throw new Error(t)}throw new Error(`HTTP Error: ${n.status} ${n.statusText}`)}return n}))}fetchJson(e,s){return t(this,void 0,void 0,(function*(){return(yield this.fetch(e,s)).json()}))}}class o extends r{summary(e,t){return this.fetchJson("/lemur/v3/generate/summary",{method:"POST",body:JSON.stringify(e),signal:t})}questionAnswer(e,t){return this.fetchJson("/lemur/v3/generate/question-answer",{method:"POST",body:JSON.stringify(e),signal:t})}actionItems(e,t){return this.fetchJson("/lemur/v3/generate/action-items",{method:"POST",body:JSON.stringify(e),signal:t})}task(e,t){return this.fetchJson("/lemur/v3/generate/task",{method:"POST",body:JSON.stringify(e),signal:t})}getResponse(e,t){return this.fetchJson(`/lemur/v3/${e}`,{signal:t})}purgeRequestData(e,t){return this.fetchJson(`/lemur/v3/${e}`,{method:"DELETE",signal:t})}}const{WritableStream:a}="undefined"!=typeof window?window:"undefined"!=typeof global?global:globalThis;var l,c;const d=null!==(c=null!==(l=null!==WebSocket&&void 0!==WebSocket?WebSocket:null===global||void 0===global?void 0:global.WebSocket)&&void 0!==l?l:null===window||void 0===window?void 0:window.WebSocket)&&void 0!==c?c:null===self||void 0===self?void 0:self.WebSocket,h=(e,t)=>t?new d(e,t):new d(e),u={[4e3]:"Sample rate must be a positive integer",[4001]:"Not Authorized",[4002]:"Insufficient funds",[4003]:"This feature is paid-only and requires you to add a credit card. Please visit https://app.assemblyai.com/ to add a credit card to your account.",[4004]:"Session ID does not exist",[4008]:"Session has expired",[4010]:"Session is closed",[4029]:"Rate limited",[4030]:"Unique session violation",[4031]:"Session Timeout",[4032]:"Audio too short",[4033]:"Audio too long",[4034]:"Audio too small to transcode",[4100]:"Bad JSON",[4101]:"Bad schema",[4102]:"Too many streams",[4103]:"This session has been reconnected. This WebSocket is no longer valid.",[1013]:"Reconnect attempts exhausted",[4104]:"Could not parse word boost parameter"};class p extends Error{}const m={[4e3]:"Sample rate must be a positive integer",[4001]:"Not Authorized",[4002]:"Insufficient funds",[4003]:"This feature is paid-only and requires you to add a credit card. Please visit https://app.assemblyai.com/ to add a credit card to your account.",[4004]:"Session ID does not exist",[4008]:"Session has expired",[4010]:"Session is closed",[4029]:"Rate limited",[4030]:"Unique session violation",[4031]:"Session Timeout",[4032]:"Audio too short",[4033]:"Audio too long",[4034]:"Audio too small to transcode",[4101]:"Bad schema",[4102]:"Too many streams",[4103]:"This session has been reconnected. This WebSocket is no longer valid."};class f extends Error{}const v='{"terminate_session":true}';class y{constructor(e){var t,s;if(this.listeners={},this.realtimeUrl=null!==(t=e.realtimeUrl)&&void 0!==t?t:"wss://api.assemblyai.com/v2/realtime/ws",this.sampleRate=null!==(s=e.sampleRate)&&void 0!==s?s:16e3,this.wordBoost=e.wordBoost,this.encoding=e.encoding,this.endUtteranceSilenceThreshold=e.endUtteranceSilenceThreshold,this.disablePartialTranscripts=e.disablePartialTranscripts,"token"in e&&e.token&&(this.token=e.token),"apiKey"in e&&e.apiKey&&(this.apiKey=e.apiKey),!this.token&&!this.apiKey)throw new Error("API key or temporary token is required.")}connectionUrl(){const e=new URL(this.realtimeUrl);if("wss:"!==e.protocol)throw new Error("Invalid protocol, must be wss");const t=new URLSearchParams;return this.token&&t.set("token",this.token),t.set("sample_rate",this.sampleRate.toString()),this.wordBoost&&this.wordBoost.length>0&&t.set("word_boost",JSON.stringify(this.wordBoost)),this.encoding&&t.set("encoding",this.encoding),t.set("enable_extra_session_information","true"),this.disablePartialTranscripts&&t.set("disable_partial_transcripts",this.disablePartialTranscripts.toString()),e.search=t.toString(),e}on(e,t){this.listeners[e]=t}connect(){return new Promise((e=>{if(this.socket)throw new Error("Already connected");const t=this.connectionUrl();this.token?this.socket=h(t.toString()):(console.warn("API key authentication is not supported for the RealtimeTranscriber in browser environment. Use temporary token authentication instead.\nLearn more at https://github.com/AssemblyAI/assemblyai-node-sdk/blob/main/docs/compat.md#browser-compatibility."),this.socket=h(t.toString(),{headers:{Authorization:this.apiKey}})),this.socket.binaryType="arraybuffer",this.socket.onopen=()=>{void 0!==this.endUtteranceSilenceThreshold&&null!==this.endUtteranceSilenceThreshold&&this.configureEndUtteranceSilenceThreshold(this.endUtteranceSilenceThreshold)},this.socket.onclose=({code:e,reason:t})=>{var s,i;t||e in u&&(t=u[e]),null===(i=(s=this.listeners).close)||void 0===i||i.call(s,e,t)},this.socket.onerror=e=>{var t,s,i,n;e.error?null===(s=(t=this.listeners).error)||void 0===s||s.call(t,e.error):null===(n=(i=this.listeners).error)||void 0===n||n.call(i,new Error(e.message))},this.socket.onmessage=({data:t})=>{var s,i,n,r,o,a,l,c,d,h,u,m,f,v,y;const g=JSON.parse(t.toString());if("error"in g)null===(i=(s=this.listeners).error)||void 0===i||i.call(s,new p(g.error));else switch(g.message_type){case"SessionBegins":{const t={sessionId:g.session_id,expiresAt:new Date(g.expires_at)};e(t),null===(r=(n=this.listeners).open)||void 0===r||r.call(n,t);break}case"PartialTranscript":g.created=new Date(g.created),null===(a=(o=this.listeners).transcript)||void 0===a||a.call(o,g),null===(c=(l=this.listeners)["transcript.partial"])||void 0===c||c.call(l,g);break;case"FinalTranscript":g.created=new Date(g.created),null===(h=(d=this.listeners).transcript)||void 0===h||h.call(d,g),null===(m=(u=this.listeners)["transcript.final"])||void 0===m||m.call(u,g);break;case"SessionInformation":null===(v=(f=this.listeners).session_information)||void 0===v||v.call(f,g);break;case"SessionTerminated":null===(y=this.sessionTerminatedResolve)||void 0===y||y.call(this)}}}))}sendAudio(e){this.send(e)}stream(){return new a({write:e=>{this.sendAudio(e)}})}forceEndUtterance(){this.send('{"force_end_utterance":true}')}configureEndUtteranceSilenceThreshold(e){this.send(`{"end_utterance_silence_threshold":${e}}`)}send(e){if(!this.socket||this.socket.readyState!==this.socket.OPEN)throw new Error("Socket is not open for communication");this.socket.send(e)}close(){return t(this,arguments,void 0,(function*(e=!0){var t;if(this.socket){if(this.socket.readyState===this.socket.OPEN)if(e){const e=new Promise((e=>{this.sessionTerminatedResolve=e}));this.socket.send(v),yield e}else this.socket.send(v);(null===(t=this.socket)||void 0===t?void 0:t.removeAllListeners)&&this.socket.removeAllListeners(),this.socket.close()}this.listeners={},this.socket=void 0}))}}class g extends r{constructor(e){super(e),this.rtFactoryParams=e}createService(e){return this.transcriber(e)}transcriber(e){const t=Object.assign({},e);return t.token||t.apiKey||(t.apiKey=this.rtFactoryParams.apiKey),new y(t)}createTemporaryToken(e){return t(this,void 0,void 0,(function*(){return(yield this.fetchJson("/v2/realtime/token",{method:"POST",body:JSON.stringify(e)})).token}))}}function b(e){return e.startsWith("http")||e.startsWith("https")||e.startsWith("data:")?null:e.startsWith("file://")?e.substring(7):e.startsWith("file:")?e.substring(5):e}class w extends r{constructor(e,t){super(e),this.files=t}transcribe(e,s){return t(this,void 0,void 0,(function*(){const t=yield this.submit(e);return yield this.waitUntilReady(t.id,s)}))}submit(e){return t(this,void 0,void 0,(function*(){let t,s;if("audio"in e){const{audio:i}=e,n=function(e,t){var s={};for(var i in e)Object.prototype.hasOwnProperty.call(e,i)&&t.indexOf(i)<0&&(s[i]=e[i]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var n=0;for(i=Object.getOwnPropertySymbols(e);n<i.length;n++)t.indexOf(i[n])<0&&Object.prototype.propertyIsEnumerable.call(e,i[n])&&(s[i[n]]=e[i[n]])}return s}(e,["audio"]);if("string"==typeof i){const e=b(i);t=null!==e?yield this.files.upload(e):i.startsWith("data:")?yield this.files.upload(i):i}else t=yield this.files.upload(i);s=Object.assign(Object.assign({},n),{audio_url:t})}else s=e;return yield this.fetchJson("/v2/transcript",{method:"POST",body:JSON.stringify(s)})}))}create(e,s){return t(this,void 0,void 0,(function*(){var t;const i=b(e.audio_url);if(null!==i){const t=yield this.files.upload(i);e.audio_url=t}const n=yield this.fetchJson("/v2/transcript",{method:"POST",body:JSON.stringify(e)});return null===(t=null==s?void 0:s.poll)||void 0===t||t?yield this.waitUntilReady(n.id,s):n}))}waitUntilReady(e,s){return t(this,void 0,void 0,(function*(){var t,i;const n=null!==(t=null==s?void 0:s.pollingInterval)&&void 0!==t?t:3e3,r=null!==(i=null==s?void 0:s.pollingTimeout)&&void 0!==i?i:-1,o=Date.now();for(;;){const t=yield this.get(e);if("completed"===t.status||"error"===t.status)return t;if(r>0&&Date.now()-o>r)throw new Error("Polling timeout");yield new Promise((e=>setTimeout(e,n)))}}))}get(e){return this.fetchJson(`/v2/transcript/${e}`)}list(e){return t(this,void 0,void 0,(function*(){let t="/v2/transcript";"string"==typeof e?t=e:e&&(t=`${t}?${new URLSearchParams(Object.keys(e).map((t=>{var s;return[t,(null===(s=e[t])||void 0===s?void 0:s.toString())||""]})))}`);const s=yield this.fetchJson(t);for(const e of s.transcripts)e.created=new Date(e.created),e.completed&&(e.completed=new Date(e.completed));return s}))}delete(e){return this.fetchJson(`/v2/transcript/${e}`,{method:"DELETE"})}wordSearch(e,t){const s=new URLSearchParams({words:t.join(",")});return this.fetchJson(`/v2/transcript/${e}/word-search?${s.toString()}`)}sentences(e){return this.fetchJson(`/v2/transcript/${e}/sentences`)}paragraphs(e){return this.fetchJson(`/v2/transcript/${e}/paragraphs`)}subtitles(e){return t(this,arguments,void 0,(function*(e,t="srt",s){let i=`/v2/transcript/${e}/${t}`;if(s){const e=new URLSearchParams;e.set("chars_per_caption",s.toString()),i+=`?${e.toString()}`}const n=yield this.fetch(i);return yield n.text()}))}redactions(e){return this.redactedAudio(e)}redactedAudio(e){return this.fetchJson(`/v2/transcript/${e}/redacted-audio`)}redactedAudioFile(e){return t(this,void 0,void 0,(function*(){const{redacted_audio_url:t,status:s}=yield this.redactedAudio(e);if("redacted_audio_ready"!==s)throw new Error(`Redacted audio status is ${s}`);const i=yield fetch(t);if(!i.ok)throw new Error(`Failed to fetch redacted audio: ${i.statusText}`);return{arrayBuffer:i.arrayBuffer.bind(i),blob:i.blob.bind(i),body:i.body,bodyUsed:i.bodyUsed}}))}}class S extends r{upload(e){return t(this,void 0,void 0,(function*(){let s;s="string"==typeof e?e.startsWith("data:")?function(e){const t=e.split(","),s=t[0].match(/:(.*?);/)[1],i=atob(t[1]);let n=i.length;const r=new Uint8Array(n);for(;n--;)r[n]=i.charCodeAt(n);return new Blob([r],{type:s})}(e):yield function(e){return t(this,void 0,void 0,(function*(){throw new Error("Interacting with the file system is not supported in this environment.")}))}():e;return(yield this.fetchJson("/v2/upload",{method:"POST",body:s,headers:{"Content-Type":"application/octet-stream"},duplex:"half"})).upload_url}))}}const k='{"type":"Terminate"}';class T{constructor(e){if(this.listeners={},this.params=Object.assign(Object.assign({},e),{websocketBaseUrl:e.websocketBaseUrl||"wss://streaming.assemblyai.com/v3/ws"}),"token"in e&&e.token&&(this.token=e.token),"apiKey"in e&&e.apiKey&&(this.apiKey=e.apiKey),!this.token&&!this.apiKey)throw new Error("API key or temporary token is required.")}connectionUrl(){var e;const t=new URL(null!==(e=this.params.websocketBaseUrl)&&void 0!==e?e:"");if("wss:"!==t.protocol)throw new Error("Invalid protocol, must be wss");const s=new URLSearchParams;return this.token&&s.set("token",this.token),s.set("sample_rate",this.params.sampleRate.toString()),this.params.endOfTurnConfidenceThreshold&&s.set("end_of_turn_confidence_threshold",this.params.endOfTurnConfidenceThreshold.toString()),this.params.minTurnSilence?s.set("min_turn_silence",this.params.minTurnSilence.toString()):this.params.minEndOfTurnSilenceWhenConfident&&(console.warn("[Deprecation Warning] `minEndOfTurnSilenceWhenConfident` is deprecated and will be removed in a future release. Please use `minTurnSilence` instead."),s.set("min_end_of_turn_silence_when_confident",this.params.minEndOfTurnSilenceWhenConfident.toString())),this.params.maxTurnSilence&&s.set("max_turn_silence",this.params.maxTurnSilence.toString()),void 0!==this.params.vadThreshold&&s.set("vad_threshold",this.params.vadThreshold.toString()),this.params.formatTurns&&s.set("format_turns",this.params.formatTurns.toString()),this.params.encoding&&s.set("encoding",this.params.encoding.toString()),this.params.keytermsPrompt?s.set("keyterms_prompt",JSON.stringify(this.params.keytermsPrompt)):this.params.keyterms&&(console.warn("[Deprecation Warning] `keyterms` is deprecated and will be removed in a future release. Please use `keytermsPrompt` instead."),s.set("keyterms_prompt",JSON.stringify(this.params.keyterms))),this.params.prompt&&s.set("prompt",this.params.prompt),this.params.filterProfanity&&s.set("filter_profanity",this.params.filterProfanity.toString()),"u3-pro"===this.params.speechModel&&console.warn("[Deprecation Warning] The speech model `u3-pro` is deprecated and will be removed in a future release. Please use `u3-rt-pro` instead."),s.set("speech_model",this.params.speechModel.toString()),void 0!==this.params.languageDetection&&s.set("language_detection",this.params.languageDetection.toString()),this.params.domain&&s.set("domain",this.params.domain),void 0!==this.params.inactivityTimeout&&s.set("inactivity_timeout",this.params.inactivityTimeout.toString()),void 0!==this.params.speakerLabels&&s.set("speaker_labels",this.params.speakerLabels.toString()),void 0!==this.params.maxSpeakers&&s.set("max_speakers",this.params.maxSpeakers.toString()),void 0!==this.params.llmGateway&&s.set("llm_gateway",JSON.stringify(this.params.llmGateway)),t.search=s.toString(),t}on(e,t){this.listeners[e]=t}connect(){return new Promise((e=>{if(this.socket)throw new Error("Already connected");const t=this.connectionUrl();this.token?this.socket=h(t.toString()):(console.warn("API key authentication is not supported for the StreamingTranscriber in browser environment. Use temporary token authentication instead.\nLearn more at https://github.com/AssemblyAI/assemblyai-node-sdk/blob/main/docs/compat.md#browser-compatibility."),this.socket=h(t.toString(),{headers:{Authorization:this.apiKey}})),this.socket.binaryType="arraybuffer",this.socket.onopen=()=>{},this.socket.onclose=({code:e,reason:t})=>{var s,i;t||e in m&&(t=m[e]),null===(i=(s=this.listeners).close)||void 0===i||i.call(s,e,t)},this.socket.onerror=e=>{var t,s,i,n;e.error?null===(s=(t=this.listeners).error)||void 0===s||s.call(t,e.error):null===(n=(i=this.listeners).error)||void 0===n||n.call(i,new Error(e.message))},this.socket.onmessage=({data:t})=>{var s,i,n,r,o,a,l,c,d,h,u;const p=JSON.parse(t.toString());if("error"in p)null===(i=(s=this.listeners).error)||void 0===i||i.call(s,new f(p.error));else switch(p.type){case"Begin":e(p),null===(r=(n=this.listeners).open)||void 0===r||r.call(n,p);break;case"Turn":null===(a=(o=this.listeners).turn)||void 0===a||a.call(o,p);break;case"SpeechStarted":null===(c=(l=this.listeners).speechStarted)||void 0===c||c.call(l,p);break;case"LLMGatewayResponse":null===(h=(d=this.listeners).llmGatewayResponse)||void 0===h||h.call(d,p);break;case"Termination":null===(u=this.sessionTerminatedResolve)||void 0===u||u.call(this)}}}))}stream(){return new a({write:e=>{this.sendAudio(e)}})}sendAudio(e){this.send(e)}updateConfiguration(e){const t=Object.assign({type:"UpdateConfiguration"},e);this.send(JSON.stringify(t))}forceEndpoint(){this.send(JSON.stringify({type:"ForceEndpoint"}))}send(e){if(!this.socket||this.socket.readyState!==this.socket.OPEN)throw new Error("Socket is not open for communication");this.socket.send(e)}close(){return t(this,arguments,void 0,(function*(e=!0){var t;if(this.socket){if(this.socket.readyState===this.socket.OPEN)if(e){const e=new Promise((e=>{this.sessionTerminatedResolve=e}));this.socket.send(k),yield e}else this.socket.send(k);(null===(t=this.socket)||void 0===t?void 0:t.removeAllListeners)&&this.socket.removeAllListeners(),this.socket.close()}this.listeners={},this.socket=void 0}))}}class O extends r{constructor(e){super(e),this.baseServiceParams=e}transcriber(e){const t=Object.assign({},e);return t.token||t.apiKey||(t.apiKey=this.baseServiceParams.apiKey),new T(t)}createTemporaryToken(e){return t(this,void 0,void 0,(function*(){const t=new URLSearchParams;Object.entries(e).forEach((([e,s])=>{null!=s&&t.append(e,String(s))}));const s=t.toString(),i=s?`/v3/token?${s}`:"/v3/token";return(yield this.fetchJson(i,{method:"GET"})).token}))}}e.AssemblyAI=class{constructor(e){e.baseUrl=e.baseUrl||"https://api.assemblyai.com",e.baseUrl&&e.baseUrl.endsWith("/")&&(e.baseUrl=e.baseUrl.slice(0,-1)),this.files=new S(e),this.transcripts=new w(e,this.files),this.lemur=new o(e),this.realtime=new g(e),this.streaming=new O(Object.assign(Object.assign({},e),{baseUrl:e.streamingBaseUrl||"https://streaming.assemblyai.com"}))}},e.FileService=S,e.LemurService=o,e.RealtimeService=class extends y{},e.RealtimeServiceFactory=class extends g{},e.RealtimeTranscriber=y,e.RealtimeTranscriberFactory=g,e.StreamingTranscriber=T,e.TranscriptService=w}));
|
|
1
|
+
!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).assemblyai={})}(this,(function(e){"use strict";function t(e,t){var s={};for(var i in e)Object.prototype.hasOwnProperty.call(e,i)&&t.indexOf(i)<0&&(s[i]=e[i]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var n=0;for(i=Object.getOwnPropertySymbols(e);n<i.length;n++)t.indexOf(i[n])<0&&Object.prototype.propertyIsEnumerable.call(e,i[n])&&(s[i[n]]=e[i[n]])}return s}function s(e,t,s,i){return new(s||(s=Promise))((function(n,r){function o(e){try{c(i.next(e))}catch(e){r(e)}}function a(e){try{c(i.throw(e))}catch(e){r(e)}}function c(e){var t;e.done?n(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(o,a)}c((i=i.apply(e,t||[])).next())}))}"function"==typeof SuppressedError&&SuppressedError;const i={cache:"no-store"};let n="";"undefined"!=typeof navigator&&navigator.userAgent&&(n+=navigator.userAgent);const r={sdk:{name:"JavaScript",version:"4.32.1"}};"undefined"!=typeof process&&(process.versions.node&&-1===n.indexOf("Node")&&(r.runtime_env={name:"Node",version:process.versions.node}),process.versions.bun&&-1===n.indexOf("Bun")&&(r.runtime_env={name:"Bun",version:process.versions.bun})),"undefined"!=typeof Deno&&process.versions.bun&&-1===n.indexOf("Deno")&&(r.runtime_env={name:"Deno",version:Deno.version.deno});class o{constructor(e){var t;this.params=e,!1===e.userAgent?this.userAgent=void 0:this.userAgent=(t=e.userAgent||{},n+(!1===t?"":" AssemblyAI/1.0 ("+Object.entries(Object.assign(Object.assign({},r),t)).map((([e,t])=>t?`${e}=${t.name}/${t.version}`:"")).join(" ")+")"))}fetch(e,t){return s(this,void 0,void 0,(function*(){t=Object.assign(Object.assign({},i),t);let s={Authorization:this.params.apiKey,"Content-Type":"application/json"};(null==i?void 0:i.headers)&&(s=Object.assign(Object.assign({},s),i.headers)),(null==t?void 0:t.headers)&&(s=Object.assign(Object.assign({},s),t.headers)),this.userAgent&&(s["User-Agent"]=this.userAgent,"undefined"!=typeof window&&"chrome"in window&&(s["AssemblyAI-Agent"]=this.userAgent)),t.headers=s,e.startsWith("http")||(e=this.params.baseUrl+e);const n=yield fetch(e,t);if(n.status>=400){let e;const t=yield n.text();if(t){try{e=JSON.parse(t)}catch(e){}if(null==e?void 0:e.error)throw new Error(e.error);throw new Error(t)}throw new Error(`HTTP Error: ${n.status} ${n.statusText}`)}return n}))}fetchJson(e,t){return s(this,void 0,void 0,(function*(){return(yield this.fetch(e,t)).json()}))}}class a extends o{summary(e,t){return this.fetchJson("/lemur/v3/generate/summary",{method:"POST",body:JSON.stringify(e),signal:t})}questionAnswer(e,t){return this.fetchJson("/lemur/v3/generate/question-answer",{method:"POST",body:JSON.stringify(e),signal:t})}actionItems(e,t){return this.fetchJson("/lemur/v3/generate/action-items",{method:"POST",body:JSON.stringify(e),signal:t})}task(e,t){return this.fetchJson("/lemur/v3/generate/task",{method:"POST",body:JSON.stringify(e),signal:t})}getResponse(e,t){return this.fetchJson(`/lemur/v3/${e}`,{signal:t})}purgeRequestData(e,t){return this.fetchJson(`/lemur/v3/${e}`,{method:"DELETE",signal:t})}}const{WritableStream:c}="undefined"!=typeof window?window:"undefined"!=typeof global?global:globalThis;var l,d;const h=null!==(d=null!==(l=null!==WebSocket&&void 0!==WebSocket?WebSocket:null===global||void 0===global?void 0:global.WebSocket)&&void 0!==l?l:null===window||void 0===window?void 0:window.WebSocket)&&void 0!==d?d:null===self||void 0===self?void 0:self.WebSocket,u=(e,t)=>t?new h(e,t):new h(e),p={[4e3]:"Sample rate must be a positive integer",[4001]:"Not Authorized",[4002]:"Insufficient funds",[4003]:"This feature is paid-only and requires you to add a credit card. Please visit https://app.assemblyai.com/ to add a credit card to your account.",[4004]:"Session ID does not exist",[4008]:"Session has expired",[4010]:"Session is closed",[4029]:"Rate limited",[4030]:"Unique session violation",[4031]:"Session Timeout",[4032]:"Audio too short",[4033]:"Audio too long",[4034]:"Audio too small to transcode",[4100]:"Bad JSON",[4101]:"Bad schema",[4102]:"Too many streams",[4103]:"This session has been reconnected. This WebSocket is no longer valid.",[1013]:"Reconnect attempts exhausted",[4104]:"Could not parse word boost parameter"};class m extends Error{}const f={[3005]:"Server error",[3006]:"Input validation error",[3007]:"Audio chunk duration violation",[3008]:"Session expired: maximum session duration exceeded",[3009]:"Too many concurrent sessions",[4e3]:"Sample rate must be a positive integer",[4001]:"Not Authorized",[4002]:"Insufficient funds",[4003]:"This feature is paid-only and requires you to add a credit card. Please visit https://app.assemblyai.com/ to add a credit card to your account.",[4004]:"Session ID does not exist",[4008]:"Session has expired",[4010]:"Session is closed",[4029]:"Rate limited",[4030]:"Unique session violation",[4031]:"Session Timeout",[4032]:"Audio too short",[4033]:"Audio too long",[4034]:"Audio too small to transcode",[4101]:"Bad schema",[4102]:"Too many streams",[4103]:"This session has been reconnected. This WebSocket is no longer valid."};class v extends Error{}const y='{"terminate_session":true}';class g{constructor(e){var t,s;if(this.listeners={},this.realtimeUrl=null!==(t=e.realtimeUrl)&&void 0!==t?t:"wss://api.assemblyai.com/v2/realtime/ws",this.sampleRate=null!==(s=e.sampleRate)&&void 0!==s?s:16e3,this.wordBoost=e.wordBoost,this.encoding=e.encoding,this.endUtteranceSilenceThreshold=e.endUtteranceSilenceThreshold,this.disablePartialTranscripts=e.disablePartialTranscripts,"token"in e&&e.token&&(this.token=e.token),"apiKey"in e&&e.apiKey&&(this.apiKey=e.apiKey),!this.token&&!this.apiKey)throw new Error("API key or temporary token is required.")}connectionUrl(){const e=new URL(this.realtimeUrl);if("wss:"!==e.protocol)throw new Error("Invalid protocol, must be wss");const t=new URLSearchParams;return this.token&&t.set("token",this.token),t.set("sample_rate",this.sampleRate.toString()),this.wordBoost&&this.wordBoost.length>0&&t.set("word_boost",JSON.stringify(this.wordBoost)),this.encoding&&t.set("encoding",this.encoding),t.set("enable_extra_session_information","true"),this.disablePartialTranscripts&&t.set("disable_partial_transcripts",this.disablePartialTranscripts.toString()),e.search=t.toString(),e}on(e,t){this.listeners[e]=t}connect(){return new Promise((e=>{if(this.socket)throw new Error("Already connected");const t=this.connectionUrl();this.token?this.socket=u(t.toString()):(console.warn("API key authentication is not supported for the RealtimeTranscriber in browser environment. Use temporary token authentication instead.\nLearn more at https://github.com/AssemblyAI/assemblyai-node-sdk/blob/main/docs/compat.md#browser-compatibility."),this.socket=u(t.toString(),{headers:{Authorization:this.apiKey}})),this.socket.binaryType="arraybuffer",this.socket.onopen=()=>{void 0!==this.endUtteranceSilenceThreshold&&null!==this.endUtteranceSilenceThreshold&&this.configureEndUtteranceSilenceThreshold(this.endUtteranceSilenceThreshold)},this.socket.onclose=({code:e,reason:t})=>{var s,i;t||e in p&&(t=p[e]),null===(i=(s=this.listeners).close)||void 0===i||i.call(s,e,t)},this.socket.onerror=e=>{var t,s,i,n;e.error?null===(s=(t=this.listeners).error)||void 0===s||s.call(t,e.error):null===(n=(i=this.listeners).error)||void 0===n||n.call(i,new Error(e.message))},this.socket.onmessage=({data:t})=>{var s,i,n,r,o,a,c,l,d,h,u,p,f,v,y;const g=JSON.parse(t.toString());if("error"in g)null===(i=(s=this.listeners).error)||void 0===i||i.call(s,new m(g.error));else switch(g.message_type){case"SessionBegins":{const t={sessionId:g.session_id,expiresAt:new Date(g.expires_at)};e(t),null===(r=(n=this.listeners).open)||void 0===r||r.call(n,t);break}case"PartialTranscript":g.created=new Date(g.created),null===(a=(o=this.listeners).transcript)||void 0===a||a.call(o,g),null===(l=(c=this.listeners)["transcript.partial"])||void 0===l||l.call(c,g);break;case"FinalTranscript":g.created=new Date(g.created),null===(h=(d=this.listeners).transcript)||void 0===h||h.call(d,g),null===(p=(u=this.listeners)["transcript.final"])||void 0===p||p.call(u,g);break;case"SessionInformation":null===(v=(f=this.listeners).session_information)||void 0===v||v.call(f,g);break;case"SessionTerminated":null===(y=this.sessionTerminatedResolve)||void 0===y||y.call(this)}}}))}sendAudio(e){this.send(e)}stream(){return new c({write:e=>{this.sendAudio(e)}})}forceEndUtterance(){this.send('{"force_end_utterance":true}')}configureEndUtteranceSilenceThreshold(e){this.send(`{"end_utterance_silence_threshold":${e}}`)}send(e){if(!this.socket||this.socket.readyState!==this.socket.OPEN)throw new Error("Socket is not open for communication");this.socket.send(e)}close(){return s(this,arguments,void 0,(function*(e=!0){var t;if(this.socket){if(this.socket.readyState===this.socket.OPEN)if(e){const e=new Promise((e=>{this.sessionTerminatedResolve=e}));this.socket.send(y),yield e}else this.socket.send(y);(null===(t=this.socket)||void 0===t?void 0:t.removeAllListeners)&&this.socket.removeAllListeners(),this.socket.close()}this.listeners={},this.socket=void 0}))}}class b extends o{constructor(e){super(e),this.rtFactoryParams=e}createService(e){return this.transcriber(e)}transcriber(e){const t=Object.assign({},e);return t.token||t.apiKey||(t.apiKey=this.rtFactoryParams.apiKey),new g(t)}createTemporaryToken(e){return s(this,void 0,void 0,(function*(){return(yield this.fetchJson("/v2/realtime/token",{method:"POST",body:JSON.stringify(e)})).token}))}}function w(e){return e.startsWith("http")||e.startsWith("https")||e.startsWith("data:")?null:e.startsWith("file://")?e.substring(7):e.startsWith("file:")?e.substring(5):e}class S extends o{constructor(e,t){super(e),this.files=t}transcribe(e,t){return s(this,void 0,void 0,(function*(){const s=yield this.submit(e);return yield this.waitUntilReady(s.id,t)}))}submit(e){return s(this,void 0,void 0,(function*(){let s,i;if("audio"in e){const{audio:n}=e,r=t(e,["audio"]);if("string"==typeof n){const e=w(n);s=null!==e?yield this.files.upload(e):n.startsWith("data:")?yield this.files.upload(n):n}else s=yield this.files.upload(n);i=Object.assign(Object.assign({},r),{audio_url:s})}else i=e;return yield this.fetchJson("/v2/transcript",{method:"POST",body:JSON.stringify(i)})}))}create(e,t){return s(this,void 0,void 0,(function*(){var s;const i=w(e.audio_url);if(null!==i){const t=yield this.files.upload(i);e.audio_url=t}const n=yield this.fetchJson("/v2/transcript",{method:"POST",body:JSON.stringify(e)});return null===(s=null==t?void 0:t.poll)||void 0===s||s?yield this.waitUntilReady(n.id,t):n}))}waitUntilReady(e,t){return s(this,void 0,void 0,(function*(){var s,i;const n=null!==(s=null==t?void 0:t.pollingInterval)&&void 0!==s?s:3e3,r=null!==(i=null==t?void 0:t.pollingTimeout)&&void 0!==i?i:-1,o=Date.now();for(;;){const t=yield this.get(e);if("completed"===t.status||"error"===t.status)return t;if(r>0&&Date.now()-o>r)throw new Error("Polling timeout");yield new Promise((e=>setTimeout(e,n)))}}))}get(e){return this.fetchJson(`/v2/transcript/${e}`)}list(e){return s(this,void 0,void 0,(function*(){let t="/v2/transcript";"string"==typeof e?t=e:e&&(t=`${t}?${new URLSearchParams(Object.keys(e).map((t=>{var s;return[t,(null===(s=e[t])||void 0===s?void 0:s.toString())||""]})))}`);const s=yield this.fetchJson(t);for(const e of s.transcripts)e.created=new Date(e.created),e.completed&&(e.completed=new Date(e.completed));return s}))}delete(e){return this.fetchJson(`/v2/transcript/${e}`,{method:"DELETE"})}wordSearch(e,t){const s=new URLSearchParams({words:t.join(",")});return this.fetchJson(`/v2/transcript/${e}/word-search?${s.toString()}`)}sentences(e){return this.fetchJson(`/v2/transcript/${e}/sentences`)}paragraphs(e){return this.fetchJson(`/v2/transcript/${e}/paragraphs`)}subtitles(e){return s(this,arguments,void 0,(function*(e,t="srt",s){let i=`/v2/transcript/${e}/${t}`;if(s){const e=new URLSearchParams;e.set("chars_per_caption",s.toString()),i+=`?${e.toString()}`}const n=yield this.fetch(i);return yield n.text()}))}redactions(e){return this.redactedAudio(e)}redactedAudio(e){return this.fetchJson(`/v2/transcript/${e}/redacted-audio`)}redactedAudioFile(e){return s(this,void 0,void 0,(function*(){const{redacted_audio_url:t,status:s}=yield this.redactedAudio(e);if("redacted_audio_ready"!==s)throw new Error(`Redacted audio status is ${s}`);const i=yield fetch(t);if(!i.ok)throw new Error(`Failed to fetch redacted audio: ${i.statusText}`);return{arrayBuffer:i.arrayBuffer.bind(i),blob:i.blob.bind(i),body:i.body,bodyUsed:i.bodyUsed}}))}}class k extends o{upload(e){return s(this,void 0,void 0,(function*(){let t;t="string"==typeof e?e.startsWith("data:")?function(e){const t=e.split(","),s=t[0].match(/:(.*?);/)[1],i=atob(t[1]);let n=i.length;const r=new Uint8Array(n);for(;n--;)r[n]=i.charCodeAt(n);return new Blob([r],{type:s})}(e):yield function(e){return s(this,void 0,void 0,(function*(){throw new Error("Interacting with the file system is not supported in this environment.")}))}():e;return(yield this.fetchJson("/v2/upload",{method:"POST",body:t,headers:{"Content-Type":"application/octet-stream"},duplex:"half"})).upload_url}))}}const _='{"type":"Terminate"}';class T{constructor(e){if(this.listeners={},this.params=Object.assign(Object.assign({},e),{websocketBaseUrl:e.websocketBaseUrl||"wss://streaming.assemblyai.com/v3/ws"}),"token"in e&&e.token&&(this.token=e.token),"apiKey"in e&&e.apiKey&&(this.apiKey=e.apiKey),!this.token&&!this.apiKey)throw new Error("API key or temporary token is required.")}connectionUrl(){var e,t;const s=new URL(null!==(e=this.params.websocketBaseUrl)&&void 0!==e?e:"");if("wss:"!==s.protocol)throw new Error("Invalid protocol, must be wss");const i=new URLSearchParams;this.token&&i.set("token",this.token),i.set("sample_rate",this.params.sampleRate.toString()),this.params.endOfTurnConfidenceThreshold&&i.set("end_of_turn_confidence_threshold",this.params.endOfTurnConfidenceThreshold.toString()),void 0!==this.params.minEndOfTurnSilenceWhenConfident&&(void 0!==this.params.minTurnSilence?console.warn("[Deprecation Warning] Both `minEndOfTurnSilenceWhenConfident` and `minTurnSilence` are set. Using `minTurnSilence`; `minEndOfTurnSilenceWhenConfident` is deprecated."):console.warn("[Deprecation Warning] `minEndOfTurnSilenceWhenConfident` is deprecated and will be removed in a future release. Please use `minTurnSilence` instead."));const n=null!==(t=this.params.minTurnSilence)&&void 0!==t?t:this.params.minEndOfTurnSilenceWhenConfident;return void 0!==n&&i.set("min_turn_silence",n.toString()),this.params.maxTurnSilence&&i.set("max_turn_silence",this.params.maxTurnSilence.toString()),void 0!==this.params.vadThreshold&&i.set("vad_threshold",this.params.vadThreshold.toString()),this.params.formatTurns&&i.set("format_turns",this.params.formatTurns.toString()),this.params.encoding&&i.set("encoding",this.params.encoding.toString()),this.params.keytermsPrompt?i.set("keyterms_prompt",JSON.stringify(this.params.keytermsPrompt)):this.params.keyterms&&(console.warn("[Deprecation Warning] `keyterms` is deprecated and will be removed in a future release. Please use `keytermsPrompt` instead."),i.set("keyterms_prompt",JSON.stringify(this.params.keyterms))),this.params.prompt&&i.set("prompt",this.params.prompt),this.params.filterProfanity&&i.set("filter_profanity",this.params.filterProfanity.toString()),"u3-pro"===this.params.speechModel&&console.warn("[Deprecation Warning] The speech model `u3-pro` is deprecated and will be removed in a future release. Please use `u3-rt-pro` instead."),i.set("speech_model",this.params.speechModel.toString()),void 0!==this.params.languageDetection&&i.set("language_detection",this.params.languageDetection.toString()),this.params.domain&&i.set("domain",this.params.domain),void 0!==this.params.inactivityTimeout&&i.set("inactivity_timeout",this.params.inactivityTimeout.toString()),void 0!==this.params.speakerLabels&&i.set("speaker_labels",this.params.speakerLabels.toString()),void 0!==this.params.maxSpeakers&&i.set("max_speakers",this.params.maxSpeakers.toString()),this.params.noiseSuppressionModel&&i.set("noise_suppression_model",this.params.noiseSuppressionModel),void 0!==this.params.noiseSuppressionThreshold&&i.set("noise_suppression_threshold",this.params.noiseSuppressionThreshold.toString()),void 0!==this.params.llmGateway&&i.set("llm_gateway",JSON.stringify(this.params.llmGateway)),s.search=i.toString(),s}on(e,t){this.listeners[e]=t}connect(){return new Promise((e=>{if(this.socket)throw new Error("Already connected");const t=this.connectionUrl();this.token?this.socket=u(t.toString()):(console.warn("API key authentication is not supported for the StreamingTranscriber in browser environment. Use temporary token authentication instead.\nLearn more at https://github.com/AssemblyAI/assemblyai-node-sdk/blob/main/docs/compat.md#browser-compatibility."),this.socket=u(t.toString(),{headers:{Authorization:this.apiKey}})),this.socket.binaryType="arraybuffer",this.socket.onopen=()=>{},this.socket.onclose=({code:e,reason:t})=>{var s,i;t||e in f&&(t=f[e]),null===(i=(s=this.listeners).close)||void 0===i||i.call(s,e,t)},this.socket.onerror=e=>{var t,s,i,n;e.error?null===(s=(t=this.listeners).error)||void 0===s||s.call(t,e.error):null===(n=(i=this.listeners).error)||void 0===n||n.call(i,new Error(e.message))},this.socket.onmessage=({data:t})=>{var s,i,n,r,o,a,c,l,d,h,u,p,m;const f=JSON.parse(t.toString());if("error"in f){const e=new v(f.error);return"error_code"in f&&(e.code=f.error_code),void(null===(i=(s=this.listeners).error)||void 0===i||i.call(s,e))}switch(f.type){case"Begin":e(f),null===(r=(n=this.listeners).open)||void 0===r||r.call(n,f);break;case"Turn":null===(a=(o=this.listeners).turn)||void 0===a||a.call(o,f);break;case"SpeechStarted":null===(l=(c=this.listeners).speechStarted)||void 0===l||l.call(c,f);break;case"LLMGatewayResponse":null===(h=(d=this.listeners).llmGatewayResponse)||void 0===h||h.call(d,f);break;case"Warning":{const e=f;console.warn(`Streaming warning (code=${e.warning_code}): ${e.warning}`),null===(p=(u=this.listeners).warning)||void 0===p||p.call(u,e);break}case"Termination":null===(m=this.sessionTerminatedResolve)||void 0===m||m.call(this)}}}))}stream(){return new c({write:e=>{this.sendAudio(e)}})}sendAudio(e){this.send(e)}updateConfiguration(e){const{min_end_of_turn_silence_when_confident:s,min_turn_silence:i}=e,n=t(e,["min_end_of_turn_silence_when_confident","min_turn_silence"]);void 0!==s&&(void 0!==i?console.warn("[Deprecation Warning] Both `min_end_of_turn_silence_when_confident` and `min_turn_silence` are set. Using `min_turn_silence`; `min_end_of_turn_silence_when_confident` is deprecated."):console.warn("[Deprecation Warning] `min_end_of_turn_silence_when_confident` is deprecated and will be removed in a future release. Please use `min_turn_silence` instead."));const r=null!=i?i:s,o=Object.assign(Object.assign({type:"UpdateConfiguration"},n),void 0!==r?{min_turn_silence:r}:{});this.send(JSON.stringify(o))}forceEndpoint(){this.send(JSON.stringify({type:"ForceEndpoint"}))}send(e){if(!this.socket||this.socket.readyState!==this.socket.OPEN)throw new Error("Socket is not open for communication");this.socket.send(e)}close(){return s(this,arguments,void 0,(function*(e=!0){var t;if(this.socket){if(this.socket.readyState===this.socket.OPEN)if(e){const e=new Promise((e=>{this.sessionTerminatedResolve=e}));this.socket.send(_),yield e}else this.socket.send(_);(null===(t=this.socket)||void 0===t?void 0:t.removeAllListeners)&&this.socket.removeAllListeners(),this.socket.close()}this.listeners={},this.socket=void 0}))}}class O extends o{constructor(e){super(e),this.baseServiceParams=e}transcriber(e){const t=Object.assign({},e);return t.token||t.apiKey||(t.apiKey=this.baseServiceParams.apiKey),new T(t)}createTemporaryToken(e){return s(this,void 0,void 0,(function*(){const t=new URLSearchParams;Object.entries(e).forEach((([e,s])=>{null!=s&&t.append(e,String(s))}));const s=t.toString(),i=s?`/v3/token?${s}`:"/v3/token";return(yield this.fetchJson(i,{method:"GET"})).token}))}}e.AssemblyAI=class{constructor(e){e.baseUrl=e.baseUrl||"https://api.assemblyai.com",e.baseUrl&&e.baseUrl.endsWith("/")&&(e.baseUrl=e.baseUrl.slice(0,-1)),this.files=new k(e),this.transcripts=new S(e,this.files),this.lemur=new a(e),this.realtime=new b(e),this.streaming=new O(Object.assign(Object.assign({},e),{baseUrl:e.streamingBaseUrl||"https://streaming.assemblyai.com"}))}},e.FileService=k,e.LemurService=a,e.RealtimeService=class extends g{},e.RealtimeServiceFactory=class extends b{},e.RealtimeTranscriber=g,e.RealtimeTranscriberFactory=b,e.StreamingTranscriber=T,e.TranscriptService=S}));
|
package/dist/browser.mjs
CHANGED
|
@@ -15,7 +15,7 @@ if (typeof navigator !== "undefined" && navigator.userAgent) {
|
|
|
15
15
|
defaultUserAgentString += navigator.userAgent;
|
|
16
16
|
}
|
|
17
17
|
const defaultUserAgent = {
|
|
18
|
-
sdk: { name: "JavaScript", version: "4.
|
|
18
|
+
sdk: { name: "JavaScript", version: "4.32.1" },
|
|
19
19
|
};
|
|
20
20
|
if (typeof process !== "undefined") {
|
|
21
21
|
if (process.versions.node && defaultUserAgentString.indexOf("Node") === -1) {
|
|
@@ -233,8 +233,18 @@ const StreamingErrorType = {
|
|
|
233
233
|
BadSchema: 4101,
|
|
234
234
|
TooManyStreams: 4102,
|
|
235
235
|
Reconnected: 4103,
|
|
236
|
+
ServerError: 3005,
|
|
237
|
+
InputValidationError: 3006,
|
|
238
|
+
AudioChunkDurationViolation: 3007,
|
|
239
|
+
MaxSessionDurationExceeded: 3008,
|
|
240
|
+
ConcurrencyLimitExceeded: 3009,
|
|
236
241
|
};
|
|
237
242
|
const StreamingErrorMessages = {
|
|
243
|
+
[StreamingErrorType.ServerError]: "Server error",
|
|
244
|
+
[StreamingErrorType.InputValidationError]: "Input validation error",
|
|
245
|
+
[StreamingErrorType.AudioChunkDurationViolation]: "Audio chunk duration violation",
|
|
246
|
+
[StreamingErrorType.MaxSessionDurationExceeded]: "Session expired: maximum session duration exceeded",
|
|
247
|
+
[StreamingErrorType.ConcurrencyLimitExceeded]: "Too many concurrent sessions",
|
|
238
248
|
[StreamingErrorType.BadSampleRate]: "Sample rate must be a positive integer",
|
|
239
249
|
[StreamingErrorType.AuthFailed]: "Not Authorized",
|
|
240
250
|
[StreamingErrorType.InsufficientFunds]: "Insufficient funds",
|
|
@@ -821,12 +831,18 @@ class StreamingTranscriber {
|
|
|
821
831
|
if (this.params.endOfTurnConfidenceThreshold) {
|
|
822
832
|
searchParams.set("end_of_turn_confidence_threshold", this.params.endOfTurnConfidenceThreshold.toString());
|
|
823
833
|
}
|
|
824
|
-
if (this.params.
|
|
825
|
-
|
|
834
|
+
if (this.params.minEndOfTurnSilenceWhenConfident !== undefined) {
|
|
835
|
+
if (this.params.minTurnSilence !== undefined) {
|
|
836
|
+
console.warn("[Deprecation Warning] Both `minEndOfTurnSilenceWhenConfident` and `minTurnSilence` are set. Using `minTurnSilence`; `minEndOfTurnSilenceWhenConfident` is deprecated.");
|
|
837
|
+
}
|
|
838
|
+
else {
|
|
839
|
+
console.warn("[Deprecation Warning] `minEndOfTurnSilenceWhenConfident` is deprecated and will be removed in a future release. Please use `minTurnSilence` instead.");
|
|
840
|
+
}
|
|
826
841
|
}
|
|
827
|
-
|
|
828
|
-
|
|
829
|
-
|
|
842
|
+
const effectiveMinTurnSilence = this.params.minTurnSilence ??
|
|
843
|
+
this.params.minEndOfTurnSilenceWhenConfident;
|
|
844
|
+
if (effectiveMinTurnSilence !== undefined) {
|
|
845
|
+
searchParams.set("min_turn_silence", effectiveMinTurnSilence.toString());
|
|
830
846
|
}
|
|
831
847
|
if (this.params.maxTurnSilence) {
|
|
832
848
|
searchParams.set("max_turn_silence", this.params.maxTurnSilence.toString());
|
|
@@ -872,6 +888,12 @@ class StreamingTranscriber {
|
|
|
872
888
|
if (this.params.maxSpeakers !== undefined) {
|
|
873
889
|
searchParams.set("max_speakers", this.params.maxSpeakers.toString());
|
|
874
890
|
}
|
|
891
|
+
if (this.params.noiseSuppressionModel) {
|
|
892
|
+
searchParams.set("noise_suppression_model", this.params.noiseSuppressionModel);
|
|
893
|
+
}
|
|
894
|
+
if (this.params.noiseSuppressionThreshold !== undefined) {
|
|
895
|
+
searchParams.set("noise_suppression_threshold", this.params.noiseSuppressionThreshold.toString());
|
|
896
|
+
}
|
|
875
897
|
if (this.params.llmGateway !== undefined) {
|
|
876
898
|
searchParams.set("llm_gateway", JSON.stringify(this.params.llmGateway));
|
|
877
899
|
}
|
|
@@ -919,7 +941,12 @@ Learn more at https://github.com/AssemblyAI/assemblyai-node-sdk/blob/main/docs/c
|
|
|
919
941
|
this.socket.onmessage = ({ data }) => {
|
|
920
942
|
const message = JSON.parse(data.toString());
|
|
921
943
|
if ("error" in message) {
|
|
922
|
-
|
|
944
|
+
const err = new StreamingError(message.error);
|
|
945
|
+
if ("error_code" in message) {
|
|
946
|
+
err.code =
|
|
947
|
+
message.error_code;
|
|
948
|
+
}
|
|
949
|
+
this.listeners.error?.(err);
|
|
923
950
|
return;
|
|
924
951
|
}
|
|
925
952
|
switch (message.type) {
|
|
@@ -940,6 +967,12 @@ Learn more at https://github.com/AssemblyAI/assemblyai-node-sdk/blob/main/docs/c
|
|
|
940
967
|
this.listeners.llmGatewayResponse?.(message);
|
|
941
968
|
break;
|
|
942
969
|
}
|
|
970
|
+
case "Warning": {
|
|
971
|
+
const warning = message;
|
|
972
|
+
console.warn(`Streaming warning (code=${warning.warning_code}): ${warning.warning}`);
|
|
973
|
+
this.listeners.warning?.(warning);
|
|
974
|
+
break;
|
|
975
|
+
}
|
|
943
976
|
case "Termination": {
|
|
944
977
|
this.sessionTerminatedResolve?.();
|
|
945
978
|
break;
|
|
@@ -963,9 +996,20 @@ Learn more at https://github.com/AssemblyAI/assemblyai-node-sdk/blob/main/docs/c
|
|
|
963
996
|
* @param config - The configuration parameters to update
|
|
964
997
|
*/
|
|
965
998
|
updateConfiguration(config) {
|
|
999
|
+
const { min_end_of_turn_silence_when_confident, min_turn_silence, ...rest } = config;
|
|
1000
|
+
if (min_end_of_turn_silence_when_confident !== undefined) {
|
|
1001
|
+
if (min_turn_silence !== undefined) {
|
|
1002
|
+
console.warn("[Deprecation Warning] Both `min_end_of_turn_silence_when_confident` and `min_turn_silence` are set. Using `min_turn_silence`; `min_end_of_turn_silence_when_confident` is deprecated.");
|
|
1003
|
+
}
|
|
1004
|
+
else {
|
|
1005
|
+
console.warn("[Deprecation Warning] `min_end_of_turn_silence_when_confident` is deprecated and will be removed in a future release. Please use `min_turn_silence` instead.");
|
|
1006
|
+
}
|
|
1007
|
+
}
|
|
1008
|
+
const effective = min_turn_silence ?? min_end_of_turn_silence_when_confident;
|
|
966
1009
|
const message = {
|
|
967
1010
|
type: "UpdateConfiguration",
|
|
968
|
-
...
|
|
1011
|
+
...rest,
|
|
1012
|
+
...(effective !== undefined ? { min_turn_silence: effective } : {}),
|
|
969
1013
|
};
|
|
970
1014
|
this.send(JSON.stringify(message));
|
|
971
1015
|
}
|
package/dist/bun.mjs
CHANGED
|
@@ -17,7 +17,7 @@ if (typeof navigator !== "undefined" && navigator.userAgent) {
|
|
|
17
17
|
defaultUserAgentString += navigator.userAgent;
|
|
18
18
|
}
|
|
19
19
|
const defaultUserAgent = {
|
|
20
|
-
sdk: { name: "JavaScript", version: "4.
|
|
20
|
+
sdk: { name: "JavaScript", version: "4.32.1" },
|
|
21
21
|
};
|
|
22
22
|
if (typeof process !== "undefined") {
|
|
23
23
|
if (process.versions.node && defaultUserAgentString.indexOf("Node") === -1) {
|
|
@@ -222,8 +222,18 @@ const StreamingErrorType = {
|
|
|
222
222
|
BadSchema: 4101,
|
|
223
223
|
TooManyStreams: 4102,
|
|
224
224
|
Reconnected: 4103,
|
|
225
|
+
ServerError: 3005,
|
|
226
|
+
InputValidationError: 3006,
|
|
227
|
+
AudioChunkDurationViolation: 3007,
|
|
228
|
+
MaxSessionDurationExceeded: 3008,
|
|
229
|
+
ConcurrencyLimitExceeded: 3009,
|
|
225
230
|
};
|
|
226
231
|
const StreamingErrorMessages = {
|
|
232
|
+
[StreamingErrorType.ServerError]: "Server error",
|
|
233
|
+
[StreamingErrorType.InputValidationError]: "Input validation error",
|
|
234
|
+
[StreamingErrorType.AudioChunkDurationViolation]: "Audio chunk duration violation",
|
|
235
|
+
[StreamingErrorType.MaxSessionDurationExceeded]: "Session expired: maximum session duration exceeded",
|
|
236
|
+
[StreamingErrorType.ConcurrencyLimitExceeded]: "Too many concurrent sessions",
|
|
227
237
|
[StreamingErrorType.BadSampleRate]: "Sample rate must be a positive integer",
|
|
228
238
|
[StreamingErrorType.AuthFailed]: "Not Authorized",
|
|
229
239
|
[StreamingErrorType.InsufficientFunds]: "Insufficient funds",
|
|
@@ -802,12 +812,18 @@ class StreamingTranscriber {
|
|
|
802
812
|
if (this.params.endOfTurnConfidenceThreshold) {
|
|
803
813
|
searchParams.set("end_of_turn_confidence_threshold", this.params.endOfTurnConfidenceThreshold.toString());
|
|
804
814
|
}
|
|
805
|
-
if (this.params.
|
|
806
|
-
|
|
815
|
+
if (this.params.minEndOfTurnSilenceWhenConfident !== undefined) {
|
|
816
|
+
if (this.params.minTurnSilence !== undefined) {
|
|
817
|
+
console.warn("[Deprecation Warning] Both `minEndOfTurnSilenceWhenConfident` and `minTurnSilence` are set. Using `minTurnSilence`; `minEndOfTurnSilenceWhenConfident` is deprecated.");
|
|
818
|
+
}
|
|
819
|
+
else {
|
|
820
|
+
console.warn("[Deprecation Warning] `minEndOfTurnSilenceWhenConfident` is deprecated and will be removed in a future release. Please use `minTurnSilence` instead.");
|
|
821
|
+
}
|
|
807
822
|
}
|
|
808
|
-
|
|
809
|
-
|
|
810
|
-
|
|
823
|
+
const effectiveMinTurnSilence = this.params.minTurnSilence ??
|
|
824
|
+
this.params.minEndOfTurnSilenceWhenConfident;
|
|
825
|
+
if (effectiveMinTurnSilence !== undefined) {
|
|
826
|
+
searchParams.set("min_turn_silence", effectiveMinTurnSilence.toString());
|
|
811
827
|
}
|
|
812
828
|
if (this.params.maxTurnSilence) {
|
|
813
829
|
searchParams.set("max_turn_silence", this.params.maxTurnSilence.toString());
|
|
@@ -853,6 +869,12 @@ class StreamingTranscriber {
|
|
|
853
869
|
if (this.params.maxSpeakers !== undefined) {
|
|
854
870
|
searchParams.set("max_speakers", this.params.maxSpeakers.toString());
|
|
855
871
|
}
|
|
872
|
+
if (this.params.noiseSuppressionModel) {
|
|
873
|
+
searchParams.set("noise_suppression_model", this.params.noiseSuppressionModel);
|
|
874
|
+
}
|
|
875
|
+
if (this.params.noiseSuppressionThreshold !== undefined) {
|
|
876
|
+
searchParams.set("noise_suppression_threshold", this.params.noiseSuppressionThreshold.toString());
|
|
877
|
+
}
|
|
856
878
|
if (this.params.llmGateway !== undefined) {
|
|
857
879
|
searchParams.set("llm_gateway", JSON.stringify(this.params.llmGateway));
|
|
858
880
|
}
|
|
@@ -896,7 +918,12 @@ class StreamingTranscriber {
|
|
|
896
918
|
this.socket.onmessage = ({ data }) => {
|
|
897
919
|
const message = JSON.parse(data.toString());
|
|
898
920
|
if ("error" in message) {
|
|
899
|
-
|
|
921
|
+
const err = new StreamingError(message.error);
|
|
922
|
+
if ("error_code" in message) {
|
|
923
|
+
err.code =
|
|
924
|
+
message.error_code;
|
|
925
|
+
}
|
|
926
|
+
this.listeners.error?.(err);
|
|
900
927
|
return;
|
|
901
928
|
}
|
|
902
929
|
switch (message.type) {
|
|
@@ -917,6 +944,12 @@ class StreamingTranscriber {
|
|
|
917
944
|
this.listeners.llmGatewayResponse?.(message);
|
|
918
945
|
break;
|
|
919
946
|
}
|
|
947
|
+
case "Warning": {
|
|
948
|
+
const warning = message;
|
|
949
|
+
console.warn(`Streaming warning (code=${warning.warning_code}): ${warning.warning}`);
|
|
950
|
+
this.listeners.warning?.(warning);
|
|
951
|
+
break;
|
|
952
|
+
}
|
|
920
953
|
case "Termination": {
|
|
921
954
|
this.sessionTerminatedResolve?.();
|
|
922
955
|
break;
|
|
@@ -940,9 +973,20 @@ class StreamingTranscriber {
|
|
|
940
973
|
* @param config - The configuration parameters to update
|
|
941
974
|
*/
|
|
942
975
|
updateConfiguration(config) {
|
|
976
|
+
const { min_end_of_turn_silence_when_confident, min_turn_silence, ...rest } = config;
|
|
977
|
+
if (min_end_of_turn_silence_when_confident !== undefined) {
|
|
978
|
+
if (min_turn_silence !== undefined) {
|
|
979
|
+
console.warn("[Deprecation Warning] Both `min_end_of_turn_silence_when_confident` and `min_turn_silence` are set. Using `min_turn_silence`; `min_end_of_turn_silence_when_confident` is deprecated.");
|
|
980
|
+
}
|
|
981
|
+
else {
|
|
982
|
+
console.warn("[Deprecation Warning] `min_end_of_turn_silence_when_confident` is deprecated and will be removed in a future release. Please use `min_turn_silence` instead.");
|
|
983
|
+
}
|
|
984
|
+
}
|
|
985
|
+
const effective = min_turn_silence ?? min_end_of_turn_silence_when_confident;
|
|
943
986
|
const message = {
|
|
944
987
|
type: "UpdateConfiguration",
|
|
945
|
-
...
|
|
988
|
+
...rest,
|
|
989
|
+
...(effective !== undefined ? { min_turn_silence: effective } : {}),
|
|
946
990
|
};
|
|
947
991
|
this.send(JSON.stringify(message));
|
|
948
992
|
}
|
package/dist/deno.mjs
CHANGED
|
@@ -17,7 +17,7 @@ if (typeof navigator !== "undefined" && navigator.userAgent) {
|
|
|
17
17
|
defaultUserAgentString += navigator.userAgent;
|
|
18
18
|
}
|
|
19
19
|
const defaultUserAgent = {
|
|
20
|
-
sdk: { name: "JavaScript", version: "4.
|
|
20
|
+
sdk: { name: "JavaScript", version: "4.32.1" },
|
|
21
21
|
};
|
|
22
22
|
if (typeof process !== "undefined") {
|
|
23
23
|
if (process.versions.node && defaultUserAgentString.indexOf("Node") === -1) {
|
|
@@ -222,8 +222,18 @@ const StreamingErrorType = {
|
|
|
222
222
|
BadSchema: 4101,
|
|
223
223
|
TooManyStreams: 4102,
|
|
224
224
|
Reconnected: 4103,
|
|
225
|
+
ServerError: 3005,
|
|
226
|
+
InputValidationError: 3006,
|
|
227
|
+
AudioChunkDurationViolation: 3007,
|
|
228
|
+
MaxSessionDurationExceeded: 3008,
|
|
229
|
+
ConcurrencyLimitExceeded: 3009,
|
|
225
230
|
};
|
|
226
231
|
const StreamingErrorMessages = {
|
|
232
|
+
[StreamingErrorType.ServerError]: "Server error",
|
|
233
|
+
[StreamingErrorType.InputValidationError]: "Input validation error",
|
|
234
|
+
[StreamingErrorType.AudioChunkDurationViolation]: "Audio chunk duration violation",
|
|
235
|
+
[StreamingErrorType.MaxSessionDurationExceeded]: "Session expired: maximum session duration exceeded",
|
|
236
|
+
[StreamingErrorType.ConcurrencyLimitExceeded]: "Too many concurrent sessions",
|
|
227
237
|
[StreamingErrorType.BadSampleRate]: "Sample rate must be a positive integer",
|
|
228
238
|
[StreamingErrorType.AuthFailed]: "Not Authorized",
|
|
229
239
|
[StreamingErrorType.InsufficientFunds]: "Insufficient funds",
|
|
@@ -802,12 +812,18 @@ class StreamingTranscriber {
|
|
|
802
812
|
if (this.params.endOfTurnConfidenceThreshold) {
|
|
803
813
|
searchParams.set("end_of_turn_confidence_threshold", this.params.endOfTurnConfidenceThreshold.toString());
|
|
804
814
|
}
|
|
805
|
-
if (this.params.
|
|
806
|
-
|
|
815
|
+
if (this.params.minEndOfTurnSilenceWhenConfident !== undefined) {
|
|
816
|
+
if (this.params.minTurnSilence !== undefined) {
|
|
817
|
+
console.warn("[Deprecation Warning] Both `minEndOfTurnSilenceWhenConfident` and `minTurnSilence` are set. Using `minTurnSilence`; `minEndOfTurnSilenceWhenConfident` is deprecated.");
|
|
818
|
+
}
|
|
819
|
+
else {
|
|
820
|
+
console.warn("[Deprecation Warning] `minEndOfTurnSilenceWhenConfident` is deprecated and will be removed in a future release. Please use `minTurnSilence` instead.");
|
|
821
|
+
}
|
|
807
822
|
}
|
|
808
|
-
|
|
809
|
-
|
|
810
|
-
|
|
823
|
+
const effectiveMinTurnSilence = this.params.minTurnSilence ??
|
|
824
|
+
this.params.minEndOfTurnSilenceWhenConfident;
|
|
825
|
+
if (effectiveMinTurnSilence !== undefined) {
|
|
826
|
+
searchParams.set("min_turn_silence", effectiveMinTurnSilence.toString());
|
|
811
827
|
}
|
|
812
828
|
if (this.params.maxTurnSilence) {
|
|
813
829
|
searchParams.set("max_turn_silence", this.params.maxTurnSilence.toString());
|
|
@@ -853,6 +869,12 @@ class StreamingTranscriber {
|
|
|
853
869
|
if (this.params.maxSpeakers !== undefined) {
|
|
854
870
|
searchParams.set("max_speakers", this.params.maxSpeakers.toString());
|
|
855
871
|
}
|
|
872
|
+
if (this.params.noiseSuppressionModel) {
|
|
873
|
+
searchParams.set("noise_suppression_model", this.params.noiseSuppressionModel);
|
|
874
|
+
}
|
|
875
|
+
if (this.params.noiseSuppressionThreshold !== undefined) {
|
|
876
|
+
searchParams.set("noise_suppression_threshold", this.params.noiseSuppressionThreshold.toString());
|
|
877
|
+
}
|
|
856
878
|
if (this.params.llmGateway !== undefined) {
|
|
857
879
|
searchParams.set("llm_gateway", JSON.stringify(this.params.llmGateway));
|
|
858
880
|
}
|
|
@@ -896,7 +918,12 @@ class StreamingTranscriber {
|
|
|
896
918
|
this.socket.onmessage = ({ data }) => {
|
|
897
919
|
const message = JSON.parse(data.toString());
|
|
898
920
|
if ("error" in message) {
|
|
899
|
-
|
|
921
|
+
const err = new StreamingError(message.error);
|
|
922
|
+
if ("error_code" in message) {
|
|
923
|
+
err.code =
|
|
924
|
+
message.error_code;
|
|
925
|
+
}
|
|
926
|
+
this.listeners.error?.(err);
|
|
900
927
|
return;
|
|
901
928
|
}
|
|
902
929
|
switch (message.type) {
|
|
@@ -917,6 +944,12 @@ class StreamingTranscriber {
|
|
|
917
944
|
this.listeners.llmGatewayResponse?.(message);
|
|
918
945
|
break;
|
|
919
946
|
}
|
|
947
|
+
case "Warning": {
|
|
948
|
+
const warning = message;
|
|
949
|
+
console.warn(`Streaming warning (code=${warning.warning_code}): ${warning.warning}`);
|
|
950
|
+
this.listeners.warning?.(warning);
|
|
951
|
+
break;
|
|
952
|
+
}
|
|
920
953
|
case "Termination": {
|
|
921
954
|
this.sessionTerminatedResolve?.();
|
|
922
955
|
break;
|
|
@@ -940,9 +973,20 @@ class StreamingTranscriber {
|
|
|
940
973
|
* @param config - The configuration parameters to update
|
|
941
974
|
*/
|
|
942
975
|
updateConfiguration(config) {
|
|
976
|
+
const { min_end_of_turn_silence_when_confident, min_turn_silence, ...rest } = config;
|
|
977
|
+
if (min_end_of_turn_silence_when_confident !== undefined) {
|
|
978
|
+
if (min_turn_silence !== undefined) {
|
|
979
|
+
console.warn("[Deprecation Warning] Both `min_end_of_turn_silence_when_confident` and `min_turn_silence` are set. Using `min_turn_silence`; `min_end_of_turn_silence_when_confident` is deprecated.");
|
|
980
|
+
}
|
|
981
|
+
else {
|
|
982
|
+
console.warn("[Deprecation Warning] `min_end_of_turn_silence_when_confident` is deprecated and will be removed in a future release. Please use `min_turn_silence` instead.");
|
|
983
|
+
}
|
|
984
|
+
}
|
|
985
|
+
const effective = min_turn_silence ?? min_end_of_turn_silence_when_confident;
|
|
943
986
|
const message = {
|
|
944
987
|
type: "UpdateConfiguration",
|
|
945
|
-
...
|
|
988
|
+
...rest,
|
|
989
|
+
...(effective !== undefined ? { min_turn_silence: effective } : {}),
|
|
946
990
|
};
|
|
947
991
|
this.send(JSON.stringify(message));
|
|
948
992
|
}
|