diff --git a/src/lib/gateway-client-realtime.test.ts b/src/lib/gateway-client-realtime.test.ts index 58ef1c4..1898cbc 100644 --- a/src/lib/gateway-client-realtime.test.ts +++ b/src/lib/gateway-client-realtime.test.ts @@ -9,7 +9,7 @@ const device: DeviceIdentity = { }; describe("GatewayClient realtime Talk compatibility", () => { - it("creates gateway relay sessions through the unified Talk session API", async () => { + it("creates realtime talk sessions through the OpenClaw client Talk API", async () => { const client = new GatewayClient("ws://localhost:18789", null, device); const rpc = vi.spyOn(client, "rpc").mockResolvedValueOnce({ transport: "gateway-relay", @@ -25,7 +25,37 @@ describe("GatewayClient realtime Talk compatibility", () => { relaySessionId: "relay_1", }); - expect(rpc).toHaveBeenCalledWith("talk.session.create", { + expect(rpc).toHaveBeenCalledWith("talk.client.create", { + sessionKey: "main", + provider: "openai", + agentId: "NEO", + }); + }); + + it("falls back to the unified Talk session API when client Talk create is unavailable", async () => { + const client = new GatewayClient("ws://localhost:18789", null, device); + const rpc = vi.spyOn(client, "rpc") + .mockRejectedValueOnce(new Error("method not found")) + .mockResolvedValueOnce({ + transport: "gateway-relay", + relaySessionId: "relay_1", + }); + + await expect(client.realtimeTalkSession({ + sessionKey: "main", + provider: "openai", + agentId: "NEO", + })).resolves.toMatchObject({ + transport: "gateway-relay", + relaySessionId: "relay_1", + }); + + expect(rpc).toHaveBeenNthCalledWith(1, "talk.client.create", { + sessionKey: "main", + provider: "openai", + agentId: "NEO", + }); + expect(rpc).toHaveBeenNthCalledWith(2, "talk.session.create", { sessionKey: "main", provider: "openai", mode: "realtime", diff --git a/src/lib/gateway-client.ts b/src/lib/gateway-client.ts index f8ba0b4..06ceb13 100644 --- a/src/lib/gateway-client.ts +++ b/src/lib/gateway-client.ts @@ -748,6 +748,17 @@ export class GatewayClient { async realtimeTalkSession( params: GatewayRealtimeTalkSessionParams = {}, ): Promise { + const clientParams = withoutUndefined(params); + try { + return await this.rpc("talk.client.create", clientParams); + } catch (err) { + if ( + !isLikelyMissingGatewayMethod(err) && + params.transport && + params.transport !== "gateway-relay" + ) throw err; + } + try { const sessionParams = withoutUndefined(params); delete sessionParams.agentId;