





















@@ -205,6 +205,13 @@ vi.mock("openclaw/plugin-sdk/agent-runtime", async () => {
205205return {
206206 ...actual,
207207agentCommandFromIngress: agentCommandMock,
208+getTtsProvider: vi.fn(() => "openai"),
209+resolveAgentDir: vi.fn(() => "/tmp/openclaw-agent"),
210+resolveTtsConfig: vi.fn(() => ({
211+modelOverrides: {},
212+providerConfigs: {},
213+})),
214+resolveTtsPrefsPath: vi.fn(() => "/tmp/openclaw-tts.json"),
208215};
209216});
210217@@ -261,6 +268,7 @@ vi.mock("../runtime.js", () => ({
261268}));
262269263270let managerModule: typeof import("./manager.js");
271+let segmentModule: typeof import("./segment.js");
264272265273function createVoiceChannelInfo(
266274channelId: string,
@@ -316,7 +324,10 @@ function createRuntime() {
316324317325describe("DiscordVoiceManager", () => {
318326beforeAll(async () => {
319-managerModule = await import("./manager.js");
327+[managerModule, segmentModule] = await Promise.all([
328+import("./manager.js"),
329+import("./segment.js"),
330+]);
320331});
321332322333beforeEach(() => {
@@ -5048,16 +5059,54 @@ describe("DiscordVoiceManager", () => {
50485059discriminator: "1234",
50495060},
50505061});
5051-const manager = createManager({ groupPolicy: "open", allowFrom: ["discord:u-owner"] }, client);
5062+const discordConfig: ConstructorParameters<
5063+typeof managerModule.DiscordVoiceManager
5064+>[0]["discordConfig"] = { groupPolicy: "open", allowFrom: ["discord:u-owner"] };
5065+const manager = createManager(discordConfig, client);
5066+const enqueuePlayback = vi.fn();
5067+const speakerContext = (
5068+manager as unknown as {
5069+speakerContext: Parameters<
5070+typeof segmentModule.processDiscordVoiceSegment
5071+>[0]["speakerContext"];
5072+}
5073+).speakerContext;
505250745053-await processVoiceSegment(manager, "u-owner");
5075+await segmentModule.processDiscordVoiceSegment({
5076+entry: {
5077+guildId: "g1",
5078+channelId: "1001",
5079+sessionChannelId: "1001",
5080+voiceSessionKey: "discord:g1:1001",
5081+route: { sessionKey: "discord:g1:1001", agentId: "agent-1" },
5082+connection: createConnectionMock(),
5083+player: createAudioPlayerMock(),
5084+playbackQueue: Promise.resolve(),
5085+processingQueue: Promise.resolve(),
5086+capture: createVoiceCaptureState(),
5087+receiveRecovery: createVoiceReceiveRecoveryState(),
5088+isStopped: () => false,
5089+stop: vi.fn(),
5090+} as unknown as Parameters<typeof segmentModule.processDiscordVoiceSegment>[0]["entry"],
5091+wavPath: "/tmp/test.wav",
5092+userId: "u-owner",
5093+durationSeconds: 1.2,
5094+cfg: {},
5095+ discordConfig,
5096+ownerAllowFrom: ["discord:u-owner"],
5097+runtime: createRuntime(),
5098+fetchGuildName: async () => "Guild One",
5099+ speakerContext,
5100+ enqueuePlayback,
5101+});
5054510250555103expect(controlRealtimeVoiceAgentRunMock).toHaveBeenCalledWith({
50565104sessionKey: "discord:g1:1001",
50575105text: "use the smaller implementation",
50585106});
50595107expect(agentCommandMock).not.toHaveBeenCalled();
50605108expect(lastTtsArgs().text).toBe("Got it. I steered the active run.");
5109+expect(enqueuePlayback).toHaveBeenCalledTimes(1);
50615110});
5062511150635112it("passes configured model override to agent command in voice flow", async () => {
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。