@livekit/agents-plugin-openai 1.0.49 → 1.0.51
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/index.cjs +5 -2
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -2
- package/dist/index.js.map +1 -1
- package/dist/llm.test.cjs +31 -16
- package/dist/llm.test.cjs.map +1 -1
- package/dist/llm.test.js +32 -17
- package/dist/llm.test.js.map +1 -1
- package/dist/responses/llm.cjs +71 -16
- package/dist/responses/llm.cjs.map +1 -1
- package/dist/responses/llm.d.cts +10 -25
- package/dist/responses/llm.d.ts +10 -25
- package/dist/responses/llm.d.ts.map +1 -1
- package/dist/responses/llm.js +71 -14
- package/dist/responses/llm.js.map +1 -1
- package/dist/responses/llm.test.cjs +32 -17
- package/dist/responses/llm.test.cjs.map +1 -1
- package/dist/responses/llm.test.js +33 -18
- package/dist/responses/llm.test.js.map +1 -1
- package/dist/stt.cjs +7 -3
- package/dist/stt.cjs.map +1 -1
- package/dist/stt.d.ts.map +1 -1
- package/dist/stt.js +8 -4
- package/dist/stt.js.map +1 -1
- package/dist/stt.test.cjs +11 -3
- package/dist/stt.test.cjs.map +1 -1
- package/dist/stt.test.js +12 -4
- package/dist/stt.test.js.map +1 -1
- package/dist/tts.test.cjs +11 -3
- package/dist/tts.test.cjs.map +1 -1
- package/dist/tts.test.js +12 -4
- package/dist/tts.test.js.map +1 -1
- package/dist/ws/index.cjs +29 -0
- package/dist/ws/index.cjs.map +1 -0
- package/dist/ws/index.d.cts +3 -0
- package/dist/ws/index.d.ts +3 -0
- package/dist/ws/index.d.ts.map +1 -0
- package/dist/ws/index.js +5 -0
- package/dist/ws/index.js.map +1 -0
- package/dist/ws/llm.cjs +502 -0
- package/dist/ws/llm.cjs.map +1 -0
- package/dist/ws/llm.d.cts +74 -0
- package/dist/ws/llm.d.ts +74 -0
- package/dist/ws/llm.d.ts.map +1 -0
- package/dist/ws/llm.js +485 -0
- package/dist/ws/llm.js.map +1 -0
- package/dist/ws/llm.test.cjs +26 -0
- package/dist/ws/llm.test.cjs.map +1 -0
- package/dist/ws/llm.test.d.cts +2 -0
- package/dist/ws/llm.test.d.ts +2 -0
- package/dist/ws/llm.test.d.ts.map +1 -0
- package/dist/ws/llm.test.js +25 -0
- package/dist/ws/llm.test.js.map +1 -0
- package/dist/ws/types.cjs +128 -0
- package/dist/ws/types.cjs.map +1 -0
- package/dist/ws/types.d.cts +167 -0
- package/dist/ws/types.d.ts +167 -0
- package/dist/ws/types.d.ts.map +1 -0
- package/dist/ws/types.js +95 -0
- package/dist/ws/types.js.map +1 -0
- package/package.json +6 -5
- package/src/index.ts +1 -0
- package/src/llm.test.ts +31 -17
- package/src/responses/llm.test.ts +32 -18
- package/src/responses/llm.ts +105 -19
- package/src/stt.test.ts +12 -4
- package/src/stt.ts +8 -4
- package/src/tts.test.ts +12 -4
- package/src/ws/index.ts +17 -0
- package/src/ws/llm.test.ts +30 -0
- package/src/ws/llm.ts +665 -0
- package/src/ws/types.ts +131 -0
package/dist/index.cjs
CHANGED
|
@@ -35,7 +35,8 @@ __export(index_exports, {
|
|
|
35
35
|
STT: () => import_stt.STT,
|
|
36
36
|
TTS: () => import_tts.TTS,
|
|
37
37
|
realtime: () => realtime,
|
|
38
|
-
responses: () => responses
|
|
38
|
+
responses: () => responses,
|
|
39
|
+
ws: () => ws
|
|
39
40
|
});
|
|
40
41
|
module.exports = __toCommonJS(index_exports);
|
|
41
42
|
var import_agents = require("@livekit/agents");
|
|
@@ -45,11 +46,12 @@ var realtime = __toESM(require("./realtime/index.cjs"), 1);
|
|
|
45
46
|
var responses = __toESM(require("./responses/index.cjs"), 1);
|
|
46
47
|
var import_stt = require("./stt.cjs");
|
|
47
48
|
var import_tts = require("./tts.cjs");
|
|
49
|
+
var ws = __toESM(require("./ws/index.cjs"), 1);
|
|
48
50
|
class OpenAIPlugin extends import_agents.Plugin {
|
|
49
51
|
constructor() {
|
|
50
52
|
super({
|
|
51
53
|
title: "openai",
|
|
52
|
-
version: "1.0.
|
|
54
|
+
version: "1.0.51",
|
|
53
55
|
package: "@livekit/agents-plugin-openai"
|
|
54
56
|
});
|
|
55
57
|
}
|
|
@@ -64,6 +66,7 @@ import_agents.Plugin.registerPlugin(new OpenAIPlugin());
|
|
|
64
66
|
TTS,
|
|
65
67
|
realtime,
|
|
66
68
|
responses,
|
|
69
|
+
ws,
|
|
67
70
|
...require("./models.cjs")
|
|
68
71
|
});
|
|
69
72
|
//# sourceMappingURL=index.cjs.map
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2025 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\nimport { Plugin } from '@livekit/agents';\n\nexport { LLM, LLMStream, type LLMOptions } from './llm.js';\nexport * from './models.js';\nexport * as realtime from './realtime/index.js';\nexport * as responses from './responses/index.js';\nexport { STT, type STTOptions } from './stt.js';\nexport { ChunkedStream, TTS, type TTSOptions } from './tts.js';\n\nclass OpenAIPlugin extends Plugin {\n constructor() {\n super({\n title: 'openai',\n version: __PACKAGE_VERSION__,\n package: __PACKAGE_NAME__,\n });\n }\n}\n\nPlugin.registerPlugin(new OpenAIPlugin());\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAGA,oBAAuB;AAEvB,iBAAgD;AAChD,0BAAc,wBANd;AAOA,eAA0B;AAC1B,gBAA2B;AAC3B,iBAAqC;AACrC,iBAAoD;
|
|
1
|
+
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2025 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\nimport { Plugin } from '@livekit/agents';\n\nexport { LLM, LLMStream, type LLMOptions } from './llm.js';\nexport * from './models.js';\nexport * as realtime from './realtime/index.js';\nexport * as responses from './responses/index.js';\nexport { STT, type STTOptions } from './stt.js';\nexport { ChunkedStream, TTS, type TTSOptions } from './tts.js';\nexport * as ws from './ws/index.js';\n\nclass OpenAIPlugin extends Plugin {\n constructor() {\n super({\n title: 'openai',\n version: __PACKAGE_VERSION__,\n package: __PACKAGE_NAME__,\n });\n }\n}\n\nPlugin.registerPlugin(new OpenAIPlugin());\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAGA,oBAAuB;AAEvB,iBAAgD;AAChD,0BAAc,wBANd;AAOA,eAA0B;AAC1B,gBAA2B;AAC3B,iBAAqC;AACrC,iBAAoD;AACpD,SAAoB;AAEpB,MAAM,qBAAqB,qBAAO;AAAA,EAChC,cAAc;AACZ,UAAM;AAAA,MACJ,OAAO;AAAA,MACP,SAAS;AAAA,MACT,SAAS;AAAA,IACX,CAAC;AAAA,EACH;AACF;AAEA,qBAAO,eAAe,IAAI,aAAa,CAAC;","names":[]}
|
package/dist/index.d.cts
CHANGED
|
@@ -4,4 +4,5 @@ export * as realtime from './realtime/index.js';
|
|
|
4
4
|
export * as responses from './responses/index.js';
|
|
5
5
|
export { STT, type STTOptions } from './stt.js';
|
|
6
6
|
export { ChunkedStream, TTS, type TTSOptions } from './tts.js';
|
|
7
|
+
export * as ws from './ws/index.js';
|
|
7
8
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts
CHANGED
|
@@ -4,4 +4,5 @@ export * as realtime from './realtime/index.js';
|
|
|
4
4
|
export * as responses from './responses/index.js';
|
|
5
5
|
export { STT, type STTOptions } from './stt.js';
|
|
6
6
|
export { ChunkedStream, TTS, type TTSOptions } from './tts.js';
|
|
7
|
+
export * as ws from './ws/index.js';
|
|
7
8
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,GAAG,EAAE,SAAS,EAAE,KAAK,UAAU,EAAE,MAAM,UAAU,CAAC;AAC3D,cAAc,aAAa,CAAC;AAC5B,OAAO,KAAK,QAAQ,MAAM,qBAAqB,CAAC;AAChD,OAAO,KAAK,SAAS,MAAM,sBAAsB,CAAC;AAClD,OAAO,EAAE,GAAG,EAAE,KAAK,UAAU,EAAE,MAAM,UAAU,CAAC;AAChD,OAAO,EAAE,aAAa,EAAE,GAAG,EAAE,KAAK,UAAU,EAAE,MAAM,UAAU,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,GAAG,EAAE,SAAS,EAAE,KAAK,UAAU,EAAE,MAAM,UAAU,CAAC;AAC3D,cAAc,aAAa,CAAC;AAC5B,OAAO,KAAK,QAAQ,MAAM,qBAAqB,CAAC;AAChD,OAAO,KAAK,SAAS,MAAM,sBAAsB,CAAC;AAClD,OAAO,EAAE,GAAG,EAAE,KAAK,UAAU,EAAE,MAAM,UAAU,CAAC;AAChD,OAAO,EAAE,aAAa,EAAE,GAAG,EAAE,KAAK,UAAU,EAAE,MAAM,UAAU,CAAC;AAC/D,OAAO,KAAK,EAAE,MAAM,eAAe,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -5,11 +5,12 @@ import * as realtime from "./realtime/index.js";
|
|
|
5
5
|
import * as responses from "./responses/index.js";
|
|
6
6
|
import { STT } from "./stt.js";
|
|
7
7
|
import { ChunkedStream, TTS } from "./tts.js";
|
|
8
|
+
import * as ws from "./ws/index.js";
|
|
8
9
|
class OpenAIPlugin extends Plugin {
|
|
9
10
|
constructor() {
|
|
10
11
|
super({
|
|
11
12
|
title: "openai",
|
|
12
|
-
version: "1.0.
|
|
13
|
+
version: "1.0.51",
|
|
13
14
|
package: "@livekit/agents-plugin-openai"
|
|
14
15
|
});
|
|
15
16
|
}
|
|
@@ -22,6 +23,7 @@ export {
|
|
|
22
23
|
STT,
|
|
23
24
|
TTS,
|
|
24
25
|
realtime,
|
|
25
|
-
responses
|
|
26
|
+
responses,
|
|
27
|
+
ws
|
|
26
28
|
};
|
|
27
29
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2025 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\nimport { Plugin } from '@livekit/agents';\n\nexport { LLM, LLMStream, type LLMOptions } from './llm.js';\nexport * from './models.js';\nexport * as realtime from './realtime/index.js';\nexport * as responses from './responses/index.js';\nexport { STT, type STTOptions } from './stt.js';\nexport { ChunkedStream, TTS, type TTSOptions } from './tts.js';\n\nclass OpenAIPlugin extends Plugin {\n constructor() {\n super({\n title: 'openai',\n version: __PACKAGE_VERSION__,\n package: __PACKAGE_NAME__,\n });\n }\n}\n\nPlugin.registerPlugin(new OpenAIPlugin());\n"],"mappings":"AAGA,SAAS,cAAc;AAEvB,SAAS,KAAK,iBAAkC;AAChD,cAAc;AACd,YAAY,cAAc;AAC1B,YAAY,eAAe;AAC3B,SAAS,WAA4B;AACrC,SAAS,eAAe,WAA4B;
|
|
1
|
+
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2025 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\nimport { Plugin } from '@livekit/agents';\n\nexport { LLM, LLMStream, type LLMOptions } from './llm.js';\nexport * from './models.js';\nexport * as realtime from './realtime/index.js';\nexport * as responses from './responses/index.js';\nexport { STT, type STTOptions } from './stt.js';\nexport { ChunkedStream, TTS, type TTSOptions } from './tts.js';\nexport * as ws from './ws/index.js';\n\nclass OpenAIPlugin extends Plugin {\n constructor() {\n super({\n title: 'openai',\n version: __PACKAGE_VERSION__,\n package: __PACKAGE_NAME__,\n });\n }\n}\n\nPlugin.registerPlugin(new OpenAIPlugin());\n"],"mappings":"AAGA,SAAS,cAAc;AAEvB,SAAS,KAAK,iBAAkC;AAChD,cAAc;AACd,YAAY,cAAc;AAC1B,YAAY,eAAe;AAC3B,SAAS,WAA4B;AACrC,SAAS,eAAe,WAA4B;AACpD,YAAY,QAAQ;AAEpB,MAAM,qBAAqB,OAAO;AAAA,EAChC,cAAc;AACZ,UAAM;AAAA,MACJ,OAAO;AAAA,MACP,SAAS;AAAA,MACT,SAAS;AAAA,IACX,CAAC;AAAA,EACH;AACF;AAEA,OAAO,eAAe,IAAI,aAAa,CAAC;","names":[]}
|
package/dist/llm.test.cjs
CHANGED
|
@@ -2,20 +2,35 @@
|
|
|
2
2
|
var import_agents_plugins_test = require("@livekit/agents-plugins-test");
|
|
3
3
|
var import_vitest = require("vitest");
|
|
4
4
|
var import_llm = require("./llm.cjs");
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
})
|
|
19
|
-
);
|
|
20
|
-
}
|
|
5
|
+
const hasOpenAIApiKey = Boolean(process.env.OPENAI_API_KEY);
|
|
6
|
+
if (hasOpenAIApiKey) {
|
|
7
|
+
(0, import_vitest.describe)("OpenAI", async () => {
|
|
8
|
+
await (0, import_agents_plugins_test.llm)(
|
|
9
|
+
new import_llm.LLM({
|
|
10
|
+
temperature: 0
|
|
11
|
+
}),
|
|
12
|
+
false
|
|
13
|
+
);
|
|
14
|
+
});
|
|
15
|
+
} else {
|
|
16
|
+
(0, import_vitest.describe)("OpenAI", () => {
|
|
17
|
+
import_vitest.it.skip("requires OPENAI_API_KEY", () => {
|
|
18
|
+
});
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
if (hasOpenAIApiKey) {
|
|
22
|
+
(0, import_vitest.describe)("OpenAI strict tool schema", async () => {
|
|
23
|
+
await (0, import_agents_plugins_test.llmStrict)(
|
|
24
|
+
new import_llm.LLM({
|
|
25
|
+
temperature: 0,
|
|
26
|
+
strictToolSchema: true
|
|
27
|
+
})
|
|
28
|
+
);
|
|
29
|
+
});
|
|
30
|
+
} else {
|
|
31
|
+
(0, import_vitest.describe)("OpenAI strict tool schema", () => {
|
|
32
|
+
import_vitest.it.skip("requires OPENAI_API_KEY", () => {
|
|
33
|
+
});
|
|
34
|
+
});
|
|
35
|
+
}
|
|
21
36
|
//# sourceMappingURL=llm.test.cjs.map
|
package/dist/llm.test.cjs.map
CHANGED
|
@@ -1 +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, llmStrict } from '@livekit/agents-plugins-test';\nimport { describe } from 'vitest';\nimport { LLM } from './llm.js';\n\
|
|
1
|
+
{"version":3,"sources":["../src/llm.test.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2024 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\nimport { llm, llmStrict } from '@livekit/agents-plugins-test';\nimport { describe, it } from 'vitest';\nimport { LLM } from './llm.js';\n\nconst hasOpenAIApiKey = Boolean(process.env.OPENAI_API_KEY);\n\nif (hasOpenAIApiKey) {\n describe('OpenAI', async () => {\n await llm(\n new LLM({\n temperature: 0,\n }),\n false,\n );\n });\n} else {\n describe('OpenAI', () => {\n it.skip('requires OPENAI_API_KEY', () => {});\n });\n}\n\nif (hasOpenAIApiKey) {\n describe('OpenAI strict tool schema', async () => {\n await llmStrict(\n new LLM({\n temperature: 0,\n strictToolSchema: true,\n }),\n );\n });\n} else {\n describe('OpenAI strict tool schema', () => {\n it.skip('requires OPENAI_API_KEY', () => {});\n });\n}\n"],"mappings":";AAGA,iCAA+B;AAC/B,oBAA6B;AAC7B,iBAAoB;AAEpB,MAAM,kBAAkB,QAAQ,QAAQ,IAAI,cAAc;AAE1D,IAAI,iBAAiB;AACnB,8BAAS,UAAU,YAAY;AAC7B,cAAM;AAAA,MACJ,IAAI,eAAI;AAAA,QACN,aAAa;AAAA,MACf,CAAC;AAAA,MACD;AAAA,IACF;AAAA,EACF,CAAC;AACH,OAAO;AACL,8BAAS,UAAU,MAAM;AACvB,qBAAG,KAAK,2BAA2B,MAAM;AAAA,IAAC,CAAC;AAAA,EAC7C,CAAC;AACH;AAEA,IAAI,iBAAiB;AACnB,8BAAS,6BAA6B,YAAY;AAChD,cAAM;AAAA,MACJ,IAAI,eAAI;AAAA,QACN,aAAa;AAAA,QACb,kBAAkB;AAAA,MACpB,CAAC;AAAA,IACH;AAAA,EACF,CAAC;AACH,OAAO;AACL,8BAAS,6BAA6B,MAAM;AAC1C,qBAAG,KAAK,2BAA2B,MAAM;AAAA,IAAC,CAAC;AAAA,EAC7C,CAAC;AACH;","names":[]}
|
package/dist/llm.test.js
CHANGED
|
@@ -1,20 +1,35 @@
|
|
|
1
1
|
import { llm, llmStrict } from "@livekit/agents-plugins-test";
|
|
2
|
-
import { describe } from "vitest";
|
|
2
|
+
import { describe, it } from "vitest";
|
|
3
3
|
import { LLM } from "./llm.js";
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
})
|
|
18
|
-
);
|
|
19
|
-
}
|
|
4
|
+
const hasOpenAIApiKey = Boolean(process.env.OPENAI_API_KEY);
|
|
5
|
+
if (hasOpenAIApiKey) {
|
|
6
|
+
describe("OpenAI", async () => {
|
|
7
|
+
await llm(
|
|
8
|
+
new LLM({
|
|
9
|
+
temperature: 0
|
|
10
|
+
}),
|
|
11
|
+
false
|
|
12
|
+
);
|
|
13
|
+
});
|
|
14
|
+
} else {
|
|
15
|
+
describe("OpenAI", () => {
|
|
16
|
+
it.skip("requires OPENAI_API_KEY", () => {
|
|
17
|
+
});
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
if (hasOpenAIApiKey) {
|
|
21
|
+
describe("OpenAI strict tool schema", async () => {
|
|
22
|
+
await llmStrict(
|
|
23
|
+
new LLM({
|
|
24
|
+
temperature: 0,
|
|
25
|
+
strictToolSchema: true
|
|
26
|
+
})
|
|
27
|
+
);
|
|
28
|
+
});
|
|
29
|
+
} else {
|
|
30
|
+
describe("OpenAI strict tool schema", () => {
|
|
31
|
+
it.skip("requires OPENAI_API_KEY", () => {
|
|
32
|
+
});
|
|
33
|
+
});
|
|
34
|
+
}
|
|
20
35
|
//# sourceMappingURL=llm.test.js.map
|
package/dist/llm.test.js.map
CHANGED
|
@@ -1 +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, llmStrict } from '@livekit/agents-plugins-test';\nimport { describe } from 'vitest';\nimport { LLM } from './llm.js';\n\
|
|
1
|
+
{"version":3,"sources":["../src/llm.test.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2024 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\nimport { llm, llmStrict } from '@livekit/agents-plugins-test';\nimport { describe, it } from 'vitest';\nimport { LLM } from './llm.js';\n\nconst hasOpenAIApiKey = Boolean(process.env.OPENAI_API_KEY);\n\nif (hasOpenAIApiKey) {\n describe('OpenAI', async () => {\n await llm(\n new LLM({\n temperature: 0,\n }),\n false,\n );\n });\n} else {\n describe('OpenAI', () => {\n it.skip('requires OPENAI_API_KEY', () => {});\n });\n}\n\nif (hasOpenAIApiKey) {\n describe('OpenAI strict tool schema', async () => {\n await llmStrict(\n new LLM({\n temperature: 0,\n strictToolSchema: true,\n }),\n );\n });\n} else {\n describe('OpenAI strict tool schema', () => {\n it.skip('requires OPENAI_API_KEY', () => {});\n });\n}\n"],"mappings":"AAGA,SAAS,KAAK,iBAAiB;AAC/B,SAAS,UAAU,UAAU;AAC7B,SAAS,WAAW;AAEpB,MAAM,kBAAkB,QAAQ,QAAQ,IAAI,cAAc;AAE1D,IAAI,iBAAiB;AACnB,WAAS,UAAU,YAAY;AAC7B,UAAM;AAAA,MACJ,IAAI,IAAI;AAAA,QACN,aAAa;AAAA,MACf,CAAC;AAAA,MACD;AAAA,IACF;AAAA,EACF,CAAC;AACH,OAAO;AACL,WAAS,UAAU,MAAM;AACvB,OAAG,KAAK,2BAA2B,MAAM;AAAA,IAAC,CAAC;AAAA,EAC7C,CAAC;AACH;AAEA,IAAI,iBAAiB;AACnB,WAAS,6BAA6B,YAAY;AAChD,UAAM;AAAA,MACJ,IAAI,IAAI;AAAA,QACN,aAAa;AAAA,QACb,kBAAkB;AAAA,MACpB,CAAC;AAAA,IACH;AAAA,EACF,CAAC;AACH,OAAO;AACL,WAAS,6BAA6B,MAAM;AAC1C,OAAG,KAAK,2BAA2B,MAAM;AAAA,IAAC,CAAC;AAAA,EAC7C,CAAC;AACH;","names":[]}
|
package/dist/responses/llm.cjs
CHANGED
|
@@ -28,31 +28,25 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
|
|
|
28
28
|
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
29
29
|
var llm_exports = {};
|
|
30
30
|
__export(llm_exports, {
|
|
31
|
-
LLM: () => LLM
|
|
32
|
-
LLMStream: () => LLMStream
|
|
31
|
+
LLM: () => LLM
|
|
33
32
|
});
|
|
34
33
|
module.exports = __toCommonJS(llm_exports);
|
|
35
34
|
var import_agents = require("@livekit/agents");
|
|
36
35
|
var import_openai = __toESM(require("openai"), 1);
|
|
36
|
+
var import_llm = require("../ws/llm.cjs");
|
|
37
37
|
const defaultLLMOptions = {
|
|
38
38
|
model: "gpt-4.1",
|
|
39
39
|
apiKey: process.env.OPENAI_API_KEY,
|
|
40
|
-
strictToolSchema: true
|
|
40
|
+
strictToolSchema: true,
|
|
41
|
+
useWebSocket: true
|
|
41
42
|
};
|
|
42
|
-
class
|
|
43
|
+
class ResponsesHttpLLM extends import_agents.llm.LLM {
|
|
43
44
|
#client;
|
|
44
45
|
#opts;
|
|
45
|
-
/**
|
|
46
|
-
* Create a new instance of OpenAI Responses LLM.
|
|
47
|
-
*
|
|
48
|
-
* @remarks
|
|
49
|
-
* `apiKey` must be set to your OpenAI API key, either using the argument or by setting the
|
|
50
|
-
* `OPENAI_API_KEY` environment variable.
|
|
51
|
-
*/
|
|
52
46
|
constructor(opts = defaultLLMOptions) {
|
|
53
47
|
super();
|
|
54
48
|
this.#opts = { ...defaultLLMOptions, ...opts };
|
|
55
|
-
if (this.#opts.apiKey === void 0) {
|
|
49
|
+
if (this.#opts.apiKey === void 0 && this.#opts.client === void 0) {
|
|
56
50
|
throw new Error("OpenAI API key is required, whether as an argument or as $OPENAI_API_KEY");
|
|
57
51
|
}
|
|
58
52
|
this.#client = this.#opts.client || new import_openai.default({
|
|
@@ -92,7 +86,7 @@ class LLM extends import_agents.llm.LLM {
|
|
|
92
86
|
if (this.#opts.metadata) {
|
|
93
87
|
modelOptions.metadata = this.#opts.metadata;
|
|
94
88
|
}
|
|
95
|
-
return new
|
|
89
|
+
return new ResponsesHttpLLMStream(this, {
|
|
96
90
|
model: this.#opts.model,
|
|
97
91
|
client: this.#client,
|
|
98
92
|
chatCtx,
|
|
@@ -103,7 +97,7 @@ class LLM extends import_agents.llm.LLM {
|
|
|
103
97
|
});
|
|
104
98
|
}
|
|
105
99
|
}
|
|
106
|
-
class
|
|
100
|
+
class ResponsesHttpLLMStream extends import_agents.llm.LLMStream {
|
|
107
101
|
model;
|
|
108
102
|
client;
|
|
109
103
|
modelOptions;
|
|
@@ -266,9 +260,70 @@ class LLMStream extends import_agents.llm.LLMStream {
|
|
|
266
260
|
return void 0;
|
|
267
261
|
}
|
|
268
262
|
}
|
|
263
|
+
class LLM extends import_agents.llm.LLM {
|
|
264
|
+
#opts;
|
|
265
|
+
#llm;
|
|
266
|
+
#logger = (0, import_agents.log)();
|
|
267
|
+
/**
|
|
268
|
+
* Create a new instance of OpenAI Responses LLM.
|
|
269
|
+
*
|
|
270
|
+
* @remarks
|
|
271
|
+
* `apiKey` must be set to your OpenAI API key, either using the argument or by setting the
|
|
272
|
+
* `OPENAI_API_KEY` environment variable.
|
|
273
|
+
*/
|
|
274
|
+
constructor(opts = defaultLLMOptions) {
|
|
275
|
+
super();
|
|
276
|
+
this.#opts = { ...defaultLLMOptions, ...opts };
|
|
277
|
+
const { useWebSocket, client, ...baseOpts } = this.#opts;
|
|
278
|
+
if (useWebSocket) {
|
|
279
|
+
if (client !== void 0) {
|
|
280
|
+
this.#logger.warn(
|
|
281
|
+
"WebSocket mode does not support custom client; provided client will be ignored"
|
|
282
|
+
);
|
|
283
|
+
}
|
|
284
|
+
this.#llm = new import_llm.WSLLM(baseOpts);
|
|
285
|
+
} else {
|
|
286
|
+
this.#llm = new ResponsesHttpLLM({ ...baseOpts, client });
|
|
287
|
+
}
|
|
288
|
+
this.#llm.on("metrics_collected", (metrics) => this.emit("metrics_collected", metrics));
|
|
289
|
+
this.#llm.on("error", (error) => this.emit("error", error));
|
|
290
|
+
}
|
|
291
|
+
label() {
|
|
292
|
+
return this.#llm.label();
|
|
293
|
+
}
|
|
294
|
+
get model() {
|
|
295
|
+
return this.#llm.model;
|
|
296
|
+
}
|
|
297
|
+
prewarm() {
|
|
298
|
+
this.#llm.prewarm();
|
|
299
|
+
}
|
|
300
|
+
// Ref: python livekit-plugins/livekit-plugins-openai/livekit/plugins/openai/responses/llm.py - 229-233 lines
|
|
301
|
+
async aclose() {
|
|
302
|
+
await this.#llm.aclose();
|
|
303
|
+
}
|
|
304
|
+
async close() {
|
|
305
|
+
await this.aclose();
|
|
306
|
+
}
|
|
307
|
+
chat({
|
|
308
|
+
chatCtx,
|
|
309
|
+
toolCtx,
|
|
310
|
+
connOptions = import_agents.DEFAULT_API_CONNECT_OPTIONS,
|
|
311
|
+
parallelToolCalls,
|
|
312
|
+
toolChoice,
|
|
313
|
+
extraKwargs
|
|
314
|
+
}) {
|
|
315
|
+
return this.#llm.chat({
|
|
316
|
+
chatCtx,
|
|
317
|
+
toolCtx,
|
|
318
|
+
connOptions,
|
|
319
|
+
parallelToolCalls,
|
|
320
|
+
toolChoice,
|
|
321
|
+
extraKwargs
|
|
322
|
+
});
|
|
323
|
+
}
|
|
324
|
+
}
|
|
269
325
|
// Annotate the CommonJS export names for ESM import in node:
|
|
270
326
|
0 && (module.exports = {
|
|
271
|
-
LLM
|
|
272
|
-
LLMStream
|
|
327
|
+
LLM
|
|
273
328
|
});
|
|
274
329
|
//# sourceMappingURL=llm.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/responses/llm.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2025 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\nimport type { APIConnectOptions } from '@livekit/agents';\nimport {\n APIConnectionError,\n APIStatusError,\n APITimeoutError,\n DEFAULT_API_CONNECT_OPTIONS,\n llm,\n toError,\n} from '@livekit/agents';\nimport OpenAI from 'openai';\nimport type { ChatModels } from '../models.js';\n\ninterface LLMOptions {\n model: string | ChatModels;\n apiKey?: string;\n baseURL?: string;\n client?: OpenAI;\n temperature?: number;\n parallelToolCalls?: boolean;\n toolChoice?: llm.ToolChoice;\n store?: boolean;\n metadata?: Record<string, string>;\n strictToolSchema?: boolean;\n}\n\nconst defaultLLMOptions: LLMOptions = {\n model: 'gpt-4.1',\n apiKey: process.env.OPENAI_API_KEY,\n strictToolSchema: true,\n};\n\nexport class LLM extends llm.LLM {\n #client: OpenAI;\n #opts: LLMOptions;\n\n /**\n * Create a new instance of OpenAI Responses LLM.\n *\n * @remarks\n * `apiKey` must be set to your OpenAI API key, either using the argument or by setting the\n * `OPENAI_API_KEY` environment variable.\n */\n constructor(opts: Partial<LLMOptions> = defaultLLMOptions) {\n super();\n\n this.#opts = { ...defaultLLMOptions, ...opts };\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: this.#opts.baseURL,\n apiKey: this.#opts.apiKey,\n });\n }\n\n label(): string {\n return 'openai.responses.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 }): LLMStream {\n const modelOptions: Record<string, unknown> = { ...(extraKwargs || {}) };\n\n parallelToolCalls =\n parallelToolCalls !== undefined ? parallelToolCalls : this.#opts.parallelToolCalls;\n\n if (toolCtx && Object.keys(toolCtx).length > 0 && parallelToolCalls !== undefined) {\n modelOptions.parallel_tool_calls = parallelToolCalls;\n }\n\n toolChoice =\n toolChoice !== undefined ? toolChoice : (this.#opts.toolChoice as llm.ToolChoice | undefined);\n\n if (toolChoice) {\n modelOptions.tool_choice = toolChoice;\n }\n\n if (this.#opts.temperature !== undefined) {\n modelOptions.temperature = this.#opts.temperature;\n }\n\n if (this.#opts.store !== undefined) {\n modelOptions.store = this.#opts.store;\n }\n\n if (this.#opts.metadata) {\n modelOptions.metadata = this.#opts.metadata;\n }\n\n return new LLMStream(this, {\n model: this.#opts.model,\n client: this.#client,\n chatCtx,\n toolCtx,\n connOptions,\n modelOptions,\n strictToolSchema: this.#opts.strictToolSchema ?? true,\n });\n }\n}\n\nexport class LLMStream extends llm.LLMStream {\n private model: string | ChatModels;\n private client: OpenAI;\n private modelOptions: Record<string, unknown>;\n private strictToolSchema: boolean;\n private responseId: string;\n\n constructor(\n llm: LLM,\n {\n model,\n client,\n chatCtx,\n toolCtx,\n connOptions,\n modelOptions,\n strictToolSchema,\n }: {\n model: string | ChatModels;\n client: OpenAI;\n chatCtx: llm.ChatContext;\n toolCtx?: llm.ToolContext;\n connOptions: APIConnectOptions;\n modelOptions: Record<string, unknown>;\n strictToolSchema: boolean;\n },\n ) {\n super(llm, { chatCtx, toolCtx, connOptions });\n this.model = model;\n this.client = client;\n this.modelOptions = modelOptions;\n this.strictToolSchema = strictToolSchema;\n this.responseId = '';\n }\n\n protected async run(): Promise<void> {\n let retryable = true;\n\n try {\n const messages = (await this.chatCtx.toProviderFormat(\n 'openai.responses',\n )) as OpenAI.Responses.ResponseInputItem[];\n\n const tools = this.toolCtx\n ? Object.entries(this.toolCtx).map(([name, func]) => {\n const oaiParams = {\n type: 'function' as const,\n name: name,\n description: func.description,\n parameters: llm.toJsonSchema(\n func.parameters,\n true,\n this.strictToolSchema,\n ) as unknown as OpenAI.Responses.FunctionTool['parameters'],\n } as OpenAI.Responses.FunctionTool;\n\n if (this.strictToolSchema) {\n oaiParams.strict = true;\n }\n\n return oaiParams;\n })\n : undefined;\n\n const requestOptions: Record<string, unknown> = { ...this.modelOptions };\n if (!tools) {\n delete requestOptions.tool_choice;\n }\n\n const stream = await this.client.responses.create(\n {\n model: this.model,\n input: messages,\n tools: tools,\n stream: true,\n ...requestOptions,\n },\n {\n timeout: this.connOptions.timeoutMs,\n },\n );\n\n for await (const event of stream) {\n retryable = false;\n let chunk: llm.ChatChunk | undefined;\n\n switch (event.type) {\n case 'error':\n this.handleError(event);\n break;\n case 'response.created':\n this.handleResponseCreated(event);\n break;\n case 'response.output_item.done':\n chunk = this.handleResponseOutputItemDone(event);\n break;\n case 'response.output_text.delta':\n chunk = this.handleResponseOutputTextDelta(event);\n break;\n case 'response.completed':\n chunk = this.handleResponseCompleted(event);\n break;\n }\n\n if (chunk) {\n this.queue.put(chunk);\n }\n }\n } catch (error) {\n if (\n error instanceof APIStatusError ||\n error instanceof APITimeoutError ||\n error instanceof APIConnectionError\n ) {\n throw error;\n } else if (error instanceof OpenAI.APIConnectionTimeoutError) {\n throw new APITimeoutError({ options: { retryable } });\n } else if (error instanceof OpenAI.APIError) {\n throw new APIStatusError({\n message: error.message,\n options: {\n statusCode: error.status,\n body: error.error,\n requestId: error.requestID,\n retryable,\n },\n });\n } else {\n throw new APIConnectionError({\n message: toError(error).message,\n options: { retryable },\n });\n }\n }\n }\n\n private handleError(event: OpenAI.Responses.ResponseErrorEvent): void {\n throw new APIStatusError({\n message: event.message,\n options: {\n statusCode: -1,\n retryable: false,\n },\n });\n }\n\n private handleResponseCreated(event: OpenAI.Responses.ResponseCreatedEvent): void {\n this.responseId = event.response.id;\n }\n\n private handleResponseOutputItemDone(\n event: OpenAI.Responses.ResponseOutputItemDoneEvent,\n ): llm.ChatChunk | undefined {\n let chunk: llm.ChatChunk | undefined;\n\n if (event.item.type === 'function_call') {\n chunk = {\n id: this.responseId,\n delta: {\n role: 'assistant',\n content: undefined,\n toolCalls: [\n llm.FunctionCall.create({\n callId: event.item.call_id || '',\n name: event.item.name,\n args: event.item.arguments,\n }),\n ],\n },\n };\n }\n return chunk;\n }\n\n private handleResponseOutputTextDelta(\n event: OpenAI.Responses.ResponseTextDeltaEvent,\n ): llm.ChatChunk {\n return {\n id: this.responseId,\n delta: {\n role: 'assistant',\n content: event.delta,\n },\n };\n }\n\n private handleResponseCompleted(\n event: OpenAI.Responses.ResponseCompletedEvent,\n ): llm.ChatChunk | undefined {\n if (event.response.usage) {\n return {\n id: this.responseId,\n usage: {\n completionTokens: event.response.usage.output_tokens,\n promptTokens: event.response.usage.input_tokens,\n promptCachedTokens: event.response.usage.input_tokens_details.cached_tokens,\n totalTokens: event.response.usage.total_tokens,\n },\n };\n }\n return undefined;\n }\n}\n"],"mappings":"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","names":["OpenAI","llm"]}
|
|
1
|
+
{"version":3,"sources":["../../src/responses/llm.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2025 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\nimport type { APIConnectOptions } from '@livekit/agents';\nimport {\n APIConnectionError,\n APIStatusError,\n APITimeoutError,\n DEFAULT_API_CONNECT_OPTIONS,\n llm,\n log,\n toError,\n} from '@livekit/agents';\nimport OpenAI from 'openai';\nimport type { ChatModels } from '../models.js';\nimport { WSLLM } from '../ws/llm.js';\n\nexport interface LLMOptions {\n model: string | ChatModels;\n apiKey?: string;\n baseURL?: string;\n client?: OpenAI;\n temperature?: number;\n parallelToolCalls?: boolean;\n toolChoice?: llm.ToolChoice;\n store?: boolean;\n metadata?: Record<string, string>;\n strictToolSchema?: boolean;\n\n /**\n * Whether to use the WebSocket API.\n * @default true\n */\n useWebSocket?: boolean;\n}\n\ntype HttpLLMOptions = Omit<LLMOptions, 'useWebSocket'>;\n\nconst defaultLLMOptions: LLMOptions = {\n model: 'gpt-4.1',\n apiKey: process.env.OPENAI_API_KEY,\n strictToolSchema: true,\n useWebSocket: true,\n};\n\nclass ResponsesHttpLLM extends llm.LLM {\n #client: OpenAI;\n #opts: HttpLLMOptions;\n\n constructor(opts: Partial<HttpLLMOptions> = defaultLLMOptions) {\n super();\n\n this.#opts = { ...defaultLLMOptions, ...opts };\n if (this.#opts.apiKey === undefined && this.#opts.client === 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: this.#opts.baseURL,\n apiKey: this.#opts.apiKey,\n });\n }\n\n override label(): string {\n return 'openai.responses.LLM';\n }\n\n override get model(): string {\n return this.#opts.model;\n }\n\n override 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 }): ResponsesHttpLLMStream {\n const modelOptions: Record<string, unknown> = { ...(extraKwargs || {}) };\n\n parallelToolCalls =\n parallelToolCalls !== undefined ? parallelToolCalls : this.#opts.parallelToolCalls;\n\n if (toolCtx && Object.keys(toolCtx).length > 0 && parallelToolCalls !== undefined) {\n modelOptions.parallel_tool_calls = parallelToolCalls;\n }\n\n toolChoice =\n toolChoice !== undefined ? toolChoice : (this.#opts.toolChoice as llm.ToolChoice | undefined);\n\n if (toolChoice) {\n modelOptions.tool_choice = toolChoice;\n }\n\n if (this.#opts.temperature !== undefined) {\n modelOptions.temperature = this.#opts.temperature;\n }\n\n if (this.#opts.store !== undefined) {\n modelOptions.store = this.#opts.store;\n }\n\n if (this.#opts.metadata) {\n modelOptions.metadata = this.#opts.metadata;\n }\n\n return new ResponsesHttpLLMStream(this, {\n model: this.#opts.model,\n client: this.#client,\n chatCtx,\n toolCtx,\n connOptions,\n modelOptions,\n strictToolSchema: this.#opts.strictToolSchema ?? true,\n });\n }\n}\n\nclass ResponsesHttpLLMStream extends llm.LLMStream {\n private model: string | ChatModels;\n private client: OpenAI;\n private modelOptions: Record<string, unknown>;\n private strictToolSchema: boolean;\n private responseId: string;\n\n constructor(\n llm: ResponsesHttpLLM,\n {\n model,\n client,\n chatCtx,\n toolCtx,\n connOptions,\n modelOptions,\n strictToolSchema,\n }: {\n model: string | ChatModels;\n client: OpenAI;\n chatCtx: llm.ChatContext;\n toolCtx?: llm.ToolContext;\n connOptions: APIConnectOptions;\n modelOptions: Record<string, unknown>;\n strictToolSchema: boolean;\n },\n ) {\n super(llm, { chatCtx, toolCtx, connOptions });\n this.model = model;\n this.client = client;\n this.modelOptions = modelOptions;\n this.strictToolSchema = strictToolSchema;\n this.responseId = '';\n }\n\n protected async run(): Promise<void> {\n let retryable = true;\n\n try {\n const messages = (await this.chatCtx.toProviderFormat(\n 'openai.responses',\n )) as OpenAI.Responses.ResponseInputItem[];\n\n const tools = this.toolCtx\n ? Object.entries(this.toolCtx).map(([name, func]) => {\n const oaiParams = {\n type: 'function' as const,\n name: name,\n description: func.description,\n parameters: llm.toJsonSchema(\n func.parameters,\n true,\n this.strictToolSchema,\n ) as unknown as OpenAI.Responses.FunctionTool['parameters'],\n } as OpenAI.Responses.FunctionTool;\n\n if (this.strictToolSchema) {\n oaiParams.strict = true;\n }\n\n return oaiParams;\n })\n : undefined;\n\n const requestOptions: Record<string, unknown> = { ...this.modelOptions };\n if (!tools) {\n delete requestOptions.tool_choice;\n }\n\n const stream = await this.client.responses.create(\n {\n model: this.model,\n input: messages,\n tools: tools,\n stream: true,\n ...requestOptions,\n },\n {\n timeout: this.connOptions.timeoutMs,\n },\n );\n\n for await (const event of stream) {\n retryable = false;\n let chunk: llm.ChatChunk | undefined;\n\n switch (event.type) {\n case 'error':\n this.handleError(event);\n break;\n case 'response.created':\n this.handleResponseCreated(event);\n break;\n case 'response.output_item.done':\n chunk = this.handleResponseOutputItemDone(event);\n break;\n case 'response.output_text.delta':\n chunk = this.handleResponseOutputTextDelta(event);\n break;\n case 'response.completed':\n chunk = this.handleResponseCompleted(event);\n break;\n }\n\n if (chunk) {\n this.queue.put(chunk);\n }\n }\n } catch (error) {\n if (\n error instanceof APIStatusError ||\n error instanceof APITimeoutError ||\n error instanceof APIConnectionError\n ) {\n throw error;\n } else if (error instanceof OpenAI.APIConnectionTimeoutError) {\n throw new APITimeoutError({ options: { retryable } });\n } else if (error instanceof OpenAI.APIError) {\n throw new APIStatusError({\n message: error.message,\n options: {\n statusCode: error.status,\n body: error.error,\n requestId: error.requestID,\n retryable,\n },\n });\n } else {\n throw new APIConnectionError({\n message: toError(error).message,\n options: { retryable },\n });\n }\n }\n }\n\n private handleError(event: OpenAI.Responses.ResponseErrorEvent): void {\n throw new APIStatusError({\n message: event.message,\n options: {\n statusCode: -1,\n retryable: false,\n },\n });\n }\n\n private handleResponseCreated(event: OpenAI.Responses.ResponseCreatedEvent): void {\n this.responseId = event.response.id;\n }\n\n private handleResponseOutputItemDone(\n event: OpenAI.Responses.ResponseOutputItemDoneEvent,\n ): llm.ChatChunk | undefined {\n let chunk: llm.ChatChunk | undefined;\n\n if (event.item.type === 'function_call') {\n chunk = {\n id: this.responseId,\n delta: {\n role: 'assistant',\n content: undefined,\n toolCalls: [\n llm.FunctionCall.create({\n callId: event.item.call_id || '',\n name: event.item.name,\n args: event.item.arguments,\n }),\n ],\n },\n };\n }\n return chunk;\n }\n\n private handleResponseOutputTextDelta(\n event: OpenAI.Responses.ResponseTextDeltaEvent,\n ): llm.ChatChunk {\n return {\n id: this.responseId,\n delta: {\n role: 'assistant',\n content: event.delta,\n },\n };\n }\n\n private handleResponseCompleted(\n event: OpenAI.Responses.ResponseCompletedEvent,\n ): llm.ChatChunk | undefined {\n if (event.response.usage) {\n return {\n id: this.responseId,\n usage: {\n completionTokens: event.response.usage.output_tokens,\n promptTokens: event.response.usage.input_tokens,\n promptCachedTokens: event.response.usage.input_tokens_details.cached_tokens,\n totalTokens: event.response.usage.total_tokens,\n },\n };\n }\n return undefined;\n }\n}\n\nexport class LLM extends llm.LLM {\n #opts: LLMOptions;\n #llm: llm.LLM;\n #logger = log();\n\n /**\n * Create a new instance of OpenAI Responses LLM.\n *\n * @remarks\n * `apiKey` must be set to your OpenAI API key, either using the argument or by setting the\n * `OPENAI_API_KEY` environment variable.\n */\n constructor(opts: Partial<LLMOptions> = defaultLLMOptions) {\n super();\n\n this.#opts = { ...defaultLLMOptions, ...opts };\n const { useWebSocket, client, ...baseOpts } = this.#opts;\n\n if (useWebSocket) {\n if (client !== undefined) {\n this.#logger.warn(\n 'WebSocket mode does not support custom client; provided client will be ignored',\n );\n }\n this.#llm = new WSLLM(baseOpts);\n } else {\n this.#llm = new ResponsesHttpLLM({ ...baseOpts, client });\n }\n\n // Forward events from the inner delegate so consumers listening on this\n // wrapper instance (e.g. AgentActivity) receive them.\n this.#llm.on('metrics_collected', (metrics) => this.emit('metrics_collected', metrics));\n this.#llm.on('error', (error) => this.emit('error', error));\n }\n\n override label(): string {\n return this.#llm.label();\n }\n\n override get model(): string {\n return this.#llm.model;\n }\n\n override prewarm(): void {\n this.#llm.prewarm();\n }\n\n // Ref: python livekit-plugins/livekit-plugins-openai/livekit/plugins/openai/responses/llm.py - 229-233 lines\n override async aclose(): Promise<void> {\n await this.#llm.aclose();\n }\n\n async close(): Promise<void> {\n await this.aclose();\n }\n\n override 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 }): llm.LLMStream {\n return this.#llm.chat({\n chatCtx,\n toolCtx,\n connOptions,\n parallelToolCalls,\n toolChoice,\n extraKwargs,\n });\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAIA,oBAQO;AACP,oBAAmB;AAEnB,iBAAsB;AAuBtB,MAAM,oBAAgC;AAAA,EACpC,OAAO;AAAA,EACP,QAAQ,QAAQ,IAAI;AAAA,EACpB,kBAAkB;AAAA,EAClB,cAAc;AAChB;AAEA,MAAM,yBAAyB,kBAAI,IAAI;AAAA,EACrC;AAAA,EACA;AAAA,EAEA,YAAY,OAAgC,mBAAmB;AAC7D,UAAM;AAEN,SAAK,QAAQ,EAAE,GAAG,mBAAmB,GAAG,KAAK;AAC7C,QAAI,KAAK,MAAM,WAAW,UAAa,KAAK,MAAM,WAAW,QAAW;AACtE,YAAM,IAAI,MAAM,0EAA0E;AAAA,IAC5F;AAEA,SAAK,UACH,KAAK,MAAM,UACX,IAAI,cAAAA,QAAO;AAAA,MACT,SAAS,KAAK,MAAM;AAAA,MACpB,QAAQ,KAAK,MAAM;AAAA,IACrB,CAAC;AAAA,EACL;AAAA,EAES,QAAgB;AACvB,WAAO;AAAA,EACT;AAAA,EAEA,IAAa,QAAgB;AAC3B,WAAO,KAAK,MAAM;AAAA,EACpB;AAAA,EAES,KAAK;AAAA,IACZ;AAAA,IACA;AAAA,IACA,cAAc;AAAA,IACd;AAAA,IACA;AAAA,IACA;AAAA,EACF,GAO2B;AACzB,UAAM,eAAwC,EAAE,GAAI,eAAe,CAAC,EAAG;AAEvE,wBACE,sBAAsB,SAAY,oBAAoB,KAAK,MAAM;AAEnE,QAAI,WAAW,OAAO,KAAK,OAAO,EAAE,SAAS,KAAK,sBAAsB,QAAW;AACjF,mBAAa,sBAAsB;AAAA,IACrC;AAEA,iBACE,eAAe,SAAY,aAAc,KAAK,MAAM;AAEtD,QAAI,YAAY;AACd,mBAAa,cAAc;AAAA,IAC7B;AAEA,QAAI,KAAK,MAAM,gBAAgB,QAAW;AACxC,mBAAa,cAAc,KAAK,MAAM;AAAA,IACxC;AAEA,QAAI,KAAK,MAAM,UAAU,QAAW;AAClC,mBAAa,QAAQ,KAAK,MAAM;AAAA,IAClC;AAEA,QAAI,KAAK,MAAM,UAAU;AACvB,mBAAa,WAAW,KAAK,MAAM;AAAA,IACrC;AAEA,WAAO,IAAI,uBAAuB,MAAM;AAAA,MACtC,OAAO,KAAK,MAAM;AAAA,MAClB,QAAQ,KAAK;AAAA,MACb;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,kBAAkB,KAAK,MAAM,oBAAoB;AAAA,IACnD,CAAC;AAAA,EACH;AACF;AAEA,MAAM,+BAA+B,kBAAI,UAAU;AAAA,EACzC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAER,YACEC,MACA;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,GASA;AACA,UAAMA,MAAK,EAAE,SAAS,SAAS,YAAY,CAAC;AAC5C,SAAK,QAAQ;AACb,SAAK,SAAS;AACd,SAAK,eAAe;AACpB,SAAK,mBAAmB;AACxB,SAAK,aAAa;AAAA,EACpB;AAAA,EAEA,MAAgB,MAAqB;AACnC,QAAI,YAAY;AAEhB,QAAI;AACF,YAAM,WAAY,MAAM,KAAK,QAAQ;AAAA,QACnC;AAAA,MACF;AAEA,YAAM,QAAQ,KAAK,UACf,OAAO,QAAQ,KAAK,OAAO,EAAE,IAAI,CAAC,CAAC,MAAM,IAAI,MAAM;AACjD,cAAM,YAAY;AAAA,UAChB,MAAM;AAAA,UACN;AAAA,UACA,aAAa,KAAK;AAAA,UAClB,YAAY,kBAAI;AAAA,YACd,KAAK;AAAA,YACL;AAAA,YACA,KAAK;AAAA,UACP;AAAA,QACF;AAEA,YAAI,KAAK,kBAAkB;AACzB,oBAAU,SAAS;AAAA,QACrB;AAEA,eAAO;AAAA,MACT,CAAC,IACD;AAEJ,YAAM,iBAA0C,EAAE,GAAG,KAAK,aAAa;AACvE,UAAI,CAAC,OAAO;AACV,eAAO,eAAe;AAAA,MACxB;AAEA,YAAM,SAAS,MAAM,KAAK,OAAO,UAAU;AAAA,QACzC;AAAA,UACE,OAAO,KAAK;AAAA,UACZ,OAAO;AAAA,UACP;AAAA,UACA,QAAQ;AAAA,UACR,GAAG;AAAA,QACL;AAAA,QACA;AAAA,UACE,SAAS,KAAK,YAAY;AAAA,QAC5B;AAAA,MACF;AAEA,uBAAiB,SAAS,QAAQ;AAChC,oBAAY;AACZ,YAAI;AAEJ,gBAAQ,MAAM,MAAM;AAAA,UAClB,KAAK;AACH,iBAAK,YAAY,KAAK;AACtB;AAAA,UACF,KAAK;AACH,iBAAK,sBAAsB,KAAK;AAChC;AAAA,UACF,KAAK;AACH,oBAAQ,KAAK,6BAA6B,KAAK;AAC/C;AAAA,UACF,KAAK;AACH,oBAAQ,KAAK,8BAA8B,KAAK;AAChD;AAAA,UACF,KAAK;AACH,oBAAQ,KAAK,wBAAwB,KAAK;AAC1C;AAAA,QACJ;AAEA,YAAI,OAAO;AACT,eAAK,MAAM,IAAI,KAAK;AAAA,QACtB;AAAA,MACF;AAAA,IACF,SAAS,OAAO;AACd,UACE,iBAAiB,gCACjB,iBAAiB,iCACjB,iBAAiB,kCACjB;AACA,cAAM;AAAA,MACR,WAAW,iBAAiB,cAAAD,QAAO,2BAA2B;AAC5D,cAAM,IAAI,8BAAgB,EAAE,SAAS,EAAE,UAAU,EAAE,CAAC;AAAA,MACtD,WAAW,iBAAiB,cAAAA,QAAO,UAAU;AAC3C,cAAM,IAAI,6BAAe;AAAA,UACvB,SAAS,MAAM;AAAA,UACf,SAAS;AAAA,YACP,YAAY,MAAM;AAAA,YAClB,MAAM,MAAM;AAAA,YACZ,WAAW,MAAM;AAAA,YACjB;AAAA,UACF;AAAA,QACF,CAAC;AAAA,MACH,OAAO;AACL,cAAM,IAAI,iCAAmB;AAAA,UAC3B,aAAS,uBAAQ,KAAK,EAAE;AAAA,UACxB,SAAS,EAAE,UAAU;AAAA,QACvB,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,YAAY,OAAkD;AACpE,UAAM,IAAI,6BAAe;AAAA,MACvB,SAAS,MAAM;AAAA,MACf,SAAS;AAAA,QACP,YAAY;AAAA,QACZ,WAAW;AAAA,MACb;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEQ,sBAAsB,OAAoD;AAChF,SAAK,aAAa,MAAM,SAAS;AAAA,EACnC;AAAA,EAEQ,6BACN,OAC2B;AAC3B,QAAI;AAEJ,QAAI,MAAM,KAAK,SAAS,iBAAiB;AACvC,cAAQ;AAAA,QACN,IAAI,KAAK;AAAA,QACT,OAAO;AAAA,UACL,MAAM;AAAA,UACN,SAAS;AAAA,UACT,WAAW;AAAA,YACT,kBAAI,aAAa,OAAO;AAAA,cACtB,QAAQ,MAAM,KAAK,WAAW;AAAA,cAC9B,MAAM,MAAM,KAAK;AAAA,cACjB,MAAM,MAAM,KAAK;AAAA,YACnB,CAAC;AAAA,UACH;AAAA,QACF;AAAA,MACF;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAAA,EAEQ,8BACN,OACe;AACf,WAAO;AAAA,MACL,IAAI,KAAK;AAAA,MACT,OAAO;AAAA,QACL,MAAM;AAAA,QACN,SAAS,MAAM;AAAA,MACjB;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,wBACN,OAC2B;AAC3B,QAAI,MAAM,SAAS,OAAO;AACxB,aAAO;AAAA,QACL,IAAI,KAAK;AAAA,QACT,OAAO;AAAA,UACL,kBAAkB,MAAM,SAAS,MAAM;AAAA,UACvC,cAAc,MAAM,SAAS,MAAM;AAAA,UACnC,oBAAoB,MAAM,SAAS,MAAM,qBAAqB;AAAA,UAC9D,aAAa,MAAM,SAAS,MAAM;AAAA,QACpC;AAAA,MACF;AAAA,IACF;AACA,WAAO;AAAA,EACT;AACF;AAEO,MAAM,YAAY,kBAAI,IAAI;AAAA,EAC/B;AAAA,EACA;AAAA,EACA,cAAU,mBAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASd,YAAY,OAA4B,mBAAmB;AACzD,UAAM;AAEN,SAAK,QAAQ,EAAE,GAAG,mBAAmB,GAAG,KAAK;AAC7C,UAAM,EAAE,cAAc,QAAQ,GAAG,SAAS,IAAI,KAAK;AAEnD,QAAI,cAAc;AAChB,UAAI,WAAW,QAAW;AACxB,aAAK,QAAQ;AAAA,UACX;AAAA,QACF;AAAA,MACF;AACA,WAAK,OAAO,IAAI,iBAAM,QAAQ;AAAA,IAChC,OAAO;AACL,WAAK,OAAO,IAAI,iBAAiB,EAAE,GAAG,UAAU,OAAO,CAAC;AAAA,IAC1D;AAIA,SAAK,KAAK,GAAG,qBAAqB,CAAC,YAAY,KAAK,KAAK,qBAAqB,OAAO,CAAC;AACtF,SAAK,KAAK,GAAG,SAAS,CAAC,UAAU,KAAK,KAAK,SAAS,KAAK,CAAC;AAAA,EAC5D;AAAA,EAES,QAAgB;AACvB,WAAO,KAAK,KAAK,MAAM;AAAA,EACzB;AAAA,EAEA,IAAa,QAAgB;AAC3B,WAAO,KAAK,KAAK;AAAA,EACnB;AAAA,EAES,UAAgB;AACvB,SAAK,KAAK,QAAQ;AAAA,EACpB;AAAA;AAAA,EAGA,MAAe,SAAwB;AACrC,UAAM,KAAK,KAAK,OAAO;AAAA,EACzB;AAAA,EAEA,MAAM,QAAuB;AAC3B,UAAM,KAAK,OAAO;AAAA,EACpB;AAAA,EAES,KAAK;AAAA,IACZ;AAAA,IACA;AAAA,IACA,cAAc;AAAA,IACd;AAAA,IACA;AAAA,IACA;AAAA,EACF,GAOkB;AAChB,WAAO,KAAK,KAAK,KAAK;AAAA,MACpB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AAAA,EACH;AACF;","names":["OpenAI","llm"]}
|
package/dist/responses/llm.d.cts
CHANGED
|
@@ -2,7 +2,7 @@ import type { APIConnectOptions } from '@livekit/agents';
|
|
|
2
2
|
import { llm } from '@livekit/agents';
|
|
3
3
|
import OpenAI from 'openai';
|
|
4
4
|
import type { ChatModels } from '../models.js';
|
|
5
|
-
interface LLMOptions {
|
|
5
|
+
export interface LLMOptions {
|
|
6
6
|
model: string | ChatModels;
|
|
7
7
|
apiKey?: string;
|
|
8
8
|
baseURL?: string;
|
|
@@ -13,6 +13,11 @@ interface LLMOptions {
|
|
|
13
13
|
store?: boolean;
|
|
14
14
|
metadata?: Record<string, string>;
|
|
15
15
|
strictToolSchema?: boolean;
|
|
16
|
+
/**
|
|
17
|
+
* Whether to use the WebSocket API.
|
|
18
|
+
* @default true
|
|
19
|
+
*/
|
|
20
|
+
useWebSocket?: boolean;
|
|
16
21
|
}
|
|
17
22
|
export declare class LLM extends llm.LLM {
|
|
18
23
|
#private;
|
|
@@ -26,6 +31,9 @@ export declare class LLM extends llm.LLM {
|
|
|
26
31
|
constructor(opts?: Partial<LLMOptions>);
|
|
27
32
|
label(): string;
|
|
28
33
|
get model(): string;
|
|
34
|
+
prewarm(): void;
|
|
35
|
+
aclose(): Promise<void>;
|
|
36
|
+
close(): Promise<void>;
|
|
29
37
|
chat({ chatCtx, toolCtx, connOptions, parallelToolCalls, toolChoice, extraKwargs, }: {
|
|
30
38
|
chatCtx: llm.ChatContext;
|
|
31
39
|
toolCtx?: llm.ToolContext;
|
|
@@ -33,29 +41,6 @@ export declare class LLM extends llm.LLM {
|
|
|
33
41
|
parallelToolCalls?: boolean;
|
|
34
42
|
toolChoice?: llm.ToolChoice;
|
|
35
43
|
extraKwargs?: Record<string, unknown>;
|
|
36
|
-
}): LLMStream;
|
|
37
|
-
}
|
|
38
|
-
export declare class LLMStream extends llm.LLMStream {
|
|
39
|
-
private model;
|
|
40
|
-
private client;
|
|
41
|
-
private modelOptions;
|
|
42
|
-
private strictToolSchema;
|
|
43
|
-
private responseId;
|
|
44
|
-
constructor(llm: LLM, { model, client, chatCtx, toolCtx, connOptions, modelOptions, strictToolSchema, }: {
|
|
45
|
-
model: string | ChatModels;
|
|
46
|
-
client: OpenAI;
|
|
47
|
-
chatCtx: llm.ChatContext;
|
|
48
|
-
toolCtx?: llm.ToolContext;
|
|
49
|
-
connOptions: APIConnectOptions;
|
|
50
|
-
modelOptions: Record<string, unknown>;
|
|
51
|
-
strictToolSchema: boolean;
|
|
52
|
-
});
|
|
53
|
-
protected run(): Promise<void>;
|
|
54
|
-
private handleError;
|
|
55
|
-
private handleResponseCreated;
|
|
56
|
-
private handleResponseOutputItemDone;
|
|
57
|
-
private handleResponseOutputTextDelta;
|
|
58
|
-
private handleResponseCompleted;
|
|
44
|
+
}): llm.LLMStream;
|
|
59
45
|
}
|
|
60
|
-
export {};
|
|
61
46
|
//# sourceMappingURL=llm.d.ts.map
|
package/dist/responses/llm.d.ts
CHANGED
|
@@ -2,7 +2,7 @@ import type { APIConnectOptions } from '@livekit/agents';
|
|
|
2
2
|
import { llm } from '@livekit/agents';
|
|
3
3
|
import OpenAI from 'openai';
|
|
4
4
|
import type { ChatModels } from '../models.js';
|
|
5
|
-
interface LLMOptions {
|
|
5
|
+
export interface LLMOptions {
|
|
6
6
|
model: string | ChatModels;
|
|
7
7
|
apiKey?: string;
|
|
8
8
|
baseURL?: string;
|
|
@@ -13,6 +13,11 @@ interface LLMOptions {
|
|
|
13
13
|
store?: boolean;
|
|
14
14
|
metadata?: Record<string, string>;
|
|
15
15
|
strictToolSchema?: boolean;
|
|
16
|
+
/**
|
|
17
|
+
* Whether to use the WebSocket API.
|
|
18
|
+
* @default true
|
|
19
|
+
*/
|
|
20
|
+
useWebSocket?: boolean;
|
|
16
21
|
}
|
|
17
22
|
export declare class LLM extends llm.LLM {
|
|
18
23
|
#private;
|
|
@@ -26,6 +31,9 @@ export declare class LLM extends llm.LLM {
|
|
|
26
31
|
constructor(opts?: Partial<LLMOptions>);
|
|
27
32
|
label(): string;
|
|
28
33
|
get model(): string;
|
|
34
|
+
prewarm(): void;
|
|
35
|
+
aclose(): Promise<void>;
|
|
36
|
+
close(): Promise<void>;
|
|
29
37
|
chat({ chatCtx, toolCtx, connOptions, parallelToolCalls, toolChoice, extraKwargs, }: {
|
|
30
38
|
chatCtx: llm.ChatContext;
|
|
31
39
|
toolCtx?: llm.ToolContext;
|
|
@@ -33,29 +41,6 @@ export declare class LLM extends llm.LLM {
|
|
|
33
41
|
parallelToolCalls?: boolean;
|
|
34
42
|
toolChoice?: llm.ToolChoice;
|
|
35
43
|
extraKwargs?: Record<string, unknown>;
|
|
36
|
-
}): LLMStream;
|
|
37
|
-
}
|
|
38
|
-
export declare class LLMStream extends llm.LLMStream {
|
|
39
|
-
private model;
|
|
40
|
-
private client;
|
|
41
|
-
private modelOptions;
|
|
42
|
-
private strictToolSchema;
|
|
43
|
-
private responseId;
|
|
44
|
-
constructor(llm: LLM, { model, client, chatCtx, toolCtx, connOptions, modelOptions, strictToolSchema, }: {
|
|
45
|
-
model: string | ChatModels;
|
|
46
|
-
client: OpenAI;
|
|
47
|
-
chatCtx: llm.ChatContext;
|
|
48
|
-
toolCtx?: llm.ToolContext;
|
|
49
|
-
connOptions: APIConnectOptions;
|
|
50
|
-
modelOptions: Record<string, unknown>;
|
|
51
|
-
strictToolSchema: boolean;
|
|
52
|
-
});
|
|
53
|
-
protected run(): Promise<void>;
|
|
54
|
-
private handleError;
|
|
55
|
-
private handleResponseCreated;
|
|
56
|
-
private handleResponseOutputItemDone;
|
|
57
|
-
private handleResponseOutputTextDelta;
|
|
58
|
-
private handleResponseCompleted;
|
|
44
|
+
}): llm.LLMStream;
|
|
59
45
|
}
|
|
60
|
-
export {};
|
|
61
46
|
//# sourceMappingURL=llm.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"llm.d.ts","sourceRoot":"","sources":["../../src/responses/llm.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACzD,OAAO,EAKL,GAAG,
|
|
1
|
+
{"version":3,"file":"llm.d.ts","sourceRoot":"","sources":["../../src/responses/llm.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACzD,OAAO,EAKL,GAAG,EAGJ,MAAM,iBAAiB,CAAC;AACzB,OAAO,MAAM,MAAM,QAAQ,CAAC;AAC5B,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAG/C,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,GAAG,UAAU,CAAC;IAC3B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,UAAU,CAAC,EAAE,GAAG,CAAC,UAAU,CAAC;IAC5B,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAClC,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAE3B;;;OAGG;IACH,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AA0SD,qBAAa,GAAI,SAAQ,GAAG,CAAC,GAAG;;IAK9B;;;;;;OAMG;gBACS,IAAI,GAAE,OAAO,CAAC,UAAU,CAAqB;IAuBhD,KAAK,IAAI,MAAM;IAIxB,IAAa,KAAK,IAAI,MAAM,CAE3B;IAEQ,OAAO,IAAI,IAAI;IAKT,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IAIhC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAInB,IAAI,CAAC,EACZ,OAAO,EACP,OAAO,EACP,WAAyC,EACzC,iBAAiB,EACjB,UAAU,EACV,WAAW,GACZ,EAAE;QACD,OAAO,EAAE,GAAG,CAAC,WAAW,CAAC;QACzB,OAAO,CAAC,EAAE,GAAG,CAAC,WAAW,CAAC;QAC1B,WAAW,CAAC,EAAE,iBAAiB,CAAC;QAChC,iBAAiB,CAAC,EAAE,OAAO,CAAC;QAC5B,UAAU,CAAC,EAAE,GAAG,CAAC,UAAU,CAAC;QAC5B,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;KACvC,GAAG,GAAG,CAAC,SAAS;CAUlB"}
|