@livekit/agents-plugin-baseten 1.0.31

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (67) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +92 -0
  3. package/dist/index.cjs +48 -0
  4. package/dist/index.cjs.map +1 -0
  5. package/dist/index.d.cts +5 -0
  6. package/dist/index.d.ts +5 -0
  7. package/dist/index.d.ts.map +1 -0
  8. package/dist/index.js +21 -0
  9. package/dist/index.js.map +1 -0
  10. package/dist/llm.cjs +143 -0
  11. package/dist/llm.cjs.map +1 -0
  12. package/dist/llm.d.cts +44 -0
  13. package/dist/llm.d.ts +44 -0
  14. package/dist/llm.d.ts.map +1 -0
  15. package/dist/llm.js +117 -0
  16. package/dist/llm.js.map +1 -0
  17. package/dist/llm.test.cjs +14 -0
  18. package/dist/llm.test.cjs.map +1 -0
  19. package/dist/llm.test.d.cts +2 -0
  20. package/dist/llm.test.d.ts +2 -0
  21. package/dist/llm.test.d.ts.map +1 -0
  22. package/dist/llm.test.js +13 -0
  23. package/dist/llm.test.js.map +1 -0
  24. package/dist/stt.cjs +271 -0
  25. package/dist/stt.cjs.map +1 -0
  26. package/dist/stt.d.cts +18 -0
  27. package/dist/stt.d.ts +18 -0
  28. package/dist/stt.d.ts.map +1 -0
  29. package/dist/stt.js +246 -0
  30. package/dist/stt.js.map +1 -0
  31. package/dist/stt.test.cjs +9 -0
  32. package/dist/stt.test.cjs.map +1 -0
  33. package/dist/stt.test.d.cts +2 -0
  34. package/dist/stt.test.d.ts +2 -0
  35. package/dist/stt.test.d.ts.map +1 -0
  36. package/dist/stt.test.js +8 -0
  37. package/dist/stt.test.js.map +1 -0
  38. package/dist/tts.cjs +161 -0
  39. package/dist/tts.cjs.map +1 -0
  40. package/dist/tts.d.cts +45 -0
  41. package/dist/tts.d.ts +45 -0
  42. package/dist/tts.d.ts.map +1 -0
  43. package/dist/tts.js +141 -0
  44. package/dist/tts.js.map +1 -0
  45. package/dist/tts.test.cjs +9 -0
  46. package/dist/tts.test.cjs.map +1 -0
  47. package/dist/tts.test.d.cts +2 -0
  48. package/dist/tts.test.d.ts +2 -0
  49. package/dist/tts.test.d.ts.map +1 -0
  50. package/dist/tts.test.js +8 -0
  51. package/dist/tts.test.js.map +1 -0
  52. package/dist/types.cjs +17 -0
  53. package/dist/types.cjs.map +1 -0
  54. package/dist/types.d.cts +54 -0
  55. package/dist/types.d.ts +54 -0
  56. package/dist/types.d.ts.map +1 -0
  57. package/dist/types.js +1 -0
  58. package/dist/types.js.map +1 -0
  59. package/package.json +68 -0
  60. package/src/index.ts +20 -0
  61. package/src/llm.test.ts +16 -0
  62. package/src/llm.ts +172 -0
  63. package/src/stt.test.ts +11 -0
  64. package/src/stt.ts +298 -0
  65. package/src/tts.test.ts +11 -0
  66. package/src/tts.ts +202 -0
  67. package/src/types.ts +55 -0
