@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.
- package/LICENSE +201 -0
- package/README.md +92 -0
- package/dist/index.cjs +48 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +5 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +21 -0
- package/dist/index.js.map +1 -0
- package/dist/llm.cjs +143 -0
- package/dist/llm.cjs.map +1 -0
- package/dist/llm.d.cts +44 -0
- package/dist/llm.d.ts +44 -0
- package/dist/llm.d.ts.map +1 -0
- package/dist/llm.js +117 -0
- package/dist/llm.js.map +1 -0
- package/dist/llm.test.cjs +14 -0
- package/dist/llm.test.cjs.map +1 -0
- package/dist/llm.test.d.cts +2 -0
- package/dist/llm.test.d.ts +2 -0
- package/dist/llm.test.d.ts.map +1 -0
- package/dist/llm.test.js +13 -0
- package/dist/llm.test.js.map +1 -0
- package/dist/stt.cjs +271 -0
- package/dist/stt.cjs.map +1 -0
- package/dist/stt.d.cts +18 -0
- package/dist/stt.d.ts +18 -0
- package/dist/stt.d.ts.map +1 -0
- package/dist/stt.js +246 -0
- package/dist/stt.js.map +1 -0
- package/dist/stt.test.cjs +9 -0
- package/dist/stt.test.cjs.map +1 -0
- package/dist/stt.test.d.cts +2 -0
- package/dist/stt.test.d.ts +2 -0
- package/dist/stt.test.d.ts.map +1 -0
- package/dist/stt.test.js +8 -0
- package/dist/stt.test.js.map +1 -0
- package/dist/tts.cjs +161 -0
- package/dist/tts.cjs.map +1 -0
- package/dist/tts.d.cts +45 -0
- package/dist/tts.d.ts +45 -0
- package/dist/tts.d.ts.map +1 -0
- package/dist/tts.js +141 -0
- package/dist/tts.js.map +1 -0
- package/dist/tts.test.cjs +9 -0
- package/dist/tts.test.cjs.map +1 -0
- package/dist/tts.test.d.cts +2 -0
- package/dist/tts.test.d.ts +2 -0
- package/dist/tts.test.d.ts.map +1 -0
- package/dist/tts.test.js +8 -0
- package/dist/tts.test.js.map +1 -0
- package/dist/types.cjs +17 -0
- package/dist/types.cjs.map +1 -0
- package/dist/types.d.cts +54 -0
- package/dist/types.d.ts +54 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +1 -0
- package/dist/types.js.map +1 -0
- package/package.json +68 -0
- package/src/index.ts +20 -0
- package/src/llm.test.ts +16 -0
- package/src/llm.ts +172 -0
- package/src/stt.test.ts +11 -0
- package/src/stt.ts +298 -0
- package/src/tts.test.ts +11 -0
- package/src/tts.ts +202 -0
- 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
|
package/dist/llm.js.map
ADDED
|
@@ -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 @@
|
|
|
1
|
+
{"version":3,"file":"llm.test.d.ts","sourceRoot":"","sources":["../src/llm.test.ts"],"names":[],"mappings":""}
|
package/dist/llm.test.js
ADDED
|
@@ -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
|
package/dist/stt.cjs.map
ADDED
|
@@ -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"}
|