From 76cdffd5bea821c3d97b53f1b1a79506a497affc Mon Sep 17 00:00:00 2001 From: Yini Shi Date: Tue, 27 Aug 2024 20:55:59 -0400 Subject: [PATCH] replace tool response and error parser with zod schema --- packages/react/src/lib/useVoiceClient.ts | 40 ++++++++++++++++++------ 1 file changed, 31 insertions(+), 9 deletions(-) diff --git a/packages/react/src/lib/useVoiceClient.ts b/packages/react/src/lib/useVoiceClient.ts index 328f180..7be59ec 100644 --- a/packages/react/src/lib/useVoiceClient.ts +++ b/packages/react/src/lib/useVoiceClient.ts @@ -1,6 +1,6 @@ import { type Hume, HumeClient } from 'hume'; -import * as serializers from 'hume/serialization'; import { useCallback, useRef, useState } from 'react'; +import z from 'zod'; import { type AuthStrategy } from './auth'; @@ -148,17 +148,39 @@ export const useVoiceClient = (props: { }) .then((response) => { // check that response is a correctly formatted response or error payload - const parsedResponse = - serializers.empathicVoice.ToolResponseMessage.parse(response); - const parsedError = - serializers.empathicVoice.ToolErrorMessage.parse(response); + const parsedResponse = z + .object({ + type: z.literal('tool_response'), + customSessionId: z.string().optional(), + toolCallId: z.string(), + content: z.string(), + toolName: z.string().optional(), + toolType: z.enum(['builtin', 'function']).optional(), + }) + .safeParse(response); + + const parsedError = z + .object({ + type: z.literal('tool_error'), + customSessionId: z.string().optional(), + toolType: z.enum(['builtin', 'function']).optional(), + toolCallId: z.string(), + content: z.string().optional(), + error: z.string(), + code: z.string().optional(), + level: z.enum(['warn']).optional(), + }) + .safeParse(response); // if valid send it to the socket // otherwise, report error - if (response.type === 'tool_response' && parsedResponse.ok) { - client.current?.sendToolResponseMessage(response); - } else if (response.type === 'tool_error' && parsedError.ok) { - client.current?.sendToolErrorMessage(response); + if (response.type === 'tool_response' && parsedResponse.success) { + client.current?.sendToolResponseMessage(parsedResponse.data); + } else if ( + response.type === 'tool_error' && + parsedError.success + ) { + client.current?.sendToolErrorMessage(parsedError.data); } else { onError.current?.('Invalid response from tool call'); }