@wix/legends-platform-sdk 1.0.0 → 1.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/conversation/types.js.map +1 -1
- package/dist/cjs/hooks/useConversation/livekit/types.js.map +1 -1
- package/dist/cjs/hooks/useConversation/livekit/useConversation.js +32 -18
- package/dist/cjs/hooks/useConversation/livekit/useConversation.js.map +1 -1
- package/dist/cjs/hooks/useConversation/livekit/utils/dataChannel.js +4 -0
- package/dist/cjs/hooks/useConversation/livekit/utils/dataChannel.js.map +1 -1
- package/dist/cjs/hooks/useConversationEvents/types.js.map +1 -1
- package/dist/cjs/hooks/useCreateConversation/useCreateConversation.js.map +1 -1
- package/dist/cjs/hooks/useTextChat/helpers.js +37 -0
- package/dist/cjs/hooks/useTextChat/helpers.js.map +1 -0
- package/dist/cjs/hooks/useTextChat/useTextChat.js.map +1 -1
- package/dist/cjs/hooks/useTextChat/useToolAwareSend.js +34 -8
- package/dist/cjs/hooks/useTextChat/useToolAwareSend.js.map +1 -1
- package/dist/cjs/services/FetchPersonaChatService.js +13 -3
- package/dist/cjs/services/FetchPersonaChatService.js.map +1 -1
- package/dist/cjs/types/index.js.map +1 -1
- package/dist/cjs/types/service.js.map +1 -1
- package/dist/esm/conversation/types.js.map +1 -1
- package/dist/esm/hooks/useConversation/livekit/types.js.map +1 -1
- package/dist/esm/hooks/useConversation/livekit/useConversation.js +33 -19
- package/dist/esm/hooks/useConversation/livekit/useConversation.js.map +1 -1
- package/dist/esm/hooks/useConversation/livekit/utils/dataChannel.js +3 -0
- package/dist/esm/hooks/useConversation/livekit/utils/dataChannel.js.map +1 -1
- package/dist/esm/hooks/useConversationEvents/types.js.map +1 -1
- package/dist/esm/hooks/useCreateConversation/useCreateConversation.js.map +1 -1
- package/dist/esm/hooks/useTextChat/helpers.js +35 -0
- package/dist/esm/hooks/useTextChat/helpers.js.map +1 -0
- package/dist/esm/hooks/useTextChat/useTextChat.js.map +1 -1
- package/dist/esm/hooks/useTextChat/useToolAwareSend.js +33 -7
- package/dist/esm/hooks/useTextChat/useToolAwareSend.js.map +1 -1
- package/dist/esm/services/FetchPersonaChatService.js +13 -3
- package/dist/esm/services/FetchPersonaChatService.js.map +1 -1
- package/dist/esm/types/index.js.map +1 -1
- package/dist/esm/types/service.js.map +1 -1
- package/dist/types/conversation/types.d.ts +1 -1
- package/dist/types/conversation/types.d.ts.map +1 -1
- package/dist/types/hooks/useConversation/livekit/types.d.ts +3 -0
- package/dist/types/hooks/useConversation/livekit/types.d.ts.map +1 -1
- package/dist/types/hooks/useConversation/livekit/useConversation.d.ts.map +1 -1
- package/dist/types/hooks/useConversation/livekit/utils/dataChannel.d.ts +2 -1
- package/dist/types/hooks/useConversation/livekit/utils/dataChannel.d.ts.map +1 -1
- package/dist/types/hooks/useConversationEvents/types.d.ts +4 -0
- package/dist/types/hooks/useConversationEvents/types.d.ts.map +1 -1
- package/dist/types/hooks/useCreateConversation/useCreateConversation.d.ts +1 -1
- package/dist/types/hooks/useCreateConversation/useCreateConversation.d.ts.map +1 -1
- package/dist/types/hooks/useTextChat/helpers.d.ts +7 -0
- package/dist/types/hooks/useTextChat/helpers.d.ts.map +1 -0
- package/dist/types/hooks/useTextChat/useTextChat.d.ts +3 -1
- package/dist/types/hooks/useTextChat/useTextChat.d.ts.map +1 -1
- package/dist/types/hooks/useTextChat/useToolAwareSend.d.ts +3 -1
- package/dist/types/hooks/useTextChat/useToolAwareSend.d.ts.map +1 -1
- package/dist/types/services/FetchPersonaChatService.d.ts +2 -1
- package/dist/types/services/FetchPersonaChatService.d.ts.map +1 -1
- package/dist/types/types/index.d.ts +1 -1
- package/dist/types/types/index.d.ts.map +1 -1
- package/dist/types/types/service.d.ts +11 -1
- package/dist/types/types/service.d.ts.map +1 -1
- package/package.json +3 -4
- package/livekit-client.patch +0 -19
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_http","require","BASE_URL","resolveLimitMs","limitation","undefined","type","limit","FetchPersonaChatService","constructor","apiKey","_defineProperty2","default","headers","Authorization","post","path","body","response","fetch","method","JSON","stringify","ok","text","catch","HttpError","status","json","createVoiceConversation","params","chatId","namespace","chatConfig","data","url","conversationUrl","id","interactiveConversationId","createInteractiveConversation","endInteractiveConversation","conversationId","sendChatMessage","message","functionCallResults","queryChatMessages","_data$pagingMetadata","cursor","query","cursorPaging","messages","chatMessages","map","m","content","role","createdAt","nextCursor","pagingMetadata","cursors","next","exports"],"sources":["../../../src/services/FetchPersonaChatService.ts"],"sourcesContent":["import { HttpError } from '../types/http';\nimport type {\n IPersonaChatService,\n CreateConversationParams,\n ConversationResult,\n EndConversationParams,\n SendMessageParams,\n QueryMessagesParams,\n QueryMessagesResult,\n FunctionCall,\n Limitation,\n} from '../types
|
|
1
|
+
{"version":3,"names":["_http","require","BASE_URL","resolveLimitMs","limitation","undefined","type","limit","FetchPersonaChatService","constructor","apiKey","_defineProperty2","default","headers","Authorization","post","path","body","response","fetch","method","JSON","stringify","ok","text","catch","HttpError","status","json","createVoiceConversation","params","chatId","namespace","chatConfig","data","url","conversationUrl","id","interactiveConversationId","createInteractiveConversation","endInteractiveConversation","conversationId","sendChatMessage","message","functionCallResults","attachments","queryChatMessages","_data$pagingMetadata","cursor","query","cursorPaging","messages","chatMessages","map","m","content","role","createdAt","nextCursor","pagingMetadata","cursors","next","exports"],"sources":["../../../src/services/FetchPersonaChatService.ts"],"sourcesContent":["import { HttpError } from '../types/http';\nimport type {\n IPersonaChatService,\n CreateConversationParams,\n ConversationResult,\n EndConversationParams,\n SendMessageParams,\n QueryMessagesParams,\n QueryMessagesResult,\n FunctionCall,\n ChatMessage,\n Limitation,\n} from '../types';\n\nconst BASE_URL = 'https://www.wixapis.com';\n\nfunction resolveLimitMs(limitation?: Limitation): number | undefined {\n if (!limitation) {\n return undefined;\n }\n switch (limitation.type) {\n case 'MINUTES':\n return (limitation.limit ?? 0) * 60 * 1000;\n case 'SECONDS':\n return (limitation.limit ?? 0) * 1000;\n case 'TOKENS':\n default:\n return 0;\n }\n}\n\nexport class FetchPersonaChatService implements IPersonaChatService {\n private readonly apiKey: string;\n\n constructor(apiKey: string) {\n this.apiKey = apiKey;\n }\n\n private headers(): Record<string, string> {\n return {\n 'Content-Type': 'application/json',\n Authorization: `Api-Key ${this.apiKey}`,\n };\n }\n\n private async post<T>(path: string, body: unknown): Promise<T> {\n const response = await fetch(`${BASE_URL}${path}`, {\n method: 'POST',\n headers: this.headers(),\n body: JSON.stringify(body),\n });\n\n if (!response.ok) {\n const text = await response.text().catch(() => '');\n throw new HttpError(\n response.status,\n `Request failed: ${response.status} ${text}`,\n );\n }\n\n return response.json() as Promise<T>;\n }\n\n async createVoiceConversation(\n params: CreateConversationParams,\n ): Promise<ConversationResult> {\n const { chatId, namespace, chatConfig } = params;\n\n const data = await this.post<{\n conversationUrl?: string;\n interactiveConversationId?: string;\n limitation?: Limitation;\n }>(\n `/_api/persona-chat-service/v1/chats/${chatId}/create-voice-conversation`,\n {\n namespace,\n ...(chatConfig ? { chatConfig } : {}),\n },\n );\n\n return {\n url: data.conversationUrl ?? '',\n id: data.interactiveConversationId ?? '',\n limit: resolveLimitMs(data.limitation),\n };\n }\n\n async createInteractiveConversation(\n params: CreateConversationParams,\n ): Promise<ConversationResult> {\n const { chatId, namespace, chatConfig } = params;\n\n const data = await this.post<{\n conversationUrl?: string;\n interactiveConversationId?: string;\n limitation?: Limitation;\n }>(\n `/_api/persona-chat-service/v1/chats/${chatId}/create-interactive-conversation`,\n {\n namespace,\n ...(chatConfig ? { chatConfig } : {}),\n },\n );\n\n return {\n url: data.conversationUrl ?? '',\n id: data.interactiveConversationId ?? '',\n limit: resolveLimitMs(data.limitation),\n };\n }\n\n async endInteractiveConversation(\n params: EndConversationParams,\n ): Promise<void> {\n const { chatId, conversationId, namespace } = params;\n\n await this.post(\n `/_api/persona-chat-service/v1/chats/${chatId}/end-interactive-conversation`,\n { namespace, interactiveConversationId: conversationId },\n ).catch(() => {\n // best-effort\n });\n }\n\n async sendChatMessage(\n params: SendMessageParams,\n ): Promise<{ functionCalls?: FunctionCall[]; messages?: ChatMessage[] }> {\n const {\n chatId,\n namespace,\n message,\n functionCallResults,\n chatConfig,\n attachments,\n } = params;\n\n return this.post<{\n functionCalls?: FunctionCall[];\n messages?: ChatMessage[];\n }>(`/_api/persona-chat-service/v1/chats/${chatId}/messages`, {\n namespace,\n message,\n ...(functionCallResults ? { functionCallResults } : {}),\n ...(chatConfig ? { chatConfig } : {}),\n ...(attachments ? { attachments } : {}),\n });\n }\n\n async queryChatMessages(\n params: QueryMessagesParams,\n ): Promise<QueryMessagesResult> {\n const { chatId, namespace, limit = 100, cursor } = params;\n\n const data = await this.post<{\n chatMessages?: {\n id: string;\n content: string;\n role: string;\n createdAt?: string;\n }[];\n pagingMetadata?: { cursors?: { next?: string } };\n }>(`/_api/persona-chat-service/v1/chats/${chatId}/messages/query`, {\n namespace,\n query: { cursorPaging: { limit, ...(cursor ? { cursor } : {}) } },\n });\n\n return {\n messages: (data.chatMessages ?? []).map((m) => ({\n id: m.id,\n content: m.content,\n role: m.role as 'user' | 'assistant',\n createdAt: m.createdAt,\n })),\n nextCursor: data.pagingMetadata?.cursors?.next,\n };\n }\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_http","require","exports","HttpError"],"sources":["../../../src/types/index.ts"],"sourcesContent":["export type { IHttpClient, HttpRequestConfig } from './http';\nexport { HttpError } from './http';\nexport type {\n IPersonaChatService,\n ConversationResult,\n CreateConversationParams,\n EndConversationParams,\n SendMessageParams,\n ChatMessage,\n QueryMessagesParams,\n QueryMessagesResult,\n FunctionCall,\n FunctionCallResult,\n Limitation,\n LimitationType,\n} from './service';\n"],"mappings":";;;;AACA,IAAAA,KAAA,GAAAC,OAAA;AAAmCC,OAAA,CAAAC,SAAA,GAAAH,KAAA,CAAAG,SAAA","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":["_http","require","exports","HttpError"],"sources":["../../../src/types/index.ts"],"sourcesContent":["export type { IHttpClient, HttpRequestConfig } from './http';\nexport { HttpError } from './http';\nexport type {\n IPersonaChatService,\n ConversationResult,\n CreateConversationParams,\n EndConversationParams,\n SendMessageParams,\n ChatMessage,\n ChatMessageAttachment,\n QueryMessagesParams,\n QueryMessagesResult,\n FunctionCall,\n FunctionCallResult,\n Limitation,\n LimitationType,\n} from './service';\n"],"mappings":";;;;AACA,IAAAA,KAAA,GAAAC,OAAA;AAAmCC,OAAA,CAAAC,SAAA,GAAAH,KAAA,CAAAG,SAAA","ignoreList":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":[],"sources":["../../../src/types/service.ts"],"sourcesContent":["export type FunctionCall = {\n functionCallId: string;\n name: string;\n arguments: string;\n};\n\nexport type FunctionCallResult = {\n functionCallId: string;\n result: string;\n error?: string;\n};\n\nexport type LimitationType = 'MINUTES' | 'SECONDS' | 'TOKENS';\n\nexport interface Limitation {\n type?: LimitationType;\n limit?: number;\n}\n\nexport interface ConversationResult {\n url: string;\n id: string;\n limit?: number;\n}\n\nexport interface CreateConversationParams {\n chatId: string;\n namespace: string;\n chatConfig?:
|
|
1
|
+
{"version":3,"names":[],"sources":["../../../src/types/service.ts"],"sourcesContent":["export type FunctionCall = {\n functionCallId: string;\n name: string;\n arguments: string;\n};\n\nexport type FunctionCallResult = {\n functionCallId: string;\n result: string;\n error?: string;\n};\n\nexport type LimitationType = 'MINUTES' | 'SECONDS' | 'TOKENS';\n\nexport interface Limitation {\n type?: LimitationType;\n limit?: number;\n}\n\nexport interface ConversationResult {\n url: string;\n id: string;\n limit?: number;\n}\n\nexport interface CreateConversationParams {\n chatId: string;\n namespace: string;\n chatConfig?: object;\n}\n\nexport interface EndConversationParams {\n chatId: string;\n conversationId: string;\n namespace: string;\n}\n\nexport interface ChatMessageAttachment {\n fileName?: string;\n url?: string;\n mimeType?: string;\n textFileContent?: string;\n}\n\nexport interface SendMessageParams {\n chatId: string;\n namespace: string;\n message: string;\n functionCallResults?: FunctionCallResult[];\n chatConfig?: object;\n attachments?: ChatMessageAttachment[];\n}\n\nexport interface ChatMessage {\n id: string;\n content: string;\n role: 'user' | 'assistant';\n createdAt?: string;\n attachments?: ChatMessageAttachment[];\n}\n\nexport interface QueryMessagesParams {\n chatId: string;\n namespace: string;\n limit?: number;\n cursor?: string;\n}\n\nexport interface QueryMessagesResult {\n messages: ChatMessage[];\n nextCursor?: string;\n}\n\nexport interface IPersonaChatService {\n createVoiceConversation(\n params: CreateConversationParams,\n ): Promise<ConversationResult>;\n createInteractiveConversation(\n params: CreateConversationParams,\n ): Promise<ConversationResult>;\n endInteractiveConversation(params: EndConversationParams): Promise<void>;\n sendChatMessage(\n params: SendMessageParams,\n ): Promise<{ functionCalls?: FunctionCall[]; messages?: ChatMessage[] }>;\n queryChatMessages(params: QueryMessagesParams): Promise<QueryMessagesResult>;\n}\n"],"mappings":"","ignoreList":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":[],"sources":["../../../src/conversation/types.ts"],"sourcesContent":["export type ConversationType = 'video' | 'audio';\n\nexport type ConversationParticipantRole = 'user' | 'agent';\n\nexport type ConversationVendor =\n | 'LIVEKIT'\n | 'DAILY'\n | 'HUME'\n | 'ELEVEN_LABS'\n | 'UNKNOWN_VENDOR';\n\nexport type AgentConnectionState =\n | 'joined' // agent is connected to the conversation\n | 'joining' // agent is connecting to the conversation\n | 'left' // agent left the conversation\n | 'idle'; // agent is not connected to the conversation\n\nexport type UserConnectionState =\n | 'joined' // user is connected to the conversation\n | 'joining' // user is connecting to the conversation\n | 'idle' // user is not connected to the conversation\n | 'leaving' // user is leaving the conversation\n | 'join-error'; // failed to join the conversation\n\nexport type ActivityState = 'idle' | 'speaking' | 'listening';\n\nexport type ConversationStatus =\n // Initial state\n | 'pending' // conversation is not created yet\n // States\n | 'created' // conversation was created\n | 'destroying' // destroying the conversation\n | 'destroyed' // conversation was destroyed\n | 'exceeded' // conversation limit is exceeded\n // Errors\n | 'voice-not-found' // failed to find a voice\n | 'initialization-error' // failed to create conversation\n | 'error'; // unknown error\n\nexport type Conversation = {\n id: string;\n url: string;\n limit?: number;\n type: ConversationType;\n};\n\nexport type ConversationTranscription = {\n message: string;\n source: ConversationParticipantRole;\n id: string;\n};\n\nexport type ConversationDevice = {\n enabled: boolean;\n deviceId: string;\n};\n\nexport type ConversationAudio = {\n // Range between `0.0` and `1.0`.\n volume: number;\n muted: boolean;\n};\n"],"mappings":"","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":[],"sources":["../../../src/conversation/types.ts"],"sourcesContent":["export type ConversationType = 'video' | 'audio';\n\nexport type ConversationParticipantRole = 'user' | 'agent';\n\nexport type ConversationVendor =\n | 'LIVEKIT'\n | 'DAILY'\n | 'HUME'\n | 'ELEVEN_LABS'\n | 'UNKNOWN_VENDOR';\n\nexport type AgentConnectionState =\n | 'joined' // agent is connected to the conversation\n | 'joining' // agent is connecting to the conversation\n | 'left' // agent left the conversation\n | 'idle'; // agent is not connected to the conversation\n\nexport type UserConnectionState =\n | 'joined' // user is connected to the conversation\n | 'joining' // user is connecting to the conversation\n | 'idle' // user is not connected to the conversation\n | 'leaving' // user is leaving the conversation\n | 'join-error'; // failed to join the conversation\n\nexport type ActivityState = 'idle' | 'speaking' | 'listening';\n\nexport type ConversationStatus =\n // Initial state\n | 'pending' // conversation is not created yet\n // States\n | 'created' // conversation was created\n | 'destroying' // destroying the conversation\n | 'destroyed' // conversation was destroyed\n | 'exceeded' // conversation limit is exceeded\n | 'inactivity-timeout' // conversation ended due to inactivity\n // Errors\n | 'voice-not-found' // failed to find a voice\n | 'initialization-error' // failed to create conversation\n | 'error'; // unknown error\n\nexport type Conversation = {\n id: string;\n url: string;\n limit?: number;\n type: ConversationType;\n};\n\nexport type ConversationTranscription = {\n message: string;\n source: ConversationParticipantRole;\n id: string;\n};\n\nexport type ConversationDevice = {\n enabled: boolean;\n deviceId: string;\n};\n\nexport type ConversationAudio = {\n // Range between `0.0` and `1.0`.\n volume: number;\n muted: boolean;\n};\n"],"mappings":"","ignoreList":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":[],"sources":["../../../../../src/hooks/useConversation/livekit/types.ts"],"sourcesContent":["import type { FunctionCall, FunctionCallResult } from '../../../types/service';\nimport type {\n ToolCallEnvelope,\n ToolRuntimeAdapter,\n} from '../../useTools/runtime/types';\n\nexport type InactivityWarningData = {\n type: 'inactivity_warning';\n grace_period_sec: number;\n};\n\nexport type ToolRuntimeLike = {\n handleIncoming(\n envelope: ToolCallEnvelope,\n adapter: ToolRuntimeAdapter,\n ): Promise<void>;\n};\n\nexport type TurnDetectionData = {\n createdAt: number;\n participantIdentity: string;\n sequence: number;\n source: string;\n state: 'listening' | 'speaking';\n turnDetectionStrategy: 'livekit_turn_detector' | 'silero_vad';\n type: string;\n version: number;\n participantKind: 'STANDARD' | 'AGENT';\n speechId?: string;\n};\n\nexport type ToolCallsData = {\n type: 'tool_calls';\n requestId: string;\n functionCalls: FunctionCall[];\n};\n\nexport type ToolResultsData = {\n type: 'tool_results';\n requestId: string;\n functionCallResults: FunctionCallResult[];\n};\n"],"mappings":"","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":[],"sources":["../../../../../src/hooks/useConversation/livekit/types.ts"],"sourcesContent":["import type { FunctionCall, FunctionCallResult } from '../../../types/service';\nimport type {\n ToolCallEnvelope,\n ToolRuntimeAdapter,\n} from '../../useTools/runtime/types';\n\nexport type InactivityWarningData = {\n type: 'inactivity_warning';\n grace_period_sec: number;\n};\n\nexport type InactivityTimeoutData = {\n type: 'inactivity_timeout';\n};\n\nexport type ToolRuntimeLike = {\n handleIncoming(\n envelope: ToolCallEnvelope,\n adapter: ToolRuntimeAdapter,\n ): Promise<void>;\n};\n\nexport type TurnDetectionData = {\n createdAt: number;\n participantIdentity: string;\n sequence: number;\n source: string;\n state: 'listening' | 'speaking';\n turnDetectionStrategy: 'livekit_turn_detector' | 'silero_vad';\n type: string;\n version: number;\n participantKind: 'STANDARD' | 'AGENT';\n speechId?: string;\n};\n\nexport type ToolCallsData = {\n type: 'tool_calls';\n requestId: string;\n functionCalls: FunctionCall[];\n};\n\nexport type ToolResultsData = {\n type: 'tool_results';\n requestId: string;\n functionCallResults: FunctionCallResult[];\n};\n"],"mappings":"","ignoreList":[]}
|
|
@@ -9,7 +9,7 @@ import { state } from '../../../conversation';
|
|
|
9
9
|
import { useCreateConversation } from '../../useCreateConversation';
|
|
10
10
|
import { useEmitConversationEvent } from '../../useConversationEvents/useEmitConversationEvent';
|
|
11
11
|
import { useToolCallingRuntime } from '../../useTools/runtime/useToolCallingRuntime';
|
|
12
|
-
import { checkIsTurnDetectionData, checkIsInactivityWarningData, checkIsToolCallsData, createLivekitToolAdapter, decodeDataPayload, findJoinedAgentParticipant, mergeTranscriptions, publishConversationDataMessage, safeStringify, shouldHandleParticipantConnected } from './utils';
|
|
12
|
+
import { checkIsTurnDetectionData, checkIsInactivityWarningData, checkIsInactivityTimeoutData, checkIsToolCallsData, createLivekitToolAdapter, decodeDataPayload, findJoinedAgentParticipant, mergeTranscriptions, publishConversationDataMessage, safeStringify, shouldHandleParticipantConnected } from './utils';
|
|
13
13
|
export function useConversation(_ref) {
|
|
14
14
|
var _conversation$data2;
|
|
15
15
|
let _ref$autoJoin = _ref.autoJoin,
|
|
@@ -69,6 +69,7 @@ export function useConversation(_ref) {
|
|
|
69
69
|
const setUserActivityState = useSetAtom(state.userActivityState);
|
|
70
70
|
const emitEvent = useEmitConversationEvent();
|
|
71
71
|
const userStopRef = useRef(null);
|
|
72
|
+
const inactivityTimeoutRef = useRef(false);
|
|
72
73
|
const timer = useTimer({
|
|
73
74
|
autoStart: false,
|
|
74
75
|
onExpire: handleExpire,
|
|
@@ -215,6 +216,13 @@ export function useConversation(_ref) {
|
|
|
215
216
|
gracePeriodSec: data.grace_period_sec
|
|
216
217
|
});
|
|
217
218
|
}
|
|
219
|
+
function handleInactivityTimeoutEvent(_data) {
|
|
220
|
+
var _conversationRef$curr3;
|
|
221
|
+
inactivityTimeoutRef.current = true;
|
|
222
|
+
emitEvent('inactivityTimeout', {
|
|
223
|
+
conversationId: (_conversationRef$curr3 = conversationRef.current) == null ? void 0 : _conversationRef$curr3.id
|
|
224
|
+
});
|
|
225
|
+
}
|
|
218
226
|
async function handleToolCallsEvent(data) {
|
|
219
227
|
await toolRuntimeRef.current.resolveIncomingToolCalls(data, toolAdapter);
|
|
220
228
|
}
|
|
@@ -227,9 +235,10 @@ export function useConversation(_ref) {
|
|
|
227
235
|
}, {
|
|
228
236
|
guard: checkIsInactivityWarningData,
|
|
229
237
|
handle: handleInactivityWarningEvent
|
|
230
|
-
}
|
|
231
|
-
|
|
232
|
-
|
|
238
|
+
}, {
|
|
239
|
+
guard: checkIsInactivityTimeoutData,
|
|
240
|
+
handle: handleInactivityTimeoutEvent
|
|
241
|
+
}];
|
|
233
242
|
function handleDataReceivedEvent(payload) {
|
|
234
243
|
const decoded = decodeDataPayload(payload);
|
|
235
244
|
if (decoded === null) {
|
|
@@ -247,11 +256,11 @@ export function useConversation(_ref) {
|
|
|
247
256
|
}
|
|
248
257
|
}
|
|
249
258
|
function handleConnectedEvent() {
|
|
250
|
-
var _conversationRef$
|
|
259
|
+
var _conversationRef$curr4;
|
|
251
260
|
setUserConnectionState('joined');
|
|
252
261
|
setAgentConnectionState('joining');
|
|
253
262
|
emitEvent('callStarted', {
|
|
254
|
-
conversationId: (_conversationRef$
|
|
263
|
+
conversationId: (_conversationRef$curr4 = conversationRef.current) == null ? void 0 : _conversationRef$curr4.id
|
|
255
264
|
});
|
|
256
265
|
}
|
|
257
266
|
async function handleEncryptionErrorEvent(error) {
|
|
@@ -264,6 +273,11 @@ export function useConversation(_ref) {
|
|
|
264
273
|
setAgentConnectionState('idle');
|
|
265
274
|
setUserActivityState('idle');
|
|
266
275
|
setUserConnectionState('idle');
|
|
276
|
+
if (inactivityTimeoutRef.current) {
|
|
277
|
+
inactivityTimeoutRef.current = false;
|
|
278
|
+
setConversationStatus('inactivity-timeout');
|
|
279
|
+
return;
|
|
280
|
+
}
|
|
267
281
|
switch (reason) {
|
|
268
282
|
case DisconnectReason.CLIENT_INITIATED:
|
|
269
283
|
break;
|
|
@@ -282,18 +296,18 @@ export function useConversation(_ref) {
|
|
|
282
296
|
}
|
|
283
297
|
}
|
|
284
298
|
function handleAgentJoin(participant) {
|
|
285
|
-
var _conversationRef$
|
|
299
|
+
var _conversationRef$curr5;
|
|
286
300
|
setAgentConnectionState('joined');
|
|
287
301
|
emitEvent('agentJoined', {
|
|
288
|
-
conversationId: (_conversationRef$
|
|
302
|
+
conversationId: (_conversationRef$curr5 = conversationRef.current) == null ? void 0 : _conversationRef$curr5.id,
|
|
289
303
|
participant
|
|
290
304
|
});
|
|
291
305
|
}
|
|
292
306
|
function handleParticipantDisconnectedEvent(participant) {
|
|
293
|
-
var _conversationRef$
|
|
307
|
+
var _conversationRef$curr6;
|
|
294
308
|
setAgentConnectionState('left');
|
|
295
309
|
emitEvent('agentLeft', {
|
|
296
|
-
conversationId: (_conversationRef$
|
|
310
|
+
conversationId: (_conversationRef$curr6 = conversationRef.current) == null ? void 0 : _conversationRef$curr6.id,
|
|
297
311
|
participant
|
|
298
312
|
});
|
|
299
313
|
}
|
|
@@ -302,13 +316,13 @@ export function useConversation(_ref) {
|
|
|
302
316
|
return;
|
|
303
317
|
}
|
|
304
318
|
try {
|
|
305
|
-
var _conversationRef$
|
|
319
|
+
var _conversationRef$curr7;
|
|
306
320
|
setUserConnectionState('leaving');
|
|
307
321
|
await (room == null ? void 0 : room.disconnect(true));
|
|
308
322
|
setConversationStatus('destroyed');
|
|
309
323
|
setJoinedAt(undefined);
|
|
310
324
|
emitEvent('callEnded', {
|
|
311
|
-
conversationId: (_conversationRef$
|
|
325
|
+
conversationId: (_conversationRef$curr7 = conversationRef.current) == null ? void 0 : _conversationRef$curr7.id
|
|
312
326
|
});
|
|
313
327
|
} catch (error) {
|
|
314
328
|
console.error('Failed to leave', error);
|
|
@@ -316,18 +330,18 @@ export function useConversation(_ref) {
|
|
|
316
330
|
}
|
|
317
331
|
}
|
|
318
332
|
async function handleExpire() {
|
|
319
|
-
var _conversationRef$
|
|
333
|
+
var _conversationRef$curr8, _conversationRef$curr9;
|
|
320
334
|
emitEvent('timeExceeded', {
|
|
321
|
-
conversationId: (_conversationRef$
|
|
322
|
-
limit: (_conversationRef$
|
|
335
|
+
conversationId: (_conversationRef$curr8 = conversationRef.current) == null ? void 0 : _conversationRef$curr8.id,
|
|
336
|
+
limit: (_conversationRef$curr9 = conversationRef.current) == null ? void 0 : _conversationRef$curr9.limit
|
|
323
337
|
});
|
|
324
338
|
await leave();
|
|
325
339
|
setConversationStatus('exceeded');
|
|
326
340
|
}
|
|
327
341
|
async function interrupt() {
|
|
328
|
-
var _conversationRef$
|
|
342
|
+
var _conversationRef$curr0;
|
|
329
343
|
emitEvent('interrupt', {
|
|
330
|
-
conversationId: (_conversationRef$
|
|
344
|
+
conversationId: (_conversationRef$curr0 = conversationRef.current) == null ? void 0 : _conversationRef$curr0.id
|
|
331
345
|
});
|
|
332
346
|
await publishConversationDataMessage(room, {}, 'interrupt');
|
|
333
347
|
}
|
|
@@ -337,7 +351,7 @@ export function useConversation(_ref) {
|
|
|
337
351
|
}, 'inactivity_dismiss');
|
|
338
352
|
}
|
|
339
353
|
async function send(message, attachments) {
|
|
340
|
-
var _conversationRef$
|
|
354
|
+
var _conversationRef$curr1;
|
|
341
355
|
if (attachments === void 0) {
|
|
342
356
|
attachments = [];
|
|
343
357
|
}
|
|
@@ -348,7 +362,7 @@ export function useConversation(_ref) {
|
|
|
348
362
|
}
|
|
349
363
|
}));
|
|
350
364
|
emitEvent('userSendMessage', {
|
|
351
|
-
conversationId: (_conversationRef$
|
|
365
|
+
conversationId: (_conversationRef$curr1 = conversationRef.current) == null ? void 0 : _conversationRef$curr1.id,
|
|
352
366
|
message
|
|
353
367
|
});
|
|
354
368
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["useEffect","useRef","DisconnectReason","setLogLevel","ParticipantKind","LogLevel","invariant","useTimer","useLatest","useUpdateEffect","useEnsureRoom","useMediaDeviceSelect","useAtom","useAtomValue","useSetAtom","state","useCreateConversation","useEmitConversationEvent","useToolCallingRuntime","checkIsTurnDetectionData","checkIsInactivityWarningData","checkIsToolCallsData","createLivekitToolAdapter","decodeDataPayload","findJoinedAgentParticipant","mergeTranscriptions","publishConversationDataMessage","safeStringify","shouldHandleParticipantConnected","useConversation","_ref","_conversation$data2","_ref$autoJoin","autoJoin","type","config","_ref$startWithMicroph","startWithMicrophone","_ref$startWithCamera","startWithCamera","silent","conversation","room","speaker","_useAtom","microphone","setMicrophone","_useAtom2","camera","setCamera","toolRuntime","toolAdapter","conversationRef","data","toolRuntimeRef","_useAtom3","conversationStatus","setConversationStatus","_useAtom4","userConnectionState","setUserConnectionState","_useAtom5","joinedAt","setJoinedAt","_useMediaDeviceSelect","kind","setMicrophoneDeviceId","setActiveMediaDevice","_useMediaDeviceSelect2","setSpeakerDeviceId","_useMediaDeviceSelect3","requestPermissions","enabled","setCameraDeviceId","setTranscriptions","transcriptions","_useAtom6","agentConnectionState","setAgentConnectionState","setAgentActivityState","agentActivityState","setUserActivityState","userActivityState","emitEvent","userStopRef","timer","autoStart","onExpire","handleExpire","expiryTimestamp","Date","registerRoomEvents","unregisterRoomEvents","deviceId","localParticipant","setMicrophoneEnabled","setCameraEnabled","resolution","width","height","join","_conversation$data","limit","undefined","restart","getTime","_conversation$data3","url","URL","accessToken","searchParams","get","connect","remoteParticipant","handleAgentJoin","enableMediaDevices","error","console","handleTranscriptionReceivedEvent","segments","participant","map","s","id","message","text","source","AGENT","old","handleTurnDetectionEvent","_conversationRef$curr","conversationId","current","participantKind","eventState","ts","performance","now","turnDetectionStrategy","sequence","speechId","latencyMs","handleInactivityWarningEvent","_conversationRef$curr2","gracePeriodSec","grace_period_sec","handleToolCallsEvent","resolveIncomingToolCalls","dataChannelHandlers","guard","handle","handleDataReceivedEvent","payload","decoded","_ref2","Promise","resolve","catch","handleConnectedEvent","_conversationRef$curr3","handleEncryptionErrorEvent","handleDisconnectedEvent","reason","CLIENT_INITIATED","ROOM_CLOSED","handleParticipantConnectedEvent","_conversationRef$curr4","handleParticipantDisconnectedEvent","_conversationRef$curr5","leave","_conversationRef$curr6","disconnect","_conversationRef$curr7","_conversationRef$curr8","interrupt","_conversationRef$curr9","dismissInactivity","send","attachments","_conversationRef$curr0","sendText","topic","attributes","on","off","status"],"sources":["../../../../../src/hooks/useConversation/livekit/useConversation.ts"],"sourcesContent":["import { useEffect, useRef } from 'react';\nimport {\n DisconnectReason,\n Participant,\n setLogLevel,\n ParticipantKind,\n RemoteParticipant,\n TranscriptionSegment,\n LogLevel,\n} from 'livekit-client';\nimport invariant from 'invariant';\nimport { useTimer } from 'react-timer-hook';\nimport { useLatest, useUpdateEffect } from 'react-use';\nimport { useEnsureRoom, useMediaDeviceSelect } from '@livekit/components-react';\nimport { useAtom, useAtomValue, useSetAtom } from 'jotai';\nimport {\n Conversation,\n state,\n type ConversationTranscription,\n} from '../../../conversation';\nimport type {\n UseConversationResult,\n UseConversationOptions,\n Attachment,\n} from '../types';\nimport type {\n InactivityWarningData,\n TurnDetectionData,\n ToolCallsData,\n} from './types';\nimport { useCreateConversation } from '../../useCreateConversation';\n\nimport { useEmitConversationEvent } from '../../useConversationEvents/useEmitConversationEvent';\nimport { useToolCallingRuntime } from '../../useTools/runtime/useToolCallingRuntime';\nimport {\n checkIsTurnDetectionData,\n checkIsInactivityWarningData,\n checkIsToolCallsData,\n createLivekitToolAdapter,\n decodeDataPayload,\n findJoinedAgentParticipant,\n mergeTranscriptions,\n publishConversationDataMessage,\n safeStringify,\n shouldHandleParticipantConnected,\n} from './utils';\n\nexport function useConversation({\n autoJoin = true,\n type,\n config,\n startWithMicrophone = false,\n startWithCamera = false,\n}: UseConversationOptions): UseConversationResult {\n setLogLevel(LogLevel.silent);\n\n const conversation = useCreateConversation({ type, config });\n const room = useEnsureRoom();\n const speaker = useAtomValue(state.speaker);\n const [microphone, setMicrophone] = useAtom(state.microphone);\n const [camera, setCamera] = useAtom(state.camera);\n const toolRuntime = useToolCallingRuntime();\n const toolAdapter = createLivekitToolAdapter(room);\n\n // for use in register/unregister room events\n const conversationRef = useLatest<Conversation | undefined>(\n conversation.data,\n );\n const toolRuntimeRef = useLatest(toolRuntime);\n\n const [conversationStatus, setConversationStatus] = useAtom(\n state.conversationStatus,\n );\n\n const [userConnectionState, setUserConnectionState] = useAtom(\n state.userConnectionState,\n );\n\n const [joinedAt, setJoinedAt] = useAtom(state.joinedAt);\n\n const { setActiveMediaDevice: setMicrophoneDeviceId } = useMediaDeviceSelect({\n kind: 'audioinput',\n });\n\n const { setActiveMediaDevice: setSpeakerDeviceId } = useMediaDeviceSelect({\n kind: 'audiooutput',\n });\n\n const { setActiveMediaDevice: setCameraDeviceId } = useMediaDeviceSelect({\n kind: 'videoinput',\n requestPermissions: camera.enabled,\n });\n\n const setTranscriptions = useSetAtom(state.transcriptions);\n const [agentConnectionState, setAgentConnectionState] = useAtom(\n state.agentConnectionState,\n );\n const setAgentActivityState = useSetAtom(state.agentActivityState);\n const setUserActivityState = useSetAtom(state.userActivityState);\n const emitEvent = useEmitConversationEvent();\n\n const userStopRef = useRef<{\n ts: number;\n turnDetectionStrategy: string;\n sequence?: number;\n speechId?: string;\n } | null>(null);\n\n const timer = useTimer({\n autoStart: false,\n onExpire: handleExpire,\n expiryTimestamp: new Date(),\n });\n\n useEffect(() => {\n if (!room) {\n return;\n }\n registerRoomEvents();\n\n return () => {\n unregisterRoomEvents();\n };\n }, [room]);\n\n useUpdateEffect(() => {\n setMicrophoneDeviceId(microphone.deviceId);\n }, [microphone.deviceId]);\n\n useUpdateEffect(() => {\n setSpeakerDeviceId(speaker.deviceId);\n }, [speaker.deviceId]);\n\n useUpdateEffect(() => {\n setCameraDeviceId(camera.deviceId);\n }, [camera.deviceId]);\n\n useUpdateEffect(() => {\n if (agentConnectionState !== 'joined') {\n return;\n }\n room.localParticipant.setMicrophoneEnabled(microphone.enabled);\n }, [microphone.enabled, agentConnectionState]);\n\n useUpdateEffect(() => {\n if (agentConnectionState !== 'joined') {\n return;\n }\n room.localParticipant.setCameraEnabled(camera.enabled, {\n resolution: { width: 1920, height: 1080 },\n });\n }, [camera.enabled, agentConnectionState]);\n\n useEffect(() => {\n if (!autoJoin) {\n return;\n }\n\n if (conversationStatus === 'created') {\n void join();\n }\n }, [conversationStatus, autoJoin]);\n\n useEffect(() => {\n if (!joinedAt || conversation.data?.limit === undefined) {\n return;\n }\n\n timer.restart(new Date(joinedAt.getTime() + conversation.data!.limit!));\n }, [joinedAt, conversation.data?.limit]);\n\n async function join() {\n invariant(userConnectionState === 'idle', 'Already joined');\n invariant(conversation.data, 'Conversation is not ready');\n const url = new URL(conversation?.data?.url || '');\n const accessToken = url.searchParams.get('token');\n try {\n setUserConnectionState('joining');\n await room?.connect(conversation.data.url, accessToken!, {});\n\n // sometimes the agent is already joined before the user joins the conversation\n const remoteParticipant = findJoinedAgentParticipant(room, type);\n if (remoteParticipant && agentConnectionState !== 'joined') {\n handleAgentJoin(remoteParticipant);\n }\n\n enableMediaDevices();\n } catch (error) {\n console.error('Failed to join', error);\n setUserConnectionState('join-error');\n }\n }\n\n function enableMediaDevices() {\n if (startWithMicrophone) {\n setMicrophone({ ...microphone, enabled: true });\n }\n if (startWithCamera && type === 'video') {\n setCamera({ ...camera, enabled: true });\n }\n }\n\n function handleTranscriptionReceivedEvent(\n segments: TranscriptionSegment[],\n participant?: Participant,\n ) {\n const transcriptions: ConversationTranscription[] = segments.map((s) => ({\n id: s.id,\n message: s.text,\n source: participant?.kind === ParticipantKind.AGENT ? 'agent' : 'user',\n }));\n\n setTranscriptions((old) => mergeTranscriptions(transcriptions, old));\n }\n\n function handleTurnDetectionEvent(data: TurnDetectionData) {\n const conversationId = conversationRef.current?.id;\n const { participantKind, state: eventState } = data;\n switch (participantKind) {\n case 'STANDARD':\n if (eventState === 'listening') {\n userStopRef.current = {\n ts: performance.now(),\n turnDetectionStrategy: data.turnDetectionStrategy,\n sequence: data.sequence,\n speechId: data.speechId,\n };\n } else {\n userStopRef.current = null;\n }\n emitEvent(\n eventState === 'speaking' ? 'userSpeakStart' : 'userSpeakStop',\n { conversationId: conversationId! },\n );\n setUserActivityState(eventState);\n break;\n case 'AGENT':\n if (eventState === 'speaking' && userStopRef.current) {\n const latencyMs = performance.now() - userStopRef.current.ts;\n emitEvent('responseLatency', {\n conversationId: conversationId!,\n latencyMs,\n turnDetectionStrategy: userStopRef.current.turnDetectionStrategy,\n sequence: userStopRef.current.sequence,\n speechId: data.speechId ?? userStopRef.current.speechId,\n });\n userStopRef.current = null;\n }\n emitEvent(\n eventState === 'speaking' ? 'agentSpeakStart' : 'agentSpeakStop',\n { conversationId: conversationId! },\n );\n setAgentActivityState(eventState);\n break;\n }\n }\n\n function handleInactivityWarningEvent(data: InactivityWarningData) {\n emitEvent('inactivityWarning', {\n conversationId: conversationRef.current?.id!,\n gracePeriodSec: data.grace_period_sec,\n });\n }\n\n async function handleToolCallsEvent(data: ToolCallsData) {\n await toolRuntimeRef.current.resolveIncomingToolCalls(data, toolAdapter);\n }\n\n const dataChannelHandlers: {\n guard: (data: unknown) => boolean;\n handle: (data: unknown) => void | Promise<void>;\n }[] = [\n {\n guard: checkIsToolCallsData,\n handle: handleToolCallsEvent as (data: unknown) => Promise<void>,\n },\n {\n guard: checkIsTurnDetectionData,\n handle: handleTurnDetectionEvent as (data: unknown) => void,\n },\n {\n guard: checkIsInactivityWarningData,\n handle: handleInactivityWarningEvent as (data: unknown) => void,\n },\n // ... other data channel handlers\n ];\n\n function handleDataReceivedEvent(payload: Uint8Array) {\n const decoded = decodeDataPayload(payload);\n if (decoded === null) {\n return;\n }\n for (const { guard, handle } of dataChannelHandlers) {\n if (guard(decoded)) {\n void Promise.resolve(handle(decoded)).catch((error) => {\n console.error('Failed to handle data channel payload', error);\n });\n return;\n }\n }\n }\n\n function handleConnectedEvent() {\n setUserConnectionState('joined');\n setAgentConnectionState('joining');\n emitEvent('callStarted', {\n conversationId: conversationRef.current?.id!,\n });\n }\n\n async function handleEncryptionErrorEvent(error: Error) {\n console.error('Encryption error', error);\n setConversationStatus('error');\n }\n\n function handleDisconnectedEvent(reason?: DisconnectReason) {\n userStopRef.current = null;\n setAgentActivityState('idle');\n setAgentConnectionState('idle');\n setUserActivityState('idle');\n setUserConnectionState('idle');\n\n switch (reason) {\n case DisconnectReason.CLIENT_INITIATED:\n break;\n case DisconnectReason.ROOM_CLOSED:\n setConversationStatus('destroyed');\n break;\n default:\n console.error('Conversation disconnected with reason', reason);\n setConversationStatus('error');\n break;\n }\n }\n\n function handleParticipantConnectedEvent(participant: RemoteParticipant) {\n if (shouldHandleParticipantConnected(participant, type)) {\n handleAgentJoin(participant);\n }\n }\n\n function handleAgentJoin(participant: RemoteParticipant) {\n setAgentConnectionState('joined');\n emitEvent('agentJoined', {\n conversationId: conversationRef.current?.id!,\n participant,\n });\n }\n\n function handleParticipantDisconnectedEvent(participant: RemoteParticipant) {\n setAgentConnectionState('left');\n emitEvent('agentLeft', {\n conversationId: conversationRef.current?.id!,\n participant,\n });\n }\n\n async function leave() {\n if (userConnectionState !== 'joined' && userConnectionState !== 'joining') {\n return;\n }\n\n try {\n setUserConnectionState('leaving');\n await room?.disconnect(true);\n setConversationStatus('destroyed');\n setJoinedAt(undefined);\n emitEvent('callEnded', {\n conversationId: conversationRef.current?.id!,\n });\n } catch (error) {\n console.error('Failed to leave', error);\n setConversationStatus('error');\n }\n }\n\n async function handleExpire() {\n emitEvent('timeExceeded', {\n conversationId: conversationRef.current?.id!,\n limit: conversationRef.current?.limit!,\n });\n await leave();\n setConversationStatus('exceeded');\n }\n\n async function interrupt() {\n emitEvent('interrupt', {\n conversationId: conversationRef.current?.id!,\n });\n\n await publishConversationDataMessage(room, {}, 'interrupt');\n }\n\n async function dismissInactivity() {\n await publishConversationDataMessage(\n room,\n { type: 'inactivity_dismiss' },\n 'inactivity_dismiss',\n );\n }\n\n async function send(message: string, attachments: Attachment[] = []) {\n await room?.localParticipant.sendText(message, {\n topic: 'lk.chat',\n attributes: {\n attachments: safeStringify(attachments),\n },\n });\n emitEvent('userSendMessage', {\n conversationId: conversationRef.current?.id!,\n message,\n });\n }\n\n function registerRoomEvents() {\n room\n .on('connected', handleConnectedEvent)\n .on('encryptionError', handleEncryptionErrorEvent)\n .on('disconnected', handleDisconnectedEvent)\n .on('transcriptionReceived', handleTranscriptionReceivedEvent)\n .on('participantConnected', handleParticipantConnectedEvent)\n .on('participantDisconnected', handleParticipantDisconnectedEvent)\n .on('dataReceived', handleDataReceivedEvent);\n }\n\n function unregisterRoomEvents() {\n room.off('connected', handleConnectedEvent);\n room.off('encryptionError', handleEncryptionErrorEvent);\n room.off('disconnected', handleDisconnectedEvent);\n room.off('transcriptionReceived', handleTranscriptionReceivedEvent);\n room.off('participantConnected', handleParticipantConnectedEvent);\n room.off('participantDisconnected', handleParticipantDisconnectedEvent);\n room.off('dataReceived', handleDataReceivedEvent);\n }\n\n return {\n status: conversationStatus,\n conversation: conversation.data,\n join,\n send,\n interrupt,\n dismissInactivity,\n leave,\n };\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":["useEffect","useRef","DisconnectReason","setLogLevel","ParticipantKind","LogLevel","invariant","useTimer","useLatest","useUpdateEffect","useEnsureRoom","useMediaDeviceSelect","useAtom","useAtomValue","useSetAtom","state","useCreateConversation","useEmitConversationEvent","useToolCallingRuntime","checkIsTurnDetectionData","checkIsInactivityWarningData","checkIsInactivityTimeoutData","checkIsToolCallsData","createLivekitToolAdapter","decodeDataPayload","findJoinedAgentParticipant","mergeTranscriptions","publishConversationDataMessage","safeStringify","shouldHandleParticipantConnected","useConversation","_ref","_conversation$data2","_ref$autoJoin","autoJoin","type","config","_ref$startWithMicroph","startWithMicrophone","_ref$startWithCamera","startWithCamera","silent","conversation","room","speaker","_useAtom","microphone","setMicrophone","_useAtom2","camera","setCamera","toolRuntime","toolAdapter","conversationRef","data","toolRuntimeRef","_useAtom3","conversationStatus","setConversationStatus","_useAtom4","userConnectionState","setUserConnectionState","_useAtom5","joinedAt","setJoinedAt","_useMediaDeviceSelect","kind","setMicrophoneDeviceId","setActiveMediaDevice","_useMediaDeviceSelect2","setSpeakerDeviceId","_useMediaDeviceSelect3","requestPermissions","enabled","setCameraDeviceId","setTranscriptions","transcriptions","_useAtom6","agentConnectionState","setAgentConnectionState","setAgentActivityState","agentActivityState","setUserActivityState","userActivityState","emitEvent","userStopRef","inactivityTimeoutRef","timer","autoStart","onExpire","handleExpire","expiryTimestamp","Date","registerRoomEvents","unregisterRoomEvents","deviceId","localParticipant","setMicrophoneEnabled","setCameraEnabled","resolution","width","height","join","_conversation$data","limit","undefined","restart","getTime","_conversation$data3","url","URL","accessToken","searchParams","get","connect","remoteParticipant","handleAgentJoin","enableMediaDevices","error","console","handleTranscriptionReceivedEvent","segments","participant","map","s","id","message","text","source","AGENT","old","handleTurnDetectionEvent","_conversationRef$curr","conversationId","current","participantKind","eventState","ts","performance","now","turnDetectionStrategy","sequence","speechId","latencyMs","handleInactivityWarningEvent","_conversationRef$curr2","gracePeriodSec","grace_period_sec","handleInactivityTimeoutEvent","_data","_conversationRef$curr3","handleToolCallsEvent","resolveIncomingToolCalls","dataChannelHandlers","guard","handle","handleDataReceivedEvent","payload","decoded","_ref2","Promise","resolve","catch","handleConnectedEvent","_conversationRef$curr4","handleEncryptionErrorEvent","handleDisconnectedEvent","reason","CLIENT_INITIATED","ROOM_CLOSED","handleParticipantConnectedEvent","_conversationRef$curr5","handleParticipantDisconnectedEvent","_conversationRef$curr6","leave","_conversationRef$curr7","disconnect","_conversationRef$curr8","_conversationRef$curr9","interrupt","_conversationRef$curr0","dismissInactivity","send","attachments","_conversationRef$curr1","sendText","topic","attributes","on","off","status"],"sources":["../../../../../src/hooks/useConversation/livekit/useConversation.ts"],"sourcesContent":["import { useEffect, useRef } from 'react';\nimport {\n DisconnectReason,\n Participant,\n setLogLevel,\n ParticipantKind,\n RemoteParticipant,\n TranscriptionSegment,\n LogLevel,\n} from 'livekit-client';\nimport invariant from 'invariant';\nimport { useTimer } from 'react-timer-hook';\nimport { useLatest, useUpdateEffect } from 'react-use';\nimport { useEnsureRoom, useMediaDeviceSelect } from '@livekit/components-react';\nimport { useAtom, useAtomValue, useSetAtom } from 'jotai';\nimport {\n Conversation,\n state,\n type ConversationTranscription,\n} from '../../../conversation';\nimport type {\n UseConversationResult,\n UseConversationOptions,\n Attachment,\n} from '../types';\nimport type {\n InactivityWarningData,\n InactivityTimeoutData,\n TurnDetectionData,\n ToolCallsData,\n} from './types';\nimport { useCreateConversation } from '../../useCreateConversation';\n\nimport { useEmitConversationEvent } from '../../useConversationEvents/useEmitConversationEvent';\nimport { useToolCallingRuntime } from '../../useTools/runtime/useToolCallingRuntime';\nimport {\n checkIsTurnDetectionData,\n checkIsInactivityWarningData,\n checkIsInactivityTimeoutData,\n checkIsToolCallsData,\n createLivekitToolAdapter,\n decodeDataPayload,\n findJoinedAgentParticipant,\n mergeTranscriptions,\n publishConversationDataMessage,\n safeStringify,\n shouldHandleParticipantConnected,\n} from './utils';\n\nexport function useConversation({\n autoJoin = true,\n type,\n config,\n startWithMicrophone = false,\n startWithCamera = false,\n}: UseConversationOptions): UseConversationResult {\n setLogLevel(LogLevel.silent);\n\n const conversation = useCreateConversation({ type, config });\n const room = useEnsureRoom();\n const speaker = useAtomValue(state.speaker);\n const [microphone, setMicrophone] = useAtom(state.microphone);\n const [camera, setCamera] = useAtom(state.camera);\n const toolRuntime = useToolCallingRuntime();\n const toolAdapter = createLivekitToolAdapter(room);\n\n // for use in register/unregister room events\n const conversationRef = useLatest<Conversation | undefined>(\n conversation.data,\n );\n const toolRuntimeRef = useLatest(toolRuntime);\n\n const [conversationStatus, setConversationStatus] = useAtom(\n state.conversationStatus,\n );\n\n const [userConnectionState, setUserConnectionState] = useAtom(\n state.userConnectionState,\n );\n\n const [joinedAt, setJoinedAt] = useAtom(state.joinedAt);\n\n const { setActiveMediaDevice: setMicrophoneDeviceId } = useMediaDeviceSelect({\n kind: 'audioinput',\n });\n\n const { setActiveMediaDevice: setSpeakerDeviceId } = useMediaDeviceSelect({\n kind: 'audiooutput',\n });\n\n const { setActiveMediaDevice: setCameraDeviceId } = useMediaDeviceSelect({\n kind: 'videoinput',\n requestPermissions: camera.enabled,\n });\n\n const setTranscriptions = useSetAtom(state.transcriptions);\n const [agentConnectionState, setAgentConnectionState] = useAtom(\n state.agentConnectionState,\n );\n const setAgentActivityState = useSetAtom(state.agentActivityState);\n const setUserActivityState = useSetAtom(state.userActivityState);\n const emitEvent = useEmitConversationEvent();\n\n const userStopRef = useRef<{\n ts: number;\n turnDetectionStrategy: string;\n sequence?: number;\n speechId?: string;\n } | null>(null);\n const inactivityTimeoutRef = useRef(false);\n\n const timer = useTimer({\n autoStart: false,\n onExpire: handleExpire,\n expiryTimestamp: new Date(),\n });\n\n useEffect(() => {\n if (!room) {\n return;\n }\n registerRoomEvents();\n\n return () => {\n unregisterRoomEvents();\n };\n }, [room]);\n\n useUpdateEffect(() => {\n setMicrophoneDeviceId(microphone.deviceId);\n }, [microphone.deviceId]);\n\n useUpdateEffect(() => {\n setSpeakerDeviceId(speaker.deviceId);\n }, [speaker.deviceId]);\n\n useUpdateEffect(() => {\n setCameraDeviceId(camera.deviceId);\n }, [camera.deviceId]);\n\n useUpdateEffect(() => {\n if (agentConnectionState !== 'joined') {\n return;\n }\n room.localParticipant.setMicrophoneEnabled(microphone.enabled);\n }, [microphone.enabled, agentConnectionState]);\n\n useUpdateEffect(() => {\n if (agentConnectionState !== 'joined') {\n return;\n }\n room.localParticipant.setCameraEnabled(camera.enabled, {\n resolution: { width: 1920, height: 1080 },\n });\n }, [camera.enabled, agentConnectionState]);\n\n useEffect(() => {\n if (!autoJoin) {\n return;\n }\n\n if (conversationStatus === 'created') {\n void join();\n }\n }, [conversationStatus, autoJoin]);\n\n useEffect(() => {\n if (!joinedAt || conversation.data?.limit === undefined) {\n return;\n }\n\n timer.restart(new Date(joinedAt.getTime() + conversation.data!.limit!));\n }, [joinedAt, conversation.data?.limit]);\n\n async function join() {\n invariant(userConnectionState === 'idle', 'Already joined');\n invariant(conversation.data, 'Conversation is not ready');\n const url = new URL(conversation?.data?.url || '');\n const accessToken = url.searchParams.get('token');\n try {\n setUserConnectionState('joining');\n await room?.connect(conversation.data.url, accessToken!, {});\n\n // sometimes the agent is already joined before the user joins the conversation\n const remoteParticipant = findJoinedAgentParticipant(room, type);\n if (remoteParticipant && agentConnectionState !== 'joined') {\n handleAgentJoin(remoteParticipant);\n }\n\n enableMediaDevices();\n } catch (error) {\n console.error('Failed to join', error);\n setUserConnectionState('join-error');\n }\n }\n\n function enableMediaDevices() {\n if (startWithMicrophone) {\n setMicrophone({ ...microphone, enabled: true });\n }\n if (startWithCamera && type === 'video') {\n setCamera({ ...camera, enabled: true });\n }\n }\n\n function handleTranscriptionReceivedEvent(\n segments: TranscriptionSegment[],\n participant?: Participant,\n ) {\n const transcriptions: ConversationTranscription[] = segments.map((s) => ({\n id: s.id,\n message: s.text,\n source: participant?.kind === ParticipantKind.AGENT ? 'agent' : 'user',\n }));\n\n setTranscriptions((old) => mergeTranscriptions(transcriptions, old));\n }\n\n function handleTurnDetectionEvent(data: TurnDetectionData) {\n const conversationId = conversationRef.current?.id;\n const { participantKind, state: eventState } = data;\n switch (participantKind) {\n case 'STANDARD':\n if (eventState === 'listening') {\n userStopRef.current = {\n ts: performance.now(),\n turnDetectionStrategy: data.turnDetectionStrategy,\n sequence: data.sequence,\n speechId: data.speechId,\n };\n } else {\n userStopRef.current = null;\n }\n emitEvent(\n eventState === 'speaking' ? 'userSpeakStart' : 'userSpeakStop',\n { conversationId: conversationId! },\n );\n setUserActivityState(eventState);\n break;\n case 'AGENT':\n if (eventState === 'speaking' && userStopRef.current) {\n const latencyMs = performance.now() - userStopRef.current.ts;\n emitEvent('responseLatency', {\n conversationId: conversationId!,\n latencyMs,\n turnDetectionStrategy: userStopRef.current.turnDetectionStrategy,\n sequence: userStopRef.current.sequence,\n speechId: data.speechId ?? userStopRef.current.speechId,\n });\n userStopRef.current = null;\n }\n emitEvent(\n eventState === 'speaking' ? 'agentSpeakStart' : 'agentSpeakStop',\n { conversationId: conversationId! },\n );\n setAgentActivityState(eventState);\n break;\n }\n }\n\n function handleInactivityWarningEvent(data: InactivityWarningData) {\n emitEvent('inactivityWarning', {\n conversationId: conversationRef.current?.id!,\n gracePeriodSec: data.grace_period_sec,\n });\n }\n\n function handleInactivityTimeoutEvent(_data: InactivityTimeoutData) {\n inactivityTimeoutRef.current = true;\n emitEvent('inactivityTimeout', {\n conversationId: conversationRef.current?.id!,\n });\n }\n\n async function handleToolCallsEvent(data: ToolCallsData) {\n await toolRuntimeRef.current.resolveIncomingToolCalls(data, toolAdapter);\n }\n\n const dataChannelHandlers: {\n guard: (data: unknown) => boolean;\n handle: (data: unknown) => void | Promise<void>;\n }[] = [\n {\n guard: checkIsToolCallsData,\n handle: handleToolCallsEvent as (data: unknown) => Promise<void>,\n },\n {\n guard: checkIsTurnDetectionData,\n handle: handleTurnDetectionEvent as (data: unknown) => void,\n },\n {\n guard: checkIsInactivityWarningData,\n handle: handleInactivityWarningEvent as (data: unknown) => void,\n },\n {\n guard: checkIsInactivityTimeoutData,\n handle: handleInactivityTimeoutEvent as (data: unknown) => void,\n },\n ];\n\n function handleDataReceivedEvent(payload: Uint8Array) {\n const decoded = decodeDataPayload(payload);\n if (decoded === null) {\n return;\n }\n for (const { guard, handle } of dataChannelHandlers) {\n if (guard(decoded)) {\n void Promise.resolve(handle(decoded)).catch((error) => {\n console.error('Failed to handle data channel payload', error);\n });\n return;\n }\n }\n }\n\n function handleConnectedEvent() {\n setUserConnectionState('joined');\n setAgentConnectionState('joining');\n emitEvent('callStarted', {\n conversationId: conversationRef.current?.id!,\n });\n }\n\n async function handleEncryptionErrorEvent(error: Error) {\n console.error('Encryption error', error);\n setConversationStatus('error');\n }\n\n function handleDisconnectedEvent(reason?: DisconnectReason) {\n userStopRef.current = null;\n setAgentActivityState('idle');\n setAgentConnectionState('idle');\n setUserActivityState('idle');\n setUserConnectionState('idle');\n\n if (inactivityTimeoutRef.current) {\n inactivityTimeoutRef.current = false;\n setConversationStatus('inactivity-timeout');\n return;\n }\n\n switch (reason) {\n case DisconnectReason.CLIENT_INITIATED:\n break;\n case DisconnectReason.ROOM_CLOSED:\n setConversationStatus('destroyed');\n break;\n default:\n console.error('Conversation disconnected with reason', reason);\n setConversationStatus('error');\n break;\n }\n }\n\n function handleParticipantConnectedEvent(participant: RemoteParticipant) {\n if (shouldHandleParticipantConnected(participant, type)) {\n handleAgentJoin(participant);\n }\n }\n\n function handleAgentJoin(participant: RemoteParticipant) {\n setAgentConnectionState('joined');\n emitEvent('agentJoined', {\n conversationId: conversationRef.current?.id!,\n participant,\n });\n }\n\n function handleParticipantDisconnectedEvent(participant: RemoteParticipant) {\n setAgentConnectionState('left');\n emitEvent('agentLeft', {\n conversationId: conversationRef.current?.id!,\n participant,\n });\n }\n\n async function leave() {\n if (userConnectionState !== 'joined' && userConnectionState !== 'joining') {\n return;\n }\n\n try {\n setUserConnectionState('leaving');\n await room?.disconnect(true);\n setConversationStatus('destroyed');\n setJoinedAt(undefined);\n emitEvent('callEnded', {\n conversationId: conversationRef.current?.id!,\n });\n } catch (error) {\n console.error('Failed to leave', error);\n setConversationStatus('error');\n }\n }\n\n async function handleExpire() {\n emitEvent('timeExceeded', {\n conversationId: conversationRef.current?.id!,\n limit: conversationRef.current?.limit!,\n });\n await leave();\n setConversationStatus('exceeded');\n }\n\n async function interrupt() {\n emitEvent('interrupt', {\n conversationId: conversationRef.current?.id!,\n });\n\n await publishConversationDataMessage(room, {}, 'interrupt');\n }\n\n async function dismissInactivity() {\n await publishConversationDataMessage(\n room,\n { type: 'inactivity_dismiss' },\n 'inactivity_dismiss',\n );\n }\n\n async function send(message: string, attachments: Attachment[] = []) {\n await room?.localParticipant.sendText(message, {\n topic: 'lk.chat',\n attributes: {\n attachments: safeStringify(attachments),\n },\n });\n emitEvent('userSendMessage', {\n conversationId: conversationRef.current?.id!,\n message,\n });\n }\n\n function registerRoomEvents() {\n room\n .on('connected', handleConnectedEvent)\n .on('encryptionError', handleEncryptionErrorEvent)\n .on('disconnected', handleDisconnectedEvent)\n .on('transcriptionReceived', handleTranscriptionReceivedEvent)\n .on('participantConnected', handleParticipantConnectedEvent)\n .on('participantDisconnected', handleParticipantDisconnectedEvent)\n .on('dataReceived', handleDataReceivedEvent);\n }\n\n function unregisterRoomEvents() {\n room.off('connected', handleConnectedEvent);\n room.off('encryptionError', handleEncryptionErrorEvent);\n room.off('disconnected', handleDisconnectedEvent);\n room.off('transcriptionReceived', handleTranscriptionReceivedEvent);\n room.off('participantConnected', handleParticipantConnectedEvent);\n room.off('participantDisconnected', handleParticipantDisconnectedEvent);\n room.off('dataReceived', handleDataReceivedEvent);\n }\n\n return {\n status: conversationStatus,\n conversation: conversation.data,\n join,\n send,\n interrupt,\n dismissInactivity,\n leave,\n };\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -12,6 +12,9 @@ export function checkIsTurnDetectionData(data) {
|
|
|
12
12
|
export function checkIsInactivityWarningData(data) {
|
|
13
13
|
return typeof data === 'object' && data !== null && 'type' in data && data.type === 'inactivity_warning' && 'grace_period_sec' in data && typeof data.grace_period_sec === 'number';
|
|
14
14
|
}
|
|
15
|
+
export function checkIsInactivityTimeoutData(data) {
|
|
16
|
+
return typeof data === 'object' && data !== null && 'type' in data && data.type === 'inactivity_timeout';
|
|
17
|
+
}
|
|
15
18
|
export function checkIsToolCallsData(data) {
|
|
16
19
|
return typeof data === 'object' && data !== null && 'type' in data && data.type === 'tool_calls' && 'requestId' in data && typeof data.requestId === 'string' && 'functionCalls' in data && Array.isArray(data.functionCalls);
|
|
17
20
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["decodeDataPayload","data","JSON","parse","TextDecoder","decode","error","console","checkIsTurnDetectionData","checkIsInactivityWarningData","type","grace_period_sec","checkIsToolCallsData","requestId","Array","isArray","functionCalls"],"sources":["../../../../../../src/hooks/useConversation/livekit/utils/dataChannel.ts"],"sourcesContent":["import type {\n InactivityWarningData,\n ToolCallsData,\n TurnDetectionData,\n} from '../types';\n\nexport function decodeDataPayload(data: Uint8Array): unknown {\n try {\n return JSON.parse(new TextDecoder().decode(data));\n } catch (error) {\n console.error('Failed to decode data received payload', error);\n return null;\n }\n}\n\nexport function checkIsTurnDetectionData(\n data: unknown,\n): data is TurnDetectionData {\n return (\n typeof data === 'object' &&\n data !== null &&\n 'participantKind' in data &&\n 'state' in data\n );\n}\n\nexport function checkIsInactivityWarningData(\n data: unknown,\n): data is InactivityWarningData {\n return (\n typeof data === 'object' &&\n data !== null &&\n 'type' in data &&\n (data as Record<string, unknown>).type === 'inactivity_warning' &&\n 'grace_period_sec' in data &&\n typeof (data as Record<string, unknown>).grace_period_sec === 'number'\n );\n}\n\nexport function checkIsToolCallsData(data: unknown): data is ToolCallsData {\n return (\n typeof data === 'object' &&\n data !== null &&\n 'type' in data &&\n (data as Record<string, unknown>).type === 'tool_calls' &&\n 'requestId' in data &&\n typeof (data as Record<string, unknown>).requestId === 'string' &&\n 'functionCalls' in data &&\n Array.isArray((data as Record<string, unknown>).functionCalls)\n );\n}\n"],"mappings":"
|
|
1
|
+
{"version":3,"names":["decodeDataPayload","data","JSON","parse","TextDecoder","decode","error","console","checkIsTurnDetectionData","checkIsInactivityWarningData","type","grace_period_sec","checkIsInactivityTimeoutData","checkIsToolCallsData","requestId","Array","isArray","functionCalls"],"sources":["../../../../../../src/hooks/useConversation/livekit/utils/dataChannel.ts"],"sourcesContent":["import type {\n InactivityWarningData,\n InactivityTimeoutData,\n ToolCallsData,\n TurnDetectionData,\n} from '../types';\n\nexport function decodeDataPayload(data: Uint8Array): unknown {\n try {\n return JSON.parse(new TextDecoder().decode(data));\n } catch (error) {\n console.error('Failed to decode data received payload', error);\n return null;\n }\n}\n\nexport function checkIsTurnDetectionData(\n data: unknown,\n): data is TurnDetectionData {\n return (\n typeof data === 'object' &&\n data !== null &&\n 'participantKind' in data &&\n 'state' in data\n );\n}\n\nexport function checkIsInactivityWarningData(\n data: unknown,\n): data is InactivityWarningData {\n return (\n typeof data === 'object' &&\n data !== null &&\n 'type' in data &&\n (data as Record<string, unknown>).type === 'inactivity_warning' &&\n 'grace_period_sec' in data &&\n typeof (data as Record<string, unknown>).grace_period_sec === 'number'\n );\n}\n\nexport function checkIsInactivityTimeoutData(\n data: unknown,\n): data is InactivityTimeoutData {\n return (\n typeof data === 'object' &&\n data !== null &&\n 'type' in data &&\n (data as Record<string, unknown>).type === 'inactivity_timeout'\n );\n}\n\nexport function checkIsToolCallsData(data: unknown): data is ToolCallsData {\n return (\n typeof data === 'object' &&\n data !== null &&\n 'type' in data &&\n (data as Record<string, unknown>).type === 'tool_calls' &&\n 'requestId' in data &&\n typeof (data as Record<string, unknown>).requestId === 'string' &&\n 'functionCalls' in data &&\n Array.isArray((data as Record<string, unknown>).functionCalls)\n );\n}\n"],"mappings":"AAOA,OAAO,SAASA,iBAAiBA,CAACC,IAAgB,EAAW;EAC3D,IAAI;IACF,OAAOC,IAAI,CAACC,KAAK,CAAC,IAAIC,WAAW,CAAC,CAAC,CAACC,MAAM,CAACJ,IAAI,CAAC,CAAC;EACnD,CAAC,CAAC,OAAOK,KAAK,EAAE;IACdC,OAAO,CAACD,KAAK,CAAC,wCAAwC,EAAEA,KAAK,CAAC;IAC9D,OAAO,IAAI;EACb;AACF;AAEA,OAAO,SAASE,wBAAwBA,CACtCP,IAAa,EACc;EAC3B,OACE,OAAOA,IAAI,KAAK,QAAQ,IACxBA,IAAI,KAAK,IAAI,IACb,iBAAiB,IAAIA,IAAI,IACzB,OAAO,IAAIA,IAAI;AAEnB;AAEA,OAAO,SAASQ,4BAA4BA,CAC1CR,IAAa,EACkB;EAC/B,OACE,OAAOA,IAAI,KAAK,QAAQ,IACxBA,IAAI,KAAK,IAAI,IACb,MAAM,IAAIA,IAAI,IACbA,IAAI,CAA6BS,IAAI,KAAK,oBAAoB,IAC/D,kBAAkB,IAAIT,IAAI,IAC1B,OAAQA,IAAI,CAA6BU,gBAAgB,KAAK,QAAQ;AAE1E;AAEA,OAAO,SAASC,4BAA4BA,CAC1CX,IAAa,EACkB;EAC/B,OACE,OAAOA,IAAI,KAAK,QAAQ,IACxBA,IAAI,KAAK,IAAI,IACb,MAAM,IAAIA,IAAI,IACbA,IAAI,CAA6BS,IAAI,KAAK,oBAAoB;AAEnE;AAEA,OAAO,SAASG,oBAAoBA,CAACZ,IAAa,EAAyB;EACzE,OACE,OAAOA,IAAI,KAAK,QAAQ,IACxBA,IAAI,KAAK,IAAI,IACb,MAAM,IAAIA,IAAI,IACbA,IAAI,CAA6BS,IAAI,KAAK,YAAY,IACvD,WAAW,IAAIT,IAAI,IACnB,OAAQA,IAAI,CAA6Ba,SAAS,KAAK,QAAQ,IAC/D,eAAe,IAAIb,IAAI,IACvBc,KAAK,CAACC,OAAO,CAAEf,IAAI,CAA6BgB,aAAa,CAAC;AAElE","ignoreList":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":[],"sources":["../../../../src/hooks/useConversationEvents/types.tsx"],"sourcesContent":["import React from 'react';\nimport { RemoteParticipant } from 'livekit-client';\n\nexport type UserSpeakStartPayload = {\n conversationId: string;\n};\n\nexport type TimeExceededPayload = {\n conversationId: string;\n limit: number;\n};\n\nexport type UserSpeakStopPayload = {\n conversationId: string;\n};\n\nexport type AgentSpeakStartPayload = {\n conversationId: string;\n};\n\nexport type AgentSpeakStopPayload = {\n conversationId: string;\n};\n\nexport type ResponseLatencyPayload = {\n conversationId: string;\n latencyMs: number;\n turnDetectionStrategy: string;\n sequence?: number;\n speechId?: string;\n};\n\nexport type InterruptPayload = {\n conversationId: string;\n};\n\nexport type CallStartedPayload = {\n conversationId: string;\n};\n\nexport type CallEndedPayload = {\n conversationId: string;\n};\n\nexport type UserSendMessagePayload = {\n conversationId: string;\n message: string;\n};\n\nexport type AgentJoinedPayload = {\n conversationId: string;\n participant: RemoteParticipant;\n};\n\nexport type AgentLeftPayload = {\n conversationId: string;\n participant?: RemoteParticipant;\n};\n\nexport type AgentVideoLoadedPayload = {\n videoRef: React.RefObject<HTMLVideoElement>;\n};\n\nexport type InactivityWarningPayload = {\n conversationId: string;\n gracePeriodSec: number;\n};\n\nexport type ConversationEventMap = {\n userSpeakStart: UserSpeakStartPayload;\n userSpeakStop: UserSpeakStopPayload;\n agentSpeakStart: AgentSpeakStartPayload;\n agentSpeakStop: AgentSpeakStopPayload;\n responseLatency: ResponseLatencyPayload;\n interrupt: InterruptPayload;\n callStarted: CallStartedPayload;\n callEnded: CallEndedPayload;\n userSendMessage: UserSendMessagePayload;\n agentJoined: AgentJoinedPayload;\n agentLeft: AgentLeftPayload;\n timeExceeded: TimeExceededPayload;\n agentVideoLoaded: AgentVideoLoadedPayload;\n inactivityWarning: InactivityWarningPayload;\n};\n\nexport type ConversationEvent = keyof ConversationEventMap;\n\nexport type EventPayload<T extends ConversationEvent> = ConversationEventMap[T];\n"],"mappings":"","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":[],"sources":["../../../../src/hooks/useConversationEvents/types.tsx"],"sourcesContent":["import React from 'react';\nimport { RemoteParticipant } from 'livekit-client';\n\nexport type UserSpeakStartPayload = {\n conversationId: string;\n};\n\nexport type TimeExceededPayload = {\n conversationId: string;\n limit: number;\n};\n\nexport type UserSpeakStopPayload = {\n conversationId: string;\n};\n\nexport type AgentSpeakStartPayload = {\n conversationId: string;\n};\n\nexport type AgentSpeakStopPayload = {\n conversationId: string;\n};\n\nexport type ResponseLatencyPayload = {\n conversationId: string;\n latencyMs: number;\n turnDetectionStrategy: string;\n sequence?: number;\n speechId?: string;\n};\n\nexport type InterruptPayload = {\n conversationId: string;\n};\n\nexport type CallStartedPayload = {\n conversationId: string;\n};\n\nexport type CallEndedPayload = {\n conversationId: string;\n};\n\nexport type UserSendMessagePayload = {\n conversationId: string;\n message: string;\n};\n\nexport type AgentJoinedPayload = {\n conversationId: string;\n participant: RemoteParticipant;\n};\n\nexport type AgentLeftPayload = {\n conversationId: string;\n participant?: RemoteParticipant;\n};\n\nexport type AgentVideoLoadedPayload = {\n videoRef: React.RefObject<HTMLVideoElement>;\n};\n\nexport type InactivityWarningPayload = {\n conversationId: string;\n gracePeriodSec: number;\n};\n\nexport type InactivityTimeoutPayload = {\n conversationId: string;\n};\n\nexport type ConversationEventMap = {\n userSpeakStart: UserSpeakStartPayload;\n userSpeakStop: UserSpeakStopPayload;\n agentSpeakStart: AgentSpeakStartPayload;\n agentSpeakStop: AgentSpeakStopPayload;\n responseLatency: ResponseLatencyPayload;\n interrupt: InterruptPayload;\n callStarted: CallStartedPayload;\n callEnded: CallEndedPayload;\n userSendMessage: UserSendMessagePayload;\n agentJoined: AgentJoinedPayload;\n agentLeft: AgentLeftPayload;\n timeExceeded: TimeExceededPayload;\n agentVideoLoaded: AgentVideoLoadedPayload;\n inactivityWarning: InactivityWarningPayload;\n inactivityTimeout: InactivityTimeoutPayload;\n};\n\nexport type ConversationEvent = keyof ConversationEventMap;\n\nexport type EventPayload<T extends ConversationEvent> = ConversationEventMap[T];\n"],"mappings":"","ignoreList":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["invariant","useEffect","useAtom","useSetAtom","useUnmount","state","useSdkConsumer","limit","useCreateConversation","options","type","chatConfig","config","_useSdkConsumer","chatId","namespace","personaChatService","setConversationStatus","conversationStatus","_useAtom","conversation","setConversation","create","then","catch","error","_err$message","err","status","message","includes","destroy","data","result","createInteractiveConversation","url","id","createVoiceConversation","Error","endInteractiveConversation","conversationId","undefined"],"sources":["../../../../src/hooks/useCreateConversation/useCreateConversation.ts"],"sourcesContent":["import invariant from 'invariant';\nimport { useEffect } from 'react';\nimport { useAtom, useSetAtom } from 'jotai';\nimport { useUnmount } from 'react-use';\n\nimport {\n state,\n type ConversationType,\n type Conversation,\n} from '../../conversation';\nimport { useSdkConsumer } from '../../sdk-consumer';\nimport { limit } from './helpers';\n\nexport type UseCreateConversationOptions = {\n type: ConversationType;\n config?:
|
|
1
|
+
{"version":3,"names":["invariant","useEffect","useAtom","useSetAtom","useUnmount","state","useSdkConsumer","limit","useCreateConversation","options","type","chatConfig","config","_useSdkConsumer","chatId","namespace","personaChatService","setConversationStatus","conversationStatus","_useAtom","conversation","setConversation","create","then","catch","error","_err$message","err","status","message","includes","destroy","data","result","createInteractiveConversation","url","id","createVoiceConversation","Error","endInteractiveConversation","conversationId","undefined"],"sources":["../../../../src/hooks/useCreateConversation/useCreateConversation.ts"],"sourcesContent":["import invariant from 'invariant';\nimport { useEffect } from 'react';\nimport { useAtom, useSetAtom } from 'jotai';\nimport { useUnmount } from 'react-use';\n\nimport {\n state,\n type ConversationType,\n type Conversation,\n} from '../../conversation';\nimport { useSdkConsumer } from '../../sdk-consumer';\nimport { limit } from './helpers';\n\nexport type UseCreateConversationOptions = {\n type: ConversationType;\n config?: object;\n};\n\nexport type UseCreateConversationResult = {\n data?: Conversation;\n destroy(): Promise<void>;\n};\n\nexport function useCreateConversation(\n options: UseCreateConversationOptions,\n): UseCreateConversationResult {\n const { type, config: chatConfig } = options;\n\n const { chatId, namespace, personaChatService } = useSdkConsumer();\n\n const setConversationStatus = useSetAtom(state.conversationStatus);\n const [conversation, setConversation] = useAtom(state.conversation);\n\n useEffect(() => {\n void create()\n .then(() => setConversationStatus('created'))\n .catch((error: unknown) => {\n const err = error as { status?: number; message?: string };\n if (err.status === 404 && err.message?.includes('not found')) {\n setConversationStatus('voice-not-found');\n } else {\n setConversationStatus('initialization-error');\n }\n });\n }, [type, chatId]);\n\n useUnmount(() => {\n if (!conversation) {\n return;\n }\n void destroy();\n });\n\n useEffect(() => {\n if (!conversation) {\n return;\n }\n if (conversation.limit === 0) {\n setConversationStatus('exceeded');\n }\n }, [conversation]);\n\n return { data: conversation, destroy };\n\n async function create() {\n invariant(\n personaChatService,\n 'personaChatService is required. Pass it as a prop to LegendsPlatform.',\n );\n\n switch (type) {\n case 'video': {\n const result = await personaChatService.createInteractiveConversation({\n chatId,\n namespace,\n chatConfig,\n });\n setConversation({\n type: 'video',\n url: result.url,\n id: result.id,\n limit: limit(result.limit),\n });\n break;\n }\n case 'audio': {\n const result = await personaChatService.createVoiceConversation({\n chatId,\n namespace,\n chatConfig,\n });\n setConversation({\n type: 'audio',\n url: result.url,\n id: result.id,\n limit: limit(result.limit),\n });\n break;\n }\n default:\n throw new Error(`Unsupported conversation type: ${type}`);\n }\n }\n\n async function destroy() {\n invariant(conversation, 'Conversation is not ready');\n invariant(personaChatService, 'personaChatService is required.');\n\n setConversationStatus('destroying');\n\n await personaChatService\n .endInteractiveConversation({\n chatId,\n conversationId: conversation.id,\n namespace,\n })\n .catch(() => {});\n\n setConversationStatus('destroyed');\n setConversation(undefined);\n }\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
|
|
2
|
+
export function append(message) {
|
|
3
|
+
return data => {
|
|
4
|
+
if (!data) {
|
|
5
|
+
return {
|
|
6
|
+
pages: [{
|
|
7
|
+
messages: [message]
|
|
8
|
+
}],
|
|
9
|
+
pageParams: [undefined]
|
|
10
|
+
};
|
|
11
|
+
}
|
|
12
|
+
const _data$pages = data.pages,
|
|
13
|
+
page = _data$pages[0],
|
|
14
|
+
rest = _arrayLikeToArray(_data$pages).slice(1);
|
|
15
|
+
return {
|
|
16
|
+
...data,
|
|
17
|
+
pages: [{
|
|
18
|
+
...page,
|
|
19
|
+
messages: [message, ...((page == null ? void 0 : page.messages) ?? [])]
|
|
20
|
+
}, ...rest]
|
|
21
|
+
};
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
export function appendMany(messages) {
|
|
25
|
+
return data => {
|
|
26
|
+
if (!data || !messages.length) {
|
|
27
|
+
return data ?? {
|
|
28
|
+
pages: [],
|
|
29
|
+
pageParams: []
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
return messages.reduceRight((acc, message) => append(message)(acc), data);
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=helpers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["append","message","data","pages","messages","pageParams","undefined","_data$pages","page","rest","_arrayLikeToArray","slice","appendMany","length","reduceRight","acc"],"sources":["../../../../src/hooks/useTextChat/helpers.ts"],"sourcesContent":["import type { InfiniteData } from '@tanstack/react-query';\nimport type { ChatMessage, QueryMessagesResult } from '../../types';\n\ntype MessagesCache = InfiniteData<QueryMessagesResult>;\n\nexport function append(message: ChatMessage) {\n return (data: MessagesCache | undefined): MessagesCache => {\n if (!data) {\n return { pages: [{ messages: [message] }], pageParams: [undefined] };\n }\n const [page, ...rest] = data.pages;\n return {\n ...data,\n pages: [\n { ...page, messages: [message, ...(page?.messages ?? [])] },\n ...rest,\n ],\n };\n };\n}\n\nexport function appendMany(messages: ChatMessage[]) {\n return (data: MessagesCache | undefined): MessagesCache => {\n if (!data || !messages.length) {\n return data ?? { pages: [], pageParams: [] };\n }\n return messages.reduceRight(\n (acc: MessagesCache, message) => append(message)(acc),\n data,\n );\n };\n}\n"],"mappings":";AAKA,OAAO,SAASA,MAAMA,CAACC,OAAoB,EAAE;EAC3C,OAAQC,IAA+B,IAAoB;IACzD,IAAI,CAACA,IAAI,EAAE;MACT,OAAO;QAAEC,KAAK,EAAE,CAAC;UAAEC,QAAQ,EAAE,CAACH,OAAO;QAAE,CAAC,CAAC;QAAEI,UAAU,EAAE,CAACC,SAAS;MAAE,CAAC;IACtE;IACA,MAAAC,WAAA,GAAwBL,IAAI,CAACC,KAAK;MAA3BK,IAAI,GAAAD,WAAA;MAAKE,IAAI,GAAAC,iBAAA,CAAAH,WAAA,EAAAI,KAAA;IACpB,OAAO;MACL,GAAGT,IAAI;MACPC,KAAK,EAAE,CACL;QAAE,GAAGK,IAAI;QAAEJ,QAAQ,EAAE,CAACH,OAAO,EAAE,IAAI,CAAAO,IAAI,oBAAJA,IAAI,CAAEJ,QAAQ,KAAI,EAAE,CAAC;MAAE,CAAC,EAC3D,GAAGK,IAAI;IAEX,CAAC;EACH,CAAC;AACH;AAEA,OAAO,SAASG,UAAUA,CAACR,QAAuB,EAAE;EAClD,OAAQF,IAA+B,IAAoB;IACzD,IAAI,CAACA,IAAI,IAAI,CAACE,QAAQ,CAACS,MAAM,EAAE;MAC7B,OAAOX,IAAI,IAAI;QAAEC,KAAK,EAAE,EAAE;QAAEE,UAAU,EAAE;MAAG,CAAC;IAC9C;IACA,OAAOD,QAAQ,CAACU,WAAW,CACzB,CAACC,GAAkB,EAAEd,OAAO,KAAKD,MAAM,CAACC,OAAO,CAAC,CAACc,GAAG,CAAC,EACrDb,IACF,CAAC;EACH,CAAC;AACH","ignoreList":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["useInfiniteQuery","useSdkConsumer","usePendingMessages","useToolAwareSend","useTextChat","options","_options","_options$limit","limit","_useSdkConsumer","chatId","namespace","personaChatService","send","pending","_useInfiniteQuery","queryKey","queryFn","_ref","pageParam","messages","nextCursor","undefined","queryChatMessages","cursor","getNextPageParam","lastPage","initialPageParam","select","data","pages","flatMap","page","_useInfiniteQuery$dat","status","fetchNextPage","refetch","fetchNext","sendMessage","message"],"sources":["../../../../src/hooks/useTextChat/useTextChat.ts"],"sourcesContent":["import { useInfiniteQuery } from '@tanstack/react-query';\nimport type { ChatMessage } from '../../types';\nimport { useSdkConsumer } from '../../sdk-consumer';\nimport { usePendingMessages } from './usePendingMessages';\nimport { useToolAwareSend } from './useToolAwareSend';\n\ninterface UseTextChatOptions {\n limit?: number;\n}\n\nexport function useTextChat(options: UseTextChatOptions = {}) {\n const { limit = 100 } = options;\n\n const { chatId, namespace, personaChatService } = useSdkConsumer();\n\n const send = useToolAwareSend(chatId, namespace);\n const pending = usePendingMessages();\n\n const {\n data: messages = [],\n status,\n fetchNextPage,\n refetch,\n } = useInfiniteQuery({\n queryKey: ['chat-messages', chatId, namespace],\n queryFn: async ({ pageParam }: { pageParam?: string }) => {\n if (!personaChatService) {\n return { messages: [], nextCursor: undefined };\n }\n return personaChatService.queryChatMessages({\n chatId,\n namespace,\n limit,\n cursor: pageParam,\n });\n },\n getNextPageParam: (lastPage) => lastPage.nextCursor,\n initialPageParam: undefined as string | undefined,\n select: (data) =>\n data.pages.flatMap((page) => page.messages as ChatMessage[]),\n });\n\n return {\n status,\n pending,\n messages,\n fetchNext,\n refetch,\n send: sendMessage,\n };\n\n function sendMessage(message: {
|
|
1
|
+
{"version":3,"names":["useInfiniteQuery","useSdkConsumer","usePendingMessages","useToolAwareSend","useTextChat","options","_options","_options$limit","limit","_useSdkConsumer","chatId","namespace","personaChatService","send","pending","_useInfiniteQuery","queryKey","queryFn","_ref","pageParam","messages","nextCursor","undefined","queryChatMessages","cursor","getNextPageParam","lastPage","initialPageParam","select","data","pages","flatMap","page","_useInfiniteQuery$dat","status","fetchNextPage","refetch","fetchNext","sendMessage","message"],"sources":["../../../../src/hooks/useTextChat/useTextChat.ts"],"sourcesContent":["import { useInfiniteQuery } from '@tanstack/react-query';\nimport type { ChatMessage, ChatMessageAttachment } from '../../types';\nimport { useSdkConsumer } from '../../sdk-consumer';\nimport { usePendingMessages } from './usePendingMessages';\nimport { useToolAwareSend } from './useToolAwareSend';\n\ninterface UseTextChatOptions {\n limit?: number;\n}\n\nexport function useTextChat(options: UseTextChatOptions = {}) {\n const { limit = 100 } = options;\n\n const { chatId, namespace, personaChatService } = useSdkConsumer();\n\n const send = useToolAwareSend(chatId, namespace);\n const pending = usePendingMessages();\n\n const {\n data: messages = [],\n status,\n fetchNextPage,\n refetch,\n } = useInfiniteQuery({\n queryKey: ['chat-messages', chatId, namespace],\n queryFn: async ({ pageParam }: { pageParam?: string }) => {\n if (!personaChatService) {\n return { messages: [], nextCursor: undefined };\n }\n return personaChatService.queryChatMessages({\n chatId,\n namespace,\n limit,\n cursor: pageParam,\n });\n },\n getNextPageParam: (lastPage) => lastPage.nextCursor,\n initialPageParam: undefined as string | undefined,\n select: (data) =>\n data.pages.flatMap((page) => page.messages as ChatMessage[]),\n });\n\n return {\n status,\n pending,\n messages,\n fetchNext,\n refetch,\n send: sendMessage,\n };\n\n function sendMessage(message: {\n message?: string;\n chatConfig?: object;\n attachments?: ChatMessageAttachment[];\n }) {\n return send(message);\n }\n\n function fetchNext() {\n void fetchNextPage();\n }\n}\n"],"mappings":"AAAA,SAASA,gBAAgB,QAAQ,uBAAuB;AAExD,SAASC,cAAc,QAAQ,oBAAoB;AACnD,SAASC,kBAAkB,QAAQ,sBAAsB;AACzD,SAASC,gBAAgB,QAAQ,oBAAoB;AAMrD,OAAO,SAASC,WAAWA,CAACC,OAA2B,EAAO;EAAA,IAAlCA,OAA2B;IAA3BA,OAA2B,GAAG,CAAC,CAAC;EAAA;EAC1D,MAAAC,QAAA,GAAwBD,OAAO;IAAAE,cAAA,GAAAD,QAAA,CAAvBE,KAAK;IAALA,KAAK,GAAAD,cAAA,cAAG,GAAG,GAAAA,cAAA;EAEnB,MAAAE,eAAA,GAAkDR,cAAc,CAAC,CAAC;IAA1DS,MAAM,GAAAD,eAAA,CAANC,MAAM;IAAEC,SAAS,GAAAF,eAAA,CAATE,SAAS;IAAEC,kBAAkB,GAAAH,eAAA,CAAlBG,kBAAkB;EAE7C,MAAMC,IAAI,GAAGV,gBAAgB,CAACO,MAAM,EAAEC,SAAS,CAAC;EAChD,MAAMG,OAAO,GAAGZ,kBAAkB,CAAC,CAAC;EAEpC,MAAAa,iBAAA,GAKIf,gBAAgB,CAAC;MACnBgB,QAAQ,EAAE,CAAC,eAAe,EAAEN,MAAM,EAAEC,SAAS,CAAC;MAC9CM,OAAO,EAAE,MAAAC,IAAA,IAAiD;QAAA,IAAxCC,SAAS,GAAAD,IAAA,CAATC,SAAS;QACzB,IAAI,CAACP,kBAAkB,EAAE;UACvB,OAAO;YAAEQ,QAAQ,EAAE,EAAE;YAAEC,UAAU,EAAEC;UAAU,CAAC;QAChD;QACA,OAAOV,kBAAkB,CAACW,iBAAiB,CAAC;UAC1Cb,MAAM;UACNC,SAAS;UACTH,KAAK;UACLgB,MAAM,EAAEL;QACV,CAAC,CAAC;MACJ,CAAC;MACDM,gBAAgB,EAAGC,QAAQ,IAAKA,QAAQ,CAACL,UAAU;MACnDM,gBAAgB,EAAEL,SAA+B;MACjDM,MAAM,EAAGC,IAAI,IACXA,IAAI,CAACC,KAAK,CAACC,OAAO,CAAEC,IAAI,IAAKA,IAAI,CAACZ,QAAyB;IAC/D,CAAC,CAAC;IAAAa,qBAAA,GAAAlB,iBAAA,CArBAc,IAAI;IAAET,QAAQ,GAAAa,qBAAA,cAAG,EAAE,GAAAA,qBAAA;IACnBC,MAAM,GAAAnB,iBAAA,CAANmB,MAAM;IACNC,aAAa,GAAApB,iBAAA,CAAboB,aAAa;IACbC,OAAO,GAAArB,iBAAA,CAAPqB,OAAO;EAoBT,OAAO;IACLF,MAAM;IACNpB,OAAO;IACPM,QAAQ;IACRiB,SAAS;IACTD,OAAO;IACPvB,IAAI,EAAEyB;EACR,CAAC;EAED,SAASA,WAAWA,CAACC,OAIpB,EAAE;IACD,OAAO1B,IAAI,CAAC0B,OAAO,CAAC;EACtB;EAEA,SAASF,SAASA,CAAA,EAAG;IACnB,KAAKF,aAAa,CAAC,CAAC;EACtB;AACF","ignoreList":[]}
|
|
@@ -1,23 +1,49 @@
|
|
|
1
|
+
import { useMutation, useQueryClient } from '@tanstack/react-query';
|
|
1
2
|
import { useSdkConsumer } from '../../sdk-consumer';
|
|
2
|
-
import { ToolExecutionInProgressError } from '../useTools
|
|
3
|
+
import { ToolExecutionInProgressError } from '../useTools';
|
|
3
4
|
import { useToolCallingRuntime } from '../useTools/runtime/useToolCallingRuntime';
|
|
5
|
+
import { append, appendMany } from './helpers';
|
|
4
6
|
export function useToolAwareSend(chatId, namespace) {
|
|
5
7
|
const _useSdkConsumer = useSdkConsumer(),
|
|
6
8
|
personaChatService = _useSdkConsumer.personaChatService;
|
|
7
9
|
const toolRuntime = useToolCallingRuntime();
|
|
10
|
+
const queryClient = useQueryClient();
|
|
11
|
+
const mutation = useMutation({
|
|
12
|
+
mutationKey: ['pending-chat-message'],
|
|
13
|
+
mutationFn: params => {
|
|
14
|
+
if (!personaChatService) {
|
|
15
|
+
throw new Error('personaChatService is required to send messages.');
|
|
16
|
+
}
|
|
17
|
+
return personaChatService.sendChatMessage(params);
|
|
18
|
+
},
|
|
19
|
+
onSuccess(data, variables) {
|
|
20
|
+
var _data$messages;
|
|
21
|
+
const queryKey = ['chat-messages', chatId, namespace];
|
|
22
|
+
if (variables.message) {
|
|
23
|
+
queryClient.setQueryData(queryKey, append({
|
|
24
|
+
id: Date.now().toString(),
|
|
25
|
+
content: variables.message,
|
|
26
|
+
role: 'user',
|
|
27
|
+
attachments: variables.attachments
|
|
28
|
+
}));
|
|
29
|
+
}
|
|
30
|
+
if ((_data$messages = data.messages) != null && _data$messages.length) {
|
|
31
|
+
queryClient.setQueryData(queryKey, appendMany(data.messages));
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
});
|
|
8
35
|
return async function send(message) {
|
|
9
36
|
if (toolRuntime.isRunning) {
|
|
10
37
|
throw new ToolExecutionInProgressError();
|
|
11
38
|
}
|
|
12
|
-
|
|
13
|
-
throw new Error('personaChatService is required to send messages.');
|
|
14
|
-
}
|
|
15
|
-
const initialResponse = await personaChatService.sendChatMessage({
|
|
39
|
+
const initialResponse = await mutation.mutateAsync({
|
|
16
40
|
chatId,
|
|
17
41
|
namespace,
|
|
18
|
-
message: message.message ?? ''
|
|
42
|
+
message: message.message ?? '',
|
|
43
|
+
chatConfig: message.chatConfig,
|
|
44
|
+
attachments: message.attachments
|
|
19
45
|
});
|
|
20
|
-
return toolRuntime.resolveResponseToolCalls(initialResponse, functionCallResults =>
|
|
46
|
+
return toolRuntime.resolveResponseToolCalls(initialResponse, functionCallResults => mutation.mutateAsync({
|
|
21
47
|
chatId,
|
|
22
48
|
namespace,
|
|
23
49
|
message: '',
|