Skip to content

Commit aebdf08

Browse files
authoredMay 28, 2024
HUME-4611: Add pause/resume messages (#207)
·
v0.2.00.1.7
1 parent 824f6a2 commit aebdf08

File tree

10 files changed

+94
-5
lines changed

10 files changed

+94
-5
lines changed
 

‎examples/next-app/components/ExampleComponent.tsx

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
import type { EmotionScores } from '@humeai/voice';
44
import { useVoice } from '@humeai/voice-react';
55
import { SelectItem } from '@radix-ui/react-select';
6-
import { useMemo, useState } from 'react';
6+
import { useCallback, useMemo, useState } from 'react';
77
import { match } from 'ts-pattern';
88

99
import {
@@ -38,12 +38,26 @@ export const ExampleComponent = () => {
3838
callDurationTimestamp,
3939
sendUserInput,
4040
sendAssistantInput,
41+
sendResumeAssistantMessage,
42+
sendPauseAssistantMessage,
4143
} = useVoice();
4244

4345
const [textValue, setTextValue] = useState('');
4446
const [textInputType, setTextInputType] = useState<'user' | 'assistant'>(
4547
'user',
4648
);
49+
const [paused, setPaused] = useState(false);
50+
51+
const togglePaused = useCallback(() => {
52+
if (paused) {
53+
sendResumeAssistantMessage();
54+
setPaused(false);
55+
} else {
56+
sendPauseAssistantMessage();
57+
setPaused(true);
58+
}
59+
}, [paused]);
60+
const pausedText = paused ? 'Resume' : 'Pause';
4761

4862
const assistantMessages = useMemo(() => {
4963
return messages
@@ -165,6 +179,13 @@ export const ExampleComponent = () => {
165179
>
166180
Send text input message
167181
</button>
182+
183+
<button
184+
className="border border-black p-2"
185+
onClick={togglePaused}
186+
>
187+
{pausedText}
188+
</button>
168189
</div>
169190

170191
<div>

‎packages/core/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@humeai/voice",
3-
"version": "0.1.6-beta.1",
3+
"version": "0.1.6-beta.2",
44
"description": "",
55
"main": "./dist/index.js",
66
"module": "./dist/index.mjs",

‎packages/core/src/lib/client.ts

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -243,4 +243,42 @@ export class VoiceClient {
243243
get readyState() {
244244
return this.socket.readyState;
245245
}
246+
247+
/**
248+
* @name sendPauseAssistantMessage
249+
* @description
250+
* Send pause assistant message to the websocket. This pauses responses from EVI. Chat history is still saved and sent after resuming.
251+
*/
252+
sendPauseAssistantMessage() {
253+
if (!this.socket) {
254+
throw new Error('Socket is not connected.');
255+
}
256+
257+
if (this.socket.readyState !== WebSocket.OPEN) {
258+
throw new Error('Socket is not open.');
259+
}
260+
261+
const json = JSON.stringify({ type: 'pause_assistant_message' });
262+
263+
this.socket.send(json);
264+
}
265+
266+
/**
267+
* @name sendResumeAssistantMessage
268+
* @description
269+
* Send resume assistant message to the websocket. This resumes responses from EVI. Chat history sent while paused will now be sent.
270+
*/
271+
sendResumeAssistantMessage() {
272+
if (!this.socket) {
273+
throw new Error('Socket is not connected.');
274+
}
275+
276+
if (this.socket.readyState !== WebSocket.OPEN) {
277+
throw new Error('Socket is not open.');
278+
}
279+
280+
const json = JSON.stringify({ type: 'resume_assistant_message' });
281+
282+
this.socket.send(json);
283+
}
246284
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
import z from 'zod';
2+
3+
export const PauseAssistantMessageSchema = z.object({
4+
type: z.literal('pause_assistant_message'),
5+
});
6+
7+
export type PauseAssistantMessage = z.infer<typeof PauseAssistantMessageSchema>;
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
import z from 'zod';
2+
3+
export const ResumeAssistantMessageSchema = z.object({
4+
type: z.literal('resume_assistant_message'),
5+
});
6+
7+
export type ResumeAssistantMessage = z.infer<
8+
typeof ResumeAssistantMessageSchema
9+
>;

‎packages/embed-react/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@humeai/voice-embed-react",
3-
"version": "0.1.6-beta.1",
3+
"version": "0.1.6-beta.2",
44
"description": "",
55
"main": "./dist/index.js",
66
"module": "./dist/index.mjs",

‎packages/embed/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@humeai/voice-embed",
3-
"version": "0.1.6-beta.1",
3+
"version": "0.1.6-beta.2",
44
"description": "",
55
"main": "./dist/index.js",
66
"module": "./dist/index.mjs",

‎packages/react/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@humeai/voice-react",
3-
"version": "0.1.6-beta.1",
3+
"version": "0.1.6-beta.2",
44
"description": "",
55
"main": "./dist/index.js",
66
"module": "./dist/index.mjs",

‎packages/react/src/lib/VoiceProvider.tsx

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,8 @@ export type VoiceContextType = {
8282
sendAssistantInput: VoiceClient['sendAssistantInput'];
8383
sendSessionSettings: VoiceClient['sendSessionSettings'];
8484
sendToolMessage: VoiceClient['sendToolMessage'];
85+
sendPauseAssistantMessage: VoiceClient['sendPauseAssistantMessage'];
86+
sendResumeAssistantMessage: VoiceClient['sendResumeAssistantMessage'];
8587
status: VoiceStatus;
8688
micFft: number[];
8789
error: VoiceError | null;
@@ -379,6 +381,8 @@ export const VoiceProvider: FC<VoiceProviderProps> = ({
379381
sendAssistantInput: client.sendAssistantInput,
380382
sendSessionSettings: client.sendSessionSettings,
381383
sendToolMessage: client.sendToolMessage,
384+
sendPauseAssistantMessage: client.sendPauseAssistantMessage,
385+
sendResumeAssistantMessage: client.sendResumeAssistantMessage,
382386
status,
383387
unmute: mic.unmute,
384388
error,
@@ -407,6 +411,8 @@ export const VoiceProvider: FC<VoiceProviderProps> = ({
407411
client.sendAssistantInput,
408412
client.sendSessionSettings,
409413
client.sendToolMessage,
414+
client.sendPauseAssistantMessage,
415+
client.sendResumeAssistantMessage,
410416
status,
411417
error,
412418
isAudioError,

‎packages/react/src/lib/useVoiceClient.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -205,6 +205,12 @@ export const useVoiceClient = (props: {
205205
},
206206
[],
207207
);
208+
const sendPauseAssistantMessage = useCallback(() => {
209+
client.current?.sendPauseAssistantMessage();
210+
}, []);
211+
const sendResumeAssistantMessage = useCallback(() => {
212+
client.current?.sendResumeAssistantMessage();
213+
}, []);
208214

209215
return {
210216
readyState,
@@ -215,5 +221,7 @@ export const useVoiceClient = (props: {
215221
sendUserInput,
216222
sendAssistantInput,
217223
sendToolMessage,
224+
sendPauseAssistantMessage,
225+
sendResumeAssistantMessage,
218226
};
219227
};

0 commit comments

Comments
 (0)
Please sign in to comment.