From 59c9b24b8da9648ec561dc23d133ee86105e0b15 Mon Sep 17 00:00:00 2001 From: Harry Smaje Date: Tue, 29 Jul 2025 09:49:43 +0100 Subject: [PATCH 1/2] feat: add sendHumanMessage method to AnamClient - Add sendHumanMessage() method for sending human text messages - Method checks streaming status and active session - Formats message with timestamp, session_id, and message_type - Add JSDoc documentation for talk() and sendDataMessage() methods --- src/AnamClient.ts | 47 +++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 43 insertions(+), 4 deletions(-) diff --git a/src/AnamClient.ts b/src/AnamClient.ts index 50bc50c..1afb6e0 100644 --- a/src/AnamClient.ts +++ b/src/AnamClient.ts @@ -1,13 +1,14 @@ +import { Buffer } from 'buffer'; import { ClientError, ErrorCode } from './lib/ClientError'; -import { generateCorrelationId } from './lib/correlationId'; import { ClientMetricMeasurement, DEFAULT_ANAM_API_VERSION, DEFAULT_ANAM_METRICS_BASE_URL, - setClientMetricsBaseUrl, sendClientMetric, + setClientMetricsBaseUrl, setMetricsContext, } from './lib/ClientMetrics'; +import { generateCorrelationId } from './lib/correlationId'; import { CoreApiRestClient, InternalEventEmitter, @@ -18,15 +19,14 @@ import { import { AnamClientOptions, AnamEvent, + ConnectionClosedCode, EventCallbacks, InputAudioState, PersonaConfig, StartSessionOptions, StartSessionResponse, - ConnectionClosedCode, } from './types'; import { TalkMessageStream } from './types/TalkMessageStream'; -import { Buffer } from 'buffer'; export default class AnamClient { private publicEventEmitter: PublicEventEmitter; private internalEventEmitter: InternalEventEmitter; @@ -386,6 +386,11 @@ export default class AnamClient { this.streamingClient.startConnection(); } + /** + * Send a talk command to make the persona speak the provided content. + * @param content - The text content for the persona to speak + * @throws Error if session is not started or not currently streaming + */ public async talk(content: string): Promise { if (!this.streamingClient) { throw new Error( @@ -401,6 +406,11 @@ export default class AnamClient { return; } + /** + * Send a raw data message through the WebRTC data channel. + * @param message - The message string to send through the data channel + * @throws Error if session is not started + */ public sendDataMessage(message: string): void { if (this.streamingClient) { this.streamingClient.sendDataMessage(message); @@ -409,6 +419,35 @@ export default class AnamClient { } } + /** + * Send a human text message in the active streaming session. + * @param content - The text message content to send + * @throws Error if not currently streaming or session is not started + */ + public sendHumanMessage(content: string): void { + if (!this._isStreaming) { + console.warn( + 'AnamClient: Not currently streaming. Human message will not be sent.', + ); + throw new Error('Failed to send human message: not currently streaming'); + } + + const sessionId = this.getActiveSessionId(); + if (!sessionId) { + throw new Error('Failed to send human message: no active session'); + } + + const currentTimestamp = new Date().toISOString().replace('Z', ''); + const body = JSON.stringify({ + content, + timestamp: currentTimestamp, + session_id: sessionId, + message_type: 'speech', + }); + + this.sendDataMessage(body); + } + public async stopStreaming(): Promise { if (this.streamingClient) { this.publicEventEmitter.emit( From e679770ab3d733af2c01efd1d670ca444d7ec589 Mon Sep 17 00:00:00 2001 From: Harry Smaje Date: Tue, 29 Jul 2025 10:18:20 +0100 Subject: [PATCH 2/2] refactor: rename sendHumanMessage to sendUserMessage - Rename method from sendHumanMessage() to sendUserMessage() - Update JSDoc documentation to use 'user' instead of 'human' - Update error messages and console warnings accordingly --- src/AnamClient.ts | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/AnamClient.ts b/src/AnamClient.ts index 1afb6e0..b41234d 100644 --- a/src/AnamClient.ts +++ b/src/AnamClient.ts @@ -420,21 +420,21 @@ export default class AnamClient { } /** - * Send a human text message in the active streaming session. + * Send a user text message in the active streaming session. * @param content - The text message content to send * @throws Error if not currently streaming or session is not started */ - public sendHumanMessage(content: string): void { + public sendUserMessage(content: string): void { if (!this._isStreaming) { console.warn( - 'AnamClient: Not currently streaming. Human message will not be sent.', + 'AnamClient: Not currently streaming. User message will not be sent.', ); - throw new Error('Failed to send human message: not currently streaming'); + throw new Error('Failed to send user message: not currently streaming'); } const sessionId = this.getActiveSessionId(); if (!sessionId) { - throw new Error('Failed to send human message: no active session'); + throw new Error('Failed to send user message: no active session'); } const currentTimestamp = new Date().toISOString().replace('Z', '');