package/dist/llm.js ADDED
@@ -0,0 +1,117 @@
1
+ import { DEFAULT_API_CONNECT_OPTIONS, inference, llm } from "@livekit/agents";
2
+ import { OpenAI } from "openai";
3
+ const defaultLLMOptions = {
4
+ model: "openai/gpt-4o-mini",
5
+ apiKey: process.env.OPENAI_API_KEY,
6
+ parallelToolCalls: true,
7
+ strictToolSchema: false
8
+ };
9
+ class OpenAILLM extends llm.LLM {
10
+ #opts;
11
+ #client;
12
+ #providerFmt;
13
+ constructor(opts = defaultLLMOptions, providerFmt = "openai") {
14
+ super();
15
+ this.#opts = { ...defaultLLMOptions, ...opts };
16
+ this.#providerFmt = providerFmt;
17
+ if (this.#opts.apiKey === void 0) {
18
+ throw new Error("OpenAI API key is required, whether as an argument or as $OPENAI_API_KEY");
19
+ }
20
+ this.#client = this.#opts.client || new OpenAI({
21
+ baseURL: opts.baseURL,
22
+ apiKey: opts.apiKey
23
+ });
24
+ }
25
+ label() {
26
+ return "openai.LLM";
27
+ }
28
+ get model() {
29
+ return this.#opts.model;
30
+ }
31
+ chat({
32
+ chatCtx,
33
+ toolCtx,
34
+ connOptions = DEFAULT_API_CONNECT_OPTIONS,
35
+ parallelToolCalls,
36
+ toolChoice,
37
+ extraKwargs
38
+ }) {
39
+ const extras = { ...extraKwargs };
40
+ if (this.#opts.metadata) {
41
+ extras.metadata = this.#opts.metadata;
42
+ }
43
+ if (this.#opts.user) {
44
+ extras.user = this.#opts.user;
45
+ }
46
+ if (this.#opts.maxCompletionTokens) {
47
+ extras.max_completion_tokens = this.#opts.maxCompletionTokens;
48
+ }
49
+ if (this.#opts.temperature) {
50
+ extras.temperature = this.#opts.temperature;
51
+ }
52
+ if (this.#opts.serviceTier) {
53
+ extras.service_tier = this.#opts.serviceTier;
54
+ }
55
+ if (this.#opts.store !== void 0) {
56
+ extras.store = this.#opts.store;
57
+ }
58
+ parallelToolCalls = parallelToolCalls !== void 0 ? parallelToolCalls : this.#opts.parallelToolCalls;
59
+ if (toolCtx && Object.keys(toolCtx).length > 0 && parallelToolCalls !== void 0) {
60
+ extras.parallel_tool_calls = parallelToolCalls;
61
+ }
62
+ toolChoice = toolChoice !== void 0 ? toolChoice : this.#opts.toolChoice;
63
+ if (toolChoice) {
64
+ extras.tool_choice = toolChoice;
65
+ }
66
+ return new LLMStream(this, {
67
+ model: this.#opts.model,
68
+ providerFmt: this.#providerFmt,
69
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
70
+ client: this.#client,
71
+ chatCtx,
72
+ toolCtx,
73
+ connOptions,
74
+ modelOptions: extras,
75
+ strictToolSchema: this.#opts.strictToolSchema || false,
76
+ gatewayOptions: void 0
77
+ // OpenAI plugin doesn't use gateway authentication
78
+ });
79
+ }
80
+ }
81
+ class LLMStream extends inference.LLMStream {
82
+ }
83
+ class LLM extends OpenAILLM {
84
+ constructor(opts) {
85
+ const apiKey = opts.apiKey ?? process.env.BASETEN_API_KEY;
86
+ if (!apiKey) {
87
+ throw new Error(
88
+ "Baseten API key is required. Set BASETEN_API_KEY environment variable or pass apiKey in options."
89
+ );
90
+ }
91
+ if (!opts.model) {
92
+ throw new Error(
93
+ 'Model is required. Please specify a model name (e.g., "openai/gpt-4o-mini").'
94
+ );
95
+ }
96
+ const model = opts.model;
97
+ super({
98
+ model,
99
+ apiKey,
100
+ baseURL: "https://inference.baseten.co/v1",
101
+ temperature: opts.temperature,
102
+ user: opts.user,
103
+ maxCompletionTokens: opts.maxTokens,
104
+ toolChoice: opts.toolChoice,
105
+ parallelToolCalls: opts.parallelToolCalls
106
+ });
107
+ }
108
+ label() {
109
+ return "baseten.LLM";
110
+ }
111
+ }
112
+ export {
113
+ LLM,
114
+ LLMStream,
115
+ OpenAILLM
116
+ };
117
+ //# sourceMappingURL=llm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/llm.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2024 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\n\n/**\n * Baseten LLM plugin for LiveKit Agents\n * Configures the OpenAI plugin to work with Baseten's OpenAI-compatible API\n */\nimport type { APIConnectOptions } from '@livekit/agents';\nimport { DEFAULT_API_CONNECT_OPTIONS, inference, llm } from '@livekit/agents';\nimport { OpenAI } from 'openai';\nimport type { BasetenLLMOptions } from './types.js';\n\nexport interface LLMOptions {\n model: string;\n apiKey?: string;\n baseURL?: string;\n user?: string;\n temperature?: number;\n client?: OpenAI;\n toolChoice?: llm.ToolChoice;\n parallelToolCalls?: boolean;\n metadata?: Record<string, string>;\n maxCompletionTokens?: number;\n serviceTier?: string;\n store?: boolean;\n strictToolSchema?: boolean;\n}\n\nconst defaultLLMOptions: LLMOptions = {\n model: 'openai/gpt-4o-mini',\n apiKey: process.env.OPENAI_API_KEY,\n parallelToolCalls: true,\n strictToolSchema: false,\n};\n\nexport class OpenAILLM extends llm.LLM {\n #opts: LLMOptions;\n #client: OpenAI;\n #providerFmt: llm.ProviderFormat;\n\n constructor(\n opts: Partial<LLMOptions> = defaultLLMOptions,\n providerFmt: llm.ProviderFormat = 'openai',\n ) {\n super();\n\n this.#opts = { ...defaultLLMOptions, ...opts };\n this.#providerFmt = providerFmt;\n if (this.#opts.apiKey === undefined) {\n throw new Error('OpenAI API key is required, whether as an argument or as $OPENAI_API_KEY');\n }\n\n this.#client =\n this.#opts.client ||\n new OpenAI({\n baseURL: opts.baseURL,\n apiKey: opts.apiKey,\n });\n }\n\n label(): string {\n return 'openai.LLM';\n }\n\n get model(): string {\n return this.#opts.model;\n }\n\n chat({\n chatCtx,\n toolCtx,\n connOptions = DEFAULT_API_CONNECT_OPTIONS,\n parallelToolCalls,\n toolChoice,\n extraKwargs,\n }: {\n chatCtx: llm.ChatContext;\n toolCtx?: llm.ToolContext;\n connOptions?: APIConnectOptions;\n parallelToolCalls?: boolean;\n toolChoice?: llm.ToolChoice;\n extraKwargs?: Record<string, unknown>;\n }): inference.LLMStream {\n const extras: Record<string, unknown> = { ...extraKwargs };\n\n if (this.#opts.metadata) {\n extras.metadata = this.#opts.metadata;\n }\n\n if (this.#opts.user) {\n extras.user = this.#opts.user;\n }\n\n if (this.#opts.maxCompletionTokens) {\n extras.max_completion_tokens = this.#opts.maxCompletionTokens;\n }\n\n if (this.#opts.temperature) {\n extras.temperature = this.#opts.temperature;\n }\n\n if (this.#opts.serviceTier) {\n extras.service_tier = this.#opts.serviceTier;\n }\n\n if (this.#opts.store !== undefined) {\n extras.store = this.#opts.store;\n }\n\n parallelToolCalls =\n parallelToolCalls !== undefined ? parallelToolCalls : this.#opts.parallelToolCalls;\n if (toolCtx && Object.keys(toolCtx).length > 0 && parallelToolCalls !== undefined) {\n extras.parallel_tool_calls = parallelToolCalls;\n }\n\n toolChoice = toolChoice !== undefined ? toolChoice : this.#opts.toolChoice;\n if (toolChoice) {\n extras.tool_choice = toolChoice;\n }\n\n return new LLMStream(this as unknown as inference.LLM, {\n model: this.#opts.model,\n providerFmt: this.#providerFmt,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n client: this.#client as any,\n chatCtx,\n toolCtx,\n connOptions,\n modelOptions: extras,\n strictToolSchema: this.#opts.strictToolSchema || false,\n gatewayOptions: undefined, // OpenAI plugin doesn't use gateway authentication\n });\n }\n}\n\nexport class LLMStream extends inference.LLMStream {}\n\nexport class LLM extends OpenAILLM {\n constructor(opts: BasetenLLMOptions) {\n const apiKey = opts.apiKey ?? process.env.BASETEN_API_KEY;\n if (!apiKey) {\n throw new Error(\n 'Baseten API key is required. Set BASETEN_API_KEY environment variable or pass apiKey in options.',\n );\n }\n\n if (!opts.model) {\n throw new Error(\n 'Model is required. Please specify a model name (e.g., \"openai/gpt-4o-mini\").',\n );\n }\n\n const model = opts.model;\n\n // Configure the OpenAI plugin with Baseten's endpoint\n super({\n model,\n apiKey,\n baseURL: 'https://inference.baseten.co/v1',\n temperature: opts.temperature,\n user: opts.user,\n maxCompletionTokens: opts.maxTokens,\n toolChoice: opts.toolChoice,\n parallelToolCalls: opts.parallelToolCalls,\n });\n }\n\n label(): string {\n return 'baseten.LLM';\n }\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+ var import_agents_plugins_test = require("@livekit/agents-plugins-test");
3
+ var import_vitest = require("vitest");
4
+ var import_llm = require("./llm.cjs");
5
+ (0, import_vitest.describe)("Baseten", async () => {
6
+ await (0, import_agents_plugins_test.llm)(
7
+ new import_llm.LLM({
8
+ model: "openai/gpt-4o-mini",
9
+ temperature: 0
10
+ }),
11
+ false
12
+ );
13
+ });
14
+ //# sourceMappingURL=llm.test.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/llm.test.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2024 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\nimport { llm } from '@livekit/agents-plugins-test';\nimport { describe } from 'vitest';\nimport { LLM } from './llm.js';\n\ndescribe('Baseten', async () => {\n await llm(\n new LLM({\n model: 'openai/gpt-4o-mini',\n temperature: 0,\n }),\n false,\n );\n});\n"],"mappings":";AAGA,iCAAoB;AACpB,oBAAyB;AACzB,iBAAoB;AAAA,IAEpB,wBAAS,WAAW,YAAY;AAC9B,YAAM;AAAA,IACJ,IAAI,eAAI;AAAA,MACN,OAAO;AAAA,MACP,aAAa;AAAA,IACf,CAAC;AAAA,IACD;AAAA,EACF;AACF,CAAC;","names":[]}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=llm.test.d.ts.map
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=llm.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"llm.test.d.ts","sourceRoot":"","sources":["../src/llm.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,13 @@
1
+ import { llm } from "@livekit/agents-plugins-test";
2
+ import { describe } from "vitest";
3
+ import { LLM } from "./llm.js";
4
+ describe("Baseten", async () => {
5
+ await llm(
6
+ new LLM({
7
+ model: "openai/gpt-4o-mini",
8
+ temperature: 0
9
+ }),
10
+ false
11
+ );
12
+ });
13
+ //# sourceMappingURL=llm.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/llm.test.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2024 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\nimport { llm } from '@livekit/agents-plugins-test';\nimport { describe } from 'vitest';\nimport { LLM } from './llm.js';\n\ndescribe('Baseten', async () => {\n await llm(\n new LLM({\n model: 'openai/gpt-4o-mini',\n temperature: 0,\n }),\n false,\n );\n});\n"],"mappings":"AAGA,SAAS,WAAW;AACpB,SAAS,gBAAgB;AACzB,SAAS,WAAW;AAEpB,SAAS,WAAW,YAAY;AAC9B,QAAM;AAAA,IACJ,IAAI,IAAI;AAAA,MACN,OAAO;AAAA,MACP,aAAa;AAAA,IACf,CAAC;AAAA,IACD;AAAA,EACF;AACF,CAAC;","names":[]}
package/dist/stt.cjs ADDED
@@ -0,0 +1,271 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+ var stt_exports = {};
20
+ __export(stt_exports, {
21
+ STT: () => STT,
22
+ SpeechStream: () => SpeechStream
23
+ });
24
+ module.exports = __toCommonJS(stt_exports);
25
+ var import_agents = require("@livekit/agents");
26
+ var import_ws = require("ws");
27
+ const defaultSTTOptions = {
28
+ environment: "production",
29
+ encoding: "pcm_s16le",
30
+ sampleRate: 16e3,
31
+ bufferSizeSeconds: 0.032,
32
+ enablePartialTranscripts: true,
33
+ partialTranscriptIntervalS: 0.5,
34
+ finalTranscriptMaxDurationS: 5,
35
+ audioLanguage: "en",
36
+ languageDetectionOnly: false,
37
+ vadThreshold: 0.5,
38
+ vadMinSilenceDurationMs: 300,
39
+ vadSpeechPadMs: 30
40
+ };
41
+ class STT extends import_agents.stt.STT {
42
+ #opts;
43
+ #logger = (0, import_agents.log)();
44
+ label = "baseten.STT";
45
+ constructor(opts = {}) {
46
+ super({
47
+ streaming: true,
48
+ interimResults: opts.enablePartialTranscripts ?? defaultSTTOptions.enablePartialTranscripts
49
+ });
50
+ const apiKey = opts.apiKey ?? process.env.BASETEN_API_KEY;
51
+ const modelId = opts.modelId ?? process.env.BASETEN_STT_MODEL_ID;
52
+ if (!apiKey) {
53
+ throw new Error(
54
+ "Baseten API key is required, either pass it as `apiKey` or set $BASETEN_API_KEY"
55
+ );
56
+ }
57
+ if (!modelId) {
58
+ throw new Error(
59
+ "Baseten model ID is required, either pass it as `modelId` or set $BASETEN_STT_MODEL_ID"
60
+ );
61
+ }
62
+ this.#opts = {
63
+ ...defaultSTTOptions,
64
+ ...opts,
65
+ apiKey,
66
+ modelId
67
+ };
68
+ }
69
+ // eslint-disable-next-line
70
+ async _recognize(_) {
71
+ throw new Error("Recognize is not supported on Baseten STT");
72
+ }
73
+ updateOptions(opts) {
74
+ this.#opts = { ...this.#opts, ...opts };
75
+ }
76
+ stream() {
77
+ return new SpeechStream(this, this.#opts);
78
+ }
79
+ }
80
+ class SpeechStream extends import_agents.stt.SpeechStream {
81
+ #opts;
82
+ #logger = (0, import_agents.log)();
83
+ #speaking = false;
84
+ #requestId = "";
85
+ label = "baseten.SpeechStream";
86
+ constructor(stt2, opts) {
87
+ super(stt2, opts.sampleRate);
88
+ this.#opts = opts;
89
+ this.closed = false;
90
+ }
91
+ getWsUrl() {
92
+ return `wss://model-${this.#opts.modelId}.api.baseten.co/environments/${this.#opts.environment}/websocket`;
93
+ }
94
+ async run() {
95
+ const maxRetry = 32;
96
+ let retries = 0;
97
+ while (!this.input.closed && !this.closed) {
98
+ const url = this.getWsUrl();
99
+ const headers = {
100
+ Authorization: `Api-Key ${this.#opts.apiKey}`
101
+ };
102
+ const ws = new import_ws.WebSocket(url, { headers });
103
+ try {
104
+ await new Promise((resolve, reject) => {
105
+ ws.on("open", resolve);
106
+ ws.on("error", (error) => reject(error));
107
+ ws.on("close", (code) => reject(`WebSocket returned ${code}`));
108
+ });
109
+ await this.#runWS(ws);
110
+ } catch (e) {
111
+ if (!this.closed && !this.input.closed) {
112
+ if (retries >= maxRetry) {
113
+ throw new Error(`failed to connect to Baseten after ${retries} attempts: ${e}`);
114
+ }
115
+ const delay = Math.min(retries * 5, 10);
116
+ retries++;
117
+ this.#logger.warn(
118
+ `failed to connect to Baseten, retrying in ${delay} seconds: ${e} (${retries}/${maxRetry})`
119
+ );
120
+ await new Promise((resolve) => setTimeout(resolve, delay * 1e3));
121
+ } else {
122
+ this.#logger.warn(
123
+ `Baseten disconnected, connection is closed: ${e} (inputClosed: ${this.input.closed}, isClosed: ${this.closed})`
124
+ );
125
+ }
126
+ }
127
+ }
128
+ this.closed = true;
129
+ }
130
+ async #runWS(ws) {
131
+ let closing = false;
132
+ const metadata = {
133
+ streaming_vad_config: {
134
+ threshold: this.#opts.vadThreshold,
135
+ min_silence_duration_ms: this.#opts.vadMinSilenceDurationMs,
136
+ speech_pad_ms: this.#opts.vadSpeechPadMs
137
+ },
138
+ streaming_params: {
139
+ encoding: this.#opts.encoding ?? "pcm_s16le",
140
+ sample_rate: this.#opts.sampleRate ?? 16e3,
141
+ enable_partial_transcripts: this.#opts.enablePartialTranscripts,
142
+ partial_transcript_interval_s: this.#opts.partialTranscriptIntervalS,
143
+ final_transcript_max_duration_s: this.#opts.finalTranscriptMaxDurationS
144
+ },
145
+ whisper_params: {
146
+ prompt: this.#opts.prompt,
147
+ audio_language: this.#opts.audioLanguage ?? "en",
148
+ language_detection_only: this.#opts.languageDetectionOnly ?? false
149
+ }
150
+ };
151
+ ws.send(JSON.stringify(metadata));
152
+ const sendTask = async () => {
153
+ const sampleRate = this.#opts.sampleRate ?? 16e3;
154
+ const samplesPerChunk = sampleRate === 16e3 ? 512 : 256;
155
+ const audioByteStream = new import_agents.AudioByteStream(sampleRate, 1, samplesPerChunk);
156
+ try {
157
+ while (!this.closed) {
158
+ const result = await this.input.next();
159
+ if (result.done) {
160
+ break;
161
+ }
162
+ const data = result.value;
163
+ let frames;
164
+ if (data === SpeechStream.FLUSH_SENTINEL) {
165
+ frames = audioByteStream.flush();
166
+ } else {
167
+ if (data.sampleRate !== sampleRate || data.channels !== 1) {
168
+ throw new Error(
169
+ `sample rate or channel count mismatch: expected ${sampleRate}Hz/1ch, got ${data.sampleRate}Hz/${data.channels}ch`
170
+ );
171
+ }
172
+ frames = audioByteStream.write(data.data.buffer);
173
+ }
174
+ for (const frame of frames) {
175
+ const buffer = Buffer.from(
176
+ frame.data.buffer,
177
+ frame.data.byteOffset,
178
+ frame.data.byteLength
179
+ );
180
+ ws.send(buffer);
181
+ }
182
+ }
183
+ } finally {
184
+ closing = true;
185
+ ws.close();
186
+ }
187
+ };
188
+ const listenTask = import_agents.Task.from(async (controller) => {
189
+ const listenMessage = new Promise((resolve, reject) => {
190
+ ws.on("message", (data) => {
191
+ try {
192
+ let jsonString;
193
+ if (typeof data === "string") {
194
+ jsonString = data;
195
+ } else if (data instanceof Buffer) {
196
+ jsonString = data.toString("utf-8");
197
+ } else if (Array.isArray(data)) {
198
+ jsonString = Buffer.concat(data).toString("utf-8");
199
+ } else {
200
+ return;
201
+ }
202
+ const msg = JSON.parse(jsonString);
203
+ const isFinal = msg.is_final ?? true;
204
+ const segments = msg.segments ?? [];
205
+ const transcript = msg.transcript ?? "";
206
+ const confidence = msg.confidence ?? 0;
207
+ const languageCode = msg.language_code ?? this.#opts.audioLanguage;
208
+ if (!transcript) {
209
+ this.#logger.debug("Received non-transcript message:", msg);
210
+ return;
211
+ }
212
+ if (!this.#speaking && !isFinal) {
213
+ this.#speaking = true;
214
+ this.queue.put({ type: import_agents.stt.SpeechEventType.START_OF_SPEECH });
215
+ }
216
+ const startTime = segments.length > 0 ? segments[0].start ?? 0 : 0;
217
+ const endTime = segments.length > 0 ? segments[segments.length - 1].end ?? 0 : 0;
218
+ const speechData = {
219
+ language: languageCode,
220
+ text: transcript,
221
+ startTime,
222
+ endTime,
223
+ confidence
224
+ };
225
+ if (!isFinal) {
226
+ this.queue.put({
227
+ type: import_agents.stt.SpeechEventType.INTERIM_TRANSCRIPT,
228
+ alternatives: [speechData]
229
+ });
230
+ } else {
231
+ this.queue.put({
232
+ type: import_agents.stt.SpeechEventType.FINAL_TRANSCRIPT,
233
+ alternatives: [speechData]
234
+ });
235
+ if (this.#speaking) {
236
+ this.#speaking = false;
237
+ this.queue.put({ type: import_agents.stt.SpeechEventType.END_OF_SPEECH });
238
+ }
239
+ }
240
+ if (this.closed || closing) {
241
+ resolve();
242
+ }
243
+ } catch (err) {
244
+ this.#logger.error(`STT: Error processing message: ${data}`);
245
+ reject(err);
246
+ }
247
+ });
248
+ ws.on("error", (err) => {
249
+ if (!closing) {
250
+ reject(err);
251
+ }
252
+ });
253
+ ws.on("close", () => {
254
+ if (!closing) {
255
+ resolve();
256
+ }
257
+ });
258
+ });
259
+ await Promise.race([listenMessage, (0, import_agents.waitForAbort)(controller.signal)]);
260
+ }, this.abortController);
261
+ await Promise.all([sendTask(), listenTask.result]);
262
+ closing = true;
263
+ ws.close();
264
+ }
265
+ }
266
+ // Annotate the CommonJS export names for ESM import in node:
267
+ 0 && (module.exports = {
268
+ STT,
269
+ SpeechStream
270
+ });
271
+ //# sourceMappingURL=stt.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/stt.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2024 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\nimport { type AudioBuffer, AudioByteStream, Task, log, stt, waitForAbort } from '@livekit/agents';\nimport type { AudioFrame } from '@livekit/rtc-node';\nimport { WebSocket } from 'ws';\nimport type { BasetenSttOptions } from './types.js';\n\nconst defaultSTTOptions: Partial<BasetenSttOptions> = {\n environment: 'production',\n encoding: 'pcm_s16le',\n sampleRate: 16000,\n bufferSizeSeconds: 0.032,\n enablePartialTranscripts: true,\n partialTranscriptIntervalS: 0.5,\n finalTranscriptMaxDurationS: 5,\n audioLanguage: 'en',\n languageDetectionOnly: false,\n vadThreshold: 0.5,\n vadMinSilenceDurationMs: 300,\n vadSpeechPadMs: 30,\n};\n\nexport class STT extends stt.STT {\n #opts: BasetenSttOptions;\n #logger = log();\n label = 'baseten.STT';\n\n constructor(opts: Partial<BasetenSttOptions> = {}) {\n super({\n streaming: true,\n interimResults: opts.enablePartialTranscripts ?? defaultSTTOptions.enablePartialTranscripts!,\n });\n\n const apiKey = opts.apiKey ?? process.env.BASETEN_API_KEY;\n const modelId = opts.modelId ?? process.env.BASETEN_STT_MODEL_ID;\n\n if (!apiKey) {\n throw new Error(\n 'Baseten API key is required, either pass it as `apiKey` or set $BASETEN_API_KEY',\n );\n }\n if (!modelId) {\n throw new Error(\n 'Baseten model ID is required, either pass it as `modelId` or set $BASETEN_STT_MODEL_ID',\n );\n }\n\n this.#opts = {\n ...defaultSTTOptions,\n ...opts,\n apiKey,\n modelId,\n } as BasetenSttOptions;\n }\n\n // eslint-disable-next-line\n async _recognize(_: AudioBuffer): Promise<stt.SpeechEvent> {\n throw new Error('Recognize is not supported on Baseten STT');\n }\n\n updateOptions(opts: Partial<BasetenSttOptions>) {\n this.#opts = { ...this.#opts, ...opts };\n }\n\n stream(): SpeechStream {\n return new SpeechStream(this, this.#opts);\n }\n}\n\nexport class SpeechStream extends stt.SpeechStream {\n #opts: BasetenSttOptions;\n #logger = log();\n #speaking = false;\n #requestId = '';\n label = 'baseten.SpeechStream';\n\n constructor(stt: STT, opts: BasetenSttOptions) {\n super(stt, opts.sampleRate);\n this.#opts = opts;\n this.closed = false;\n }\n\n private getWsUrl(): string {\n return `wss://model-${this.#opts.modelId}.api.baseten.co/environments/${this.#opts.environment}/websocket`;\n }\n\n protected async run() {\n const maxRetry = 32;\n let retries = 0;\n\n while (!this.input.closed && !this.closed) {\n const url = this.getWsUrl();\n const headers = {\n Authorization: `Api-Key ${this.#opts.apiKey}`,\n };\n\n const ws = new WebSocket(url, { headers });\n\n try {\n await new Promise((resolve, reject) => {\n ws.on('open', resolve);\n ws.on('error', (error) => reject(error));\n ws.on('close', (code) => reject(`WebSocket returned ${code}`));\n });\n\n await this.#runWS(ws);\n } catch (e) {\n if (!this.closed && !this.input.closed) {\n if (retries >= maxRetry) {\n throw new Error(`failed to connect to Baseten after ${retries} attempts: ${e}`);\n }\n\n const delay = Math.min(retries * 5, 10);\n retries++;\n\n this.#logger.warn(\n `failed to connect to Baseten, retrying in ${delay} seconds: ${e} (${retries}/${maxRetry})`,\n );\n await new Promise((resolve) => setTimeout(resolve, delay * 1000));\n } else {\n this.#logger.warn(\n `Baseten disconnected, connection is closed: ${e} (inputClosed: ${this.input.closed}, isClosed: ${this.closed})`,\n );\n }\n }\n }\n\n this.closed = true;\n }\n\n async #runWS(ws: WebSocket) {\n let closing = false;\n\n // Send initial metadata\n const metadata = {\n streaming_vad_config: {\n threshold: this.#opts.vadThreshold,\n min_silence_duration_ms: this.#opts.vadMinSilenceDurationMs,\n speech_pad_ms: this.#opts.vadSpeechPadMs,\n },\n streaming_params: {\n encoding: this.#opts.encoding ?? 'pcm_s16le',\n sample_rate: this.#opts.sampleRate ?? 16000,\n enable_partial_transcripts: this.#opts.enablePartialTranscripts,\n partial_transcript_interval_s: this.#opts.partialTranscriptIntervalS,\n final_transcript_max_duration_s: this.#opts.finalTranscriptMaxDurationS,\n },\n whisper_params: {\n prompt: this.#opts.prompt,\n audio_language: this.#opts.audioLanguage ?? 'en',\n language_detection_only: this.#opts.languageDetectionOnly ?? false,\n },\n };\n ws.send(JSON.stringify(metadata));\n\n const sendTask = async () => {\n const sampleRate = this.#opts.sampleRate ?? 16000;\n const samplesPerChunk = sampleRate === 16000 ? 512 : 256;\n const audioByteStream = new AudioByteStream(sampleRate, 1, samplesPerChunk);\n\n try {\n while (!this.closed) {\n const result = await this.input.next();\n if (result.done) {\n break;\n }\n\n const data = result.value;\n\n let frames: AudioFrame[];\n if (data === SpeechStream.FLUSH_SENTINEL) {\n // Flush any remaining buffered audio\n frames = audioByteStream.flush();\n } else {\n if (data.sampleRate !== sampleRate || data.channels !== 1) {\n throw new Error(\n `sample rate or channel count mismatch: expected ${sampleRate}Hz/1ch, got ${data.sampleRate}Hz/${data.channels}ch`,\n );\n }\n frames = audioByteStream.write(data.data.buffer as ArrayBuffer);\n }\n\n for (const frame of frames) {\n const buffer = Buffer.from(\n frame.data.buffer,\n frame.data.byteOffset,\n frame.data.byteLength,\n );\n ws.send(buffer);\n }\n }\n } finally {\n closing = true;\n ws.close();\n }\n };\n\n const listenTask = Task.from(async (controller) => {\n const listenMessage = new Promise<void>((resolve, reject) => {\n ws.on('message', (data) => {\n try {\n let jsonString: string;\n\n if (typeof data === 'string') {\n jsonString = data;\n } else if (data instanceof Buffer) {\n jsonString = data.toString('utf-8');\n } else if (Array.isArray(data)) {\n jsonString = Buffer.concat(data).toString('utf-8');\n } else {\n return;\n }\n\n const msg = JSON.parse(jsonString);\n\n // Parse response format matching Python implementation\n const isFinal = msg.is_final ?? true;\n const segments = msg.segments ?? [];\n const transcript = msg.transcript ?? '';\n const confidence = msg.confidence ?? 0.0;\n const languageCode = msg.language_code ?? this.#opts.audioLanguage;\n\n // Skip if no transcript text\n if (!transcript) {\n this.#logger.debug('Received non-transcript message:', msg);\n return;\n }\n\n // Emit START_OF_SPEECH if not already speaking (only for interim or first final)\n if (!this.#speaking && !isFinal) {\n this.#speaking = true;\n this.queue.put({ type: stt.SpeechEventType.START_OF_SPEECH });\n }\n\n // Extract timing from segments\n const startTime = segments.length > 0 ? segments[0].start ?? 0.0 : 0.0;\n const endTime = segments.length > 0 ? segments[segments.length - 1].end ?? 0.0 : 0.0;\n\n const speechData: stt.SpeechData = {\n language: languageCode!,\n text: transcript,\n startTime,\n endTime,\n confidence,\n };\n\n // Handle interim vs final transcripts (matching Python implementation)\n if (!isFinal) {\n // Interim transcript\n this.queue.put({\n type: stt.SpeechEventType.INTERIM_TRANSCRIPT,\n alternatives: [speechData],\n });\n } else {\n // Final transcript\n this.queue.put({\n type: stt.SpeechEventType.FINAL_TRANSCRIPT,\n alternatives: [speechData],\n });\n\n // Emit END_OF_SPEECH after final transcript\n if (this.#speaking) {\n this.#speaking = false;\n this.queue.put({ type: stt.SpeechEventType.END_OF_SPEECH });\n }\n }\n\n if (this.closed || closing) {\n resolve();\n }\n } catch (err) {\n this.#logger.error(`STT: Error processing message: ${data}`);\n reject(err);\n }\n });\n\n ws.on('error', (err) => {\n if (!closing) {\n reject(err);\n }\n });\n\n ws.on('close', () => {\n if (!closing) {\n resolve();\n }\n });\n });\n\n await Promise.race([listenMessage, waitForAbort(controller.signal)]);\n }, this.abortController);\n\n await Promise.all([sendTask(), listenTask.result]);\n closing = true;\n ws.close();\n }\n}\n"],"mappings":"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","names":["stt"]}
package/dist/stt.d.cts ADDED
@@ -0,0 +1,18 @@
1
+ import { type AudioBuffer, stt } from '@livekit/agents';
2
+ import type { BasetenSttOptions } from './types.js';
3
+ export declare class STT extends stt.STT {
4
+ #private;
5
+ label: string;
6
+ constructor(opts?: Partial<BasetenSttOptions>);
7
+ _recognize(_: AudioBuffer): Promise<stt.SpeechEvent>;
8
+ updateOptions(opts: Partial<BasetenSttOptions>): void;
9
+ stream(): SpeechStream;
10
+ }
11
+ export declare class SpeechStream extends stt.SpeechStream {
12
+ #private;
13
+ label: string;
14
+ constructor(stt: STT, opts: BasetenSttOptions);
15
+ private getWsUrl;
16
+ protected run(): Promise<void>;
17
+ }
18
+ //# sourceMappingURL=stt.d.ts.map
package/dist/stt.d.ts ADDED
@@ -0,0 +1,18 @@
1
+ import { type AudioBuffer, stt } from '@livekit/agents';
2
+ import type { BasetenSttOptions } from './types.js';
3
+ export declare class STT extends stt.STT {
4
+ #private;
5
+ label: string;
6
+ constructor(opts?: Partial<BasetenSttOptions>);
7
+ _recognize(_: AudioBuffer): Promise<stt.SpeechEvent>;
8
+ updateOptions(opts: Partial<BasetenSttOptions>): void;
9
+ stream(): SpeechStream;
10
+ }
11
+ export declare class SpeechStream extends stt.SpeechStream {
12
+ #private;
13
+ label: string;
14
+ constructor(stt: STT, opts: BasetenSttOptions);
15
+ private getWsUrl;
16
+ protected run(): Promise<void>;
17
+ }
18
+ //# sourceMappingURL=stt.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stt.d.ts","sourceRoot":"","sources":["../src/stt.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,WAAW,EAA8B,GAAG,EAAgB,MAAM,iBAAiB,CAAC;AAGlG,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAiBpD,qBAAa,GAAI,SAAQ,GAAG,CAAC,GAAG;;IAG9B,KAAK,SAAiB;gBAEV,IAAI,GAAE,OAAO,CAAC,iBAAiB,CAAM;IA6B3C,UAAU,CAAC,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC;IAI1D,aAAa,CAAC,IAAI,EAAE,OAAO,CAAC,iBAAiB,CAAC;IAI9C,MAAM,IAAI,YAAY;CAGvB;AAED,qBAAa,YAAa,SAAQ,GAAG,CAAC,YAAY;;IAKhD,KAAK,SAA0B;gBAEnB,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,iBAAiB;IAM7C,OAAO,CAAC,QAAQ;cAIA,GAAG;CAkNpB"}