@mirai/core 0.4.465 → 0.4.467
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/build/components/Chat/components/Aura/Aura.js +26 -5
- package/build/components/Chat/components/Aura/Aura.js.map +1 -1
- package/build/components/Chat/components/Aura/hooks/useOpenAiRealtimeSession.js +237 -0
- package/build/components/Chat/components/Aura/hooks/useOpenAiRealtimeSession.js.map +1 -0
- package/build/components/Chat/components/Welcome/Welcome.module.css +10 -0
- package/package.json +1 -1
|
@@ -14,6 +14,7 @@ var _Aura = require("./Aura.l10n");
|
|
|
14
14
|
var style = _interopRequireWildcard(require("./Aura.module.css"));
|
|
15
15
|
var _Aura2 = require("./Aura.waveform");
|
|
16
16
|
var _helpers = require("./helpers");
|
|
17
|
+
var _useOpenAiRealtimeSession = require("./hooks/useOpenAiRealtimeSession");
|
|
17
18
|
var _Core = require("../../../../Core.constants");
|
|
18
19
|
var _helpers2 = require("../../../helpers");
|
|
19
20
|
var _Chat = require("../../Chat.constants");
|
|
@@ -29,13 +30,21 @@ const Aura = _ref => {
|
|
|
29
30
|
onCallEnd = () => {}
|
|
30
31
|
} = _ref;
|
|
31
32
|
const conversation = (0, _react.useConversation)();
|
|
33
|
+
const {
|
|
34
|
+
startSession,
|
|
35
|
+
endSession,
|
|
36
|
+
audioAnalyzers
|
|
37
|
+
} = (0, _useOpenAiRealtimeSession.useOpenAiRealtimeSession)();
|
|
32
38
|
const {
|
|
33
39
|
value: {
|
|
34
40
|
assistant = {},
|
|
35
41
|
hotel = {},
|
|
42
|
+
id,
|
|
36
43
|
locale,
|
|
37
44
|
type,
|
|
38
|
-
|
|
45
|
+
urlParams: {
|
|
46
|
+
openai
|
|
47
|
+
} = {}
|
|
39
48
|
} = {}
|
|
40
49
|
} = (0, _dataSources.useStore)();
|
|
41
50
|
const {
|
|
@@ -57,7 +66,7 @@ const Aura = _ref => {
|
|
|
57
66
|
setContext({
|
|
58
67
|
hotelId: hotel.id
|
|
59
68
|
});
|
|
60
|
-
}, [hotel.id, type
|
|
69
|
+
}, [hotel.id, type]);
|
|
61
70
|
(0, _react2.useEffect)(() => {
|
|
62
71
|
handleCallStart();
|
|
63
72
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
@@ -74,6 +83,18 @@ const Aura = _ref => {
|
|
|
74
83
|
});
|
|
75
84
|
setIsConnecting(true);
|
|
76
85
|
try {
|
|
86
|
+
if (openai === 'true') {
|
|
87
|
+
await startSession({
|
|
88
|
+
assistant_name,
|
|
89
|
+
chainId,
|
|
90
|
+
hotelId: context.hotelId,
|
|
91
|
+
isChain,
|
|
92
|
+
locale,
|
|
93
|
+
setIsConnecting,
|
|
94
|
+
setReady
|
|
95
|
+
});
|
|
96
|
+
return;
|
|
97
|
+
}
|
|
77
98
|
await navigator.mediaDevices.getUserMedia({
|
|
78
99
|
audio: true
|
|
79
100
|
});
|
|
@@ -86,7 +107,7 @@ const Aura = _ref => {
|
|
|
86
107
|
}, chainId ? {
|
|
87
108
|
chain_id: chainId
|
|
88
109
|
} : {
|
|
89
|
-
hotelId: context.
|
|
110
|
+
hotelId: context.hotelId
|
|
90
111
|
}),
|
|
91
112
|
overrides: {
|
|
92
113
|
agent: {
|
|
@@ -109,13 +130,13 @@ const Aura = _ref => {
|
|
|
109
130
|
}
|
|
110
131
|
};
|
|
111
132
|
const handleCallEnd = () => {
|
|
112
|
-
conversation.endSession();
|
|
133
|
+
if (openai === 'true') endSession();else conversation.endSession();
|
|
113
134
|
setReady(false);
|
|
114
135
|
onCallEnd();
|
|
115
136
|
};
|
|
116
137
|
return !(!context && !(type === _Core.TYPE.CHAIN && !hotel.id)) ? /*#__PURE__*/_react2.default.createElement(_react2.default.Fragment, null, /*#__PURE__*/_react2.default.createElement(_Aura2.Waveform, {
|
|
117
138
|
active: ready,
|
|
118
|
-
conversation: conversation
|
|
139
|
+
conversation: openai === 'true' ? audioAnalyzers : conversation
|
|
119
140
|
}), /*#__PURE__*/_react2.default.createElement(_ui.View, {
|
|
120
141
|
className: style.footer
|
|
121
142
|
}, isConnecting && /*#__PURE__*/_react2.default.createElement(_ui.Text, {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Aura.js","names":["_react","require","_dataSources","_locale","_ui","_propTypes","_interopRequireDefault","_react2","_interopRequireWildcard","_Aura","style","_Aura2","_helpers","_Core","_helpers2","_Chat","e","t","WeakMap","r","n","__esModule","o","i","f","__proto__","default","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","ownKeys","keys","getOwnPropertySymbols","filter","enumerable","push","apply","_objectSpread","arguments","length","forEach","_defineProperty","getOwnPropertyDescriptors","defineProperties","_toPropertyKey","value","configurable","writable","_toPrimitive","Symbol","toPrimitive","TypeError","String","Number","Aura","_ref","onCallEnd","conversation","useConversation","assistant","hotel","locale","type","id","useStore","translate","useLocale","context","setContext","useState","isConnecting","setIsConnecting","ready","setReady","useEffect","callback","handleCallEnd","Event","subscribe","EVENT","SARAI_MESSAGE_SENT","unsubscribe","TYPE","CHAIN","hotelId","handleCallStart","navigator","mediaDevices","chainId","name","assistant_name","isChain","undefined","publish","METRICS","getUserMedia","audio","sessionConfig","clientTools","open_url","toolOpenUrl","dynamicVariables","chain_id","hotelid","overrides","agent","language","split","signedUrl","getSignedUrl","onConnect","onDisconnect","onError","startSession","error","endSession","createElement","Fragment","Waveform","active","View","className","footer","Text","action","L10N","LABEL_CALLING","DEFAULT_NAME","Button","busy","rounded","squared","large","tooltip","LABEL_HANG_UP","onPress","styles","button","Icon","ICON","HANG_UP","exports","displayName","propTypes","PropTypes","func"],"sources":["../../../../../src/components/Chat/components/Aura/Aura.jsx"],"sourcesContent":["import { useConversation } from '@elevenlabs/react';\nimport { Event, useStore } from '@mirai/data-sources';\nimport { useLocale } from '@mirai/locale';\nimport { Button, Icon, styles, Text, View } from '@mirai/ui';\nimport PropTypes from 'prop-types';\nimport React, { useEffect, useState } from 'react';\n\nimport { L10N } from './Aura.l10n';\nimport * as style from './Aura.module.css';\nimport { Waveform } from './Aura.waveform';\nimport { getSignedUrl, toolOpenUrl } from './helpers';\nimport { TYPE } from '../../../../Core.constants';\nimport { EVENT, ICON } from '../../../helpers';\nimport { DEFAULT_NAME } from '../../Chat.constants';\n\nconst Aura = ({ onCallEnd = () => {} }) => {\n const conversation = useConversation();\n const { value: { assistant = {}, hotel = {}, locale, type, id } = {} } = useStore();\n const { translate } = useLocale();\n\n const [context, setContext] = useState(null);\n const [isConnecting, setIsConnecting] = useState(false);\n const [ready, setReady] = useState(false);\n\n useEffect(() => {\n const callback = async () => {\n if (ready) handleCallEnd();\n };\n\n Event.subscribe(EVENT.SARAI_MESSAGE_SENT, callback);\n return () => Event.unsubscribe(EVENT.SARAI_MESSAGE_SENT, callback);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [conversation, ready]);\n\n useEffect(() => {\n if (type === TYPE.CHAIN && !hotel.id) return;\n\n setContext({ hotelId: hotel.id });\n }, [hotel.id, type, id]);\n\n useEffect(() => {\n handleCallStart();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [context]);\n\n const handleCallStart = async () => {\n if (!navigator.mediaDevices || !conversation || (!context && !chainId)) return;\n\n const { name: assistant_name = 'Sarai' } = assistant;\n const isChain = type === TYPE.CHAIN && !hotel.id;\n const chainId = isChain ? id : undefined;\n\n Event.publish(EVENT.METRICS, { id: 'AURA:START' });\n\n setIsConnecting(true);\n try {\n await navigator.mediaDevices.getUserMedia({ audio: true });\n\n const sessionConfig = {\n clientTools: { open_url: toolOpenUrl },\n dynamicVariables: { assistant_name, ...(chainId ? { chain_id: chainId } : { hotelId: context.hotelid }) },\n overrides: { agent: { language: locale.split('-')[0] } },\n signedUrl: await getSignedUrl(!!chainId),\n onConnect: () => {\n setIsConnecting(false);\n setReady(true);\n },\n onDisconnect: handleCallEnd,\n onError: () => {\n setIsConnecting(false);\n },\n };\n\n await conversation.startSession(sessionConfig);\n } catch (error) {\n setIsConnecting(false);\n }\n };\n\n const handleCallEnd = () => {\n conversation.endSession();\n setReady(false);\n onCallEnd();\n };\n\n return !(!context && !(type === TYPE.CHAIN && !hotel.id)) ? (\n <>\n <Waveform active={ready} conversation={conversation} />\n <View className={style.footer}>\n {isConnecting && <Text action>{translate(L10N.LABEL_CALLING, { name: assistant.name || DEFAULT_NAME })}</Text>}\n <Button\n busy={isConnecting}\n rounded\n squared\n large\n tooltip={translate(L10N.LABEL_HANG_UP)}\n onPress={handleCallEnd}\n className={styles(style.button, ready && style.ready)}\n >\n <Icon value={ICON.HANG_UP} />\n </Button>\n </View>\n </>\n ) : null;\n};\n\nAura.displayName = 'Mirai:Core:Chat.Aura';\n\nAura.propTypes = {\n onCallEnd: PropTypes.func,\n};\n\nexport { Aura };\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"Aura.js","names":["_react","require","_dataSources","_locale","_ui","_propTypes","_interopRequireDefault","_react2","_interopRequireWildcard","_Aura","style","_Aura2","_helpers","_useOpenAiRealtimeSession","_Core","_helpers2","_Chat","e","t","WeakMap","r","n","__esModule","o","i","f","__proto__","default","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","ownKeys","keys","getOwnPropertySymbols","filter","enumerable","push","apply","_objectSpread","arguments","length","forEach","_defineProperty","getOwnPropertyDescriptors","defineProperties","_toPropertyKey","value","configurable","writable","_toPrimitive","Symbol","toPrimitive","TypeError","String","Number","Aura","_ref","onCallEnd","conversation","useConversation","startSession","endSession","audioAnalyzers","useOpenAiRealtimeSession","assistant","hotel","id","locale","type","urlParams","openai","useStore","translate","useLocale","context","setContext","useState","isConnecting","setIsConnecting","ready","setReady","useEffect","callback","handleCallEnd","Event","subscribe","EVENT","SARAI_MESSAGE_SENT","unsubscribe","TYPE","CHAIN","hotelId","handleCallStart","navigator","mediaDevices","chainId","name","assistant_name","isChain","undefined","publish","METRICS","getUserMedia","audio","sessionConfig","clientTools","open_url","toolOpenUrl","dynamicVariables","chain_id","overrides","agent","language","split","signedUrl","getSignedUrl","onConnect","onDisconnect","onError","error","createElement","Fragment","Waveform","active","View","className","footer","Text","action","L10N","LABEL_CALLING","DEFAULT_NAME","Button","busy","rounded","squared","large","tooltip","LABEL_HANG_UP","onPress","styles","button","Icon","ICON","HANG_UP","exports","displayName","propTypes","PropTypes","func"],"sources":["../../../../../src/components/Chat/components/Aura/Aura.jsx"],"sourcesContent":["import { useConversation } from '@elevenlabs/react';\nimport { Event, useStore } from '@mirai/data-sources';\nimport { useLocale } from '@mirai/locale';\nimport { Button, Icon, styles, Text, View } from '@mirai/ui';\nimport PropTypes from 'prop-types';\nimport React, { useEffect, useState } from 'react';\n\nimport { L10N } from './Aura.l10n';\nimport * as style from './Aura.module.css';\nimport { Waveform } from './Aura.waveform';\nimport { getSignedUrl, toolOpenUrl } from './helpers';\nimport { useOpenAiRealtimeSession } from './hooks/useOpenAiRealtimeSession';\nimport { TYPE } from '../../../../Core.constants';\nimport { EVENT, ICON } from '../../../helpers';\nimport { DEFAULT_NAME } from '../../Chat.constants';\n\nconst Aura = ({ onCallEnd = () => {} }) => {\n const conversation = useConversation();\n const { startSession, endSession, audioAnalyzers } = useOpenAiRealtimeSession();\n const { value: { assistant = {}, hotel = {}, id, locale, type, urlParams: { openai } = {} } = {} } = useStore();\n const { translate } = useLocale();\n\n const [context, setContext] = useState(null);\n const [isConnecting, setIsConnecting] = useState(false);\n const [ready, setReady] = useState(false);\n\n useEffect(() => {\n const callback = async () => {\n if (ready) handleCallEnd();\n };\n\n Event.subscribe(EVENT.SARAI_MESSAGE_SENT, callback);\n return () => Event.unsubscribe(EVENT.SARAI_MESSAGE_SENT, callback);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [conversation, ready]);\n\n useEffect(() => {\n if (type === TYPE.CHAIN && !hotel.id) return;\n\n setContext({ hotelId: hotel.id });\n }, [hotel.id, type]);\n\n useEffect(() => {\n handleCallStart();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [context]);\n\n const handleCallStart = async () => {\n if (!navigator.mediaDevices || !conversation || (!context && !chainId)) return;\n\n const { name: assistant_name = 'Sarai' } = assistant;\n const isChain = type === TYPE.CHAIN && !hotel.id;\n const chainId = isChain ? id : undefined;\n\n Event.publish(EVENT.METRICS, { id: 'AURA:START' });\n\n setIsConnecting(true);\n try {\n if (openai === 'true') {\n await startSession({\n assistant_name,\n chainId,\n hotelId: context.hotelId,\n isChain,\n locale,\n setIsConnecting,\n setReady,\n });\n return;\n }\n\n await navigator.mediaDevices.getUserMedia({ audio: true });\n\n const sessionConfig = {\n clientTools: { open_url: toolOpenUrl },\n dynamicVariables: { assistant_name, ...(chainId ? { chain_id: chainId } : { hotelId: context.hotelId }) },\n overrides: { agent: { language: locale.split('-')[0] } },\n signedUrl: await getSignedUrl(!!chainId),\n onConnect: () => {\n setIsConnecting(false);\n setReady(true);\n },\n onDisconnect: handleCallEnd,\n onError: () => {\n setIsConnecting(false);\n },\n };\n\n await conversation.startSession(sessionConfig);\n } catch (error) {\n setIsConnecting(false);\n }\n };\n\n const handleCallEnd = () => {\n if (openai === 'true') endSession();\n else conversation.endSession();\n setReady(false);\n onCallEnd();\n };\n\n return !(!context && !(type === TYPE.CHAIN && !hotel.id)) ? (\n <>\n <Waveform active={ready} conversation={openai === 'true' ? audioAnalyzers : conversation} />\n <View className={style.footer}>\n {isConnecting && <Text action>{translate(L10N.LABEL_CALLING, { name: assistant.name || DEFAULT_NAME })}</Text>}\n <Button\n busy={isConnecting}\n rounded\n squared\n large\n tooltip={translate(L10N.LABEL_HANG_UP)}\n onPress={handleCallEnd}\n className={styles(style.button, ready && style.ready)}\n >\n <Icon value={ICON.HANG_UP} />\n </Button>\n </View>\n </>\n ) : null;\n};\n\nAura.displayName = 'Mirai:Core:Chat.Aura';\n\nAura.propTypes = {\n onCallEnd: PropTypes.func,\n};\n\nexport { Aura };\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,237 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.useOpenAiRealtimeSession = void 0;
|
|
7
|
+
var _dataSources = require("@mirai/data-sources");
|
|
8
|
+
var _react = require("react");
|
|
9
|
+
var _helpers = require("../../../../helpers");
|
|
10
|
+
const useOpenAiRealtimeSession = () => {
|
|
11
|
+
const audioElementRef = (0, _react.useRef)(null);
|
|
12
|
+
const audioContextRef = (0, _react.useRef)(null);
|
|
13
|
+
const peerConnectionRef = (0, _react.useRef)(null);
|
|
14
|
+
const dataChannelRef = (0, _react.useRef)(null);
|
|
15
|
+
const localStreamRef = (0, _react.useRef)(null);
|
|
16
|
+
const pendingUserTranscriptRef = (0, _react.useRef)('');
|
|
17
|
+
const inputSourceRef = (0, _react.useRef)(null);
|
|
18
|
+
const outputSourceRef = (0, _react.useRef)(null);
|
|
19
|
+
const inputFrequencyDataRef = (0, _react.useRef)(null);
|
|
20
|
+
const outputFrequencyDataRef = (0, _react.useRef)(null);
|
|
21
|
+
const audioAnalyzersRef = (0, _react.useRef)({
|
|
22
|
+
inputAnalyser: null,
|
|
23
|
+
outputAnalyser: null,
|
|
24
|
+
getInputByteFrequencyData: () => null,
|
|
25
|
+
getOutputByteFrequencyData: () => null
|
|
26
|
+
});
|
|
27
|
+
const cleanupRealtimeSession = (0, _react.useCallback)(function () {
|
|
28
|
+
let shouldSignal = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
|
|
29
|
+
const dataChannel = dataChannelRef.current;
|
|
30
|
+
if (dataChannel) {
|
|
31
|
+
if (shouldSignal && dataChannel.readyState === 'open') {
|
|
32
|
+
dataChannel.send(JSON.stringify({
|
|
33
|
+
type: 'session.close'
|
|
34
|
+
}));
|
|
35
|
+
}
|
|
36
|
+
dataChannel.close();
|
|
37
|
+
dataChannelRef.current = null;
|
|
38
|
+
}
|
|
39
|
+
const peerConnection = peerConnectionRef.current;
|
|
40
|
+
if (peerConnection) {
|
|
41
|
+
peerConnection.getSenders().forEach(sender => {
|
|
42
|
+
if (sender.track) sender.track.stop();
|
|
43
|
+
});
|
|
44
|
+
peerConnection.close();
|
|
45
|
+
peerConnectionRef.current = null;
|
|
46
|
+
}
|
|
47
|
+
const localStream = localStreamRef.current;
|
|
48
|
+
if (localStream) {
|
|
49
|
+
localStream.getTracks().forEach(track => track.stop());
|
|
50
|
+
localStreamRef.current = null;
|
|
51
|
+
}
|
|
52
|
+
if (audioElementRef.current) {
|
|
53
|
+
audioElementRef.current.srcObject = null;
|
|
54
|
+
audioElementRef.current = null;
|
|
55
|
+
}
|
|
56
|
+
if (inputSourceRef.current) {
|
|
57
|
+
inputSourceRef.current.disconnect();
|
|
58
|
+
inputSourceRef.current = null;
|
|
59
|
+
}
|
|
60
|
+
if (outputSourceRef.current) {
|
|
61
|
+
outputSourceRef.current.disconnect();
|
|
62
|
+
outputSourceRef.current = null;
|
|
63
|
+
}
|
|
64
|
+
audioAnalyzersRef.current.inputAnalyser = null;
|
|
65
|
+
audioAnalyzersRef.current.outputAnalyser = null;
|
|
66
|
+
audioAnalyzersRef.current.getInputByteFrequencyData = () => null;
|
|
67
|
+
audioAnalyzersRef.current.getOutputByteFrequencyData = () => null;
|
|
68
|
+
inputFrequencyDataRef.current = null;
|
|
69
|
+
outputFrequencyDataRef.current = null;
|
|
70
|
+
const audioContext = audioContextRef.current;
|
|
71
|
+
if (audioContext) {
|
|
72
|
+
audioContext.close();
|
|
73
|
+
audioContextRef.current = null;
|
|
74
|
+
}
|
|
75
|
+
pendingUserTranscriptRef.current = '';
|
|
76
|
+
}, []);
|
|
77
|
+
const startSession = (0, _react.useCallback)(async _ref => {
|
|
78
|
+
let {
|
|
79
|
+
assistant_name,
|
|
80
|
+
chainId,
|
|
81
|
+
hotelId,
|
|
82
|
+
isChain,
|
|
83
|
+
locale,
|
|
84
|
+
setIsConnecting,
|
|
85
|
+
setReady
|
|
86
|
+
} = _ref;
|
|
87
|
+
cleanupRealtimeSession();
|
|
88
|
+
const fingerprint = localStorage.getItem('MIRAI:FINGERPRINT');
|
|
89
|
+
try {
|
|
90
|
+
const sessionResponse = await (0, _dataSources.request)({
|
|
91
|
+
endpoint: "/audio/session?fingerprint=".concat(fingerprint, "&hotelId=").concat(isChain ? '' : hotelId !== null && hotelId !== void 0 ? hotelId : '', "&chainId=").concat(isChain ? chainId !== null && chainId !== void 0 ? chainId : '' : ''),
|
|
92
|
+
hostname: process.env.SERVICE_SYNAPSE,
|
|
93
|
+
method: 'GET'
|
|
94
|
+
});
|
|
95
|
+
const ephemeralKey = sessionResponse.value;
|
|
96
|
+
const peerConnection = new RTCPeerConnection();
|
|
97
|
+
peerConnectionRef.current = peerConnection;
|
|
98
|
+
audioElementRef.current = document.createElement('audio');
|
|
99
|
+
audioElementRef.current.autoplay = true;
|
|
100
|
+
peerConnection.ontrack = event => {
|
|
101
|
+
// eslint-disable-next-line prefer-destructuring
|
|
102
|
+
audioElementRef.current.srcObject = event.streams[0];
|
|
103
|
+
const [remoteStream] = event.streams;
|
|
104
|
+
if (!audioContextRef.current || !audioAnalyzersRef.current.outputAnalyser || !remoteStream) return;
|
|
105
|
+
if (outputSourceRef.current) outputSourceRef.current.disconnect();
|
|
106
|
+
outputSourceRef.current = audioContextRef.current.createMediaStreamSource(remoteStream);
|
|
107
|
+
outputSourceRef.current.connect(audioAnalyzersRef.current.outputAnalyser);
|
|
108
|
+
};
|
|
109
|
+
const mediaStream = await navigator.mediaDevices.getUserMedia({
|
|
110
|
+
audio: {
|
|
111
|
+
echoCancellation: true,
|
|
112
|
+
noiseSuppression: true,
|
|
113
|
+
autoGainControl: true,
|
|
114
|
+
channelCount: 1,
|
|
115
|
+
sampleRate: 48000
|
|
116
|
+
}
|
|
117
|
+
});
|
|
118
|
+
localStreamRef.current = mediaStream;
|
|
119
|
+
const [track] = mediaStream.getAudioTracks();
|
|
120
|
+
const AudioContextConstructor = globalThis.AudioContext || globalThis.webkitAudioContext;
|
|
121
|
+
if (!AudioContextConstructor) throw new Error('AudioContext not supported');
|
|
122
|
+
const audioContext = new AudioContextConstructor();
|
|
123
|
+
audioContextRef.current = audioContext;
|
|
124
|
+
if (audioContext.state === 'suspended') await audioContext.resume();
|
|
125
|
+
const inputAnalyser = audioContext.createAnalyser();
|
|
126
|
+
const outputAnalyser = audioContext.createAnalyser();
|
|
127
|
+
inputAnalyser.fftSize = 1024;
|
|
128
|
+
outputAnalyser.fftSize = 1024;
|
|
129
|
+
audioAnalyzersRef.current.inputAnalyser = inputAnalyser;
|
|
130
|
+
audioAnalyzersRef.current.outputAnalyser = outputAnalyser;
|
|
131
|
+
inputFrequencyDataRef.current = new Uint8Array(inputAnalyser.frequencyBinCount);
|
|
132
|
+
outputFrequencyDataRef.current = new Uint8Array(outputAnalyser.frequencyBinCount);
|
|
133
|
+
audioAnalyzersRef.current.getInputByteFrequencyData = () => {
|
|
134
|
+
if (!audioAnalyzersRef.current.inputAnalyser || !inputFrequencyDataRef.current) return null;
|
|
135
|
+
audioAnalyzersRef.current.inputAnalyser.getByteFrequencyData(inputFrequencyDataRef.current);
|
|
136
|
+
return inputFrequencyDataRef.current;
|
|
137
|
+
};
|
|
138
|
+
audioAnalyzersRef.current.getOutputByteFrequencyData = () => {
|
|
139
|
+
if (!audioAnalyzersRef.current.outputAnalyser || !outputFrequencyDataRef.current) return null;
|
|
140
|
+
audioAnalyzersRef.current.outputAnalyser.getByteFrequencyData(outputFrequencyDataRef.current);
|
|
141
|
+
return outputFrequencyDataRef.current;
|
|
142
|
+
};
|
|
143
|
+
const inputSource = audioContext.createMediaStreamSource(mediaStream);
|
|
144
|
+
inputSourceRef.current = inputSource;
|
|
145
|
+
inputSource.connect(inputAnalyser);
|
|
146
|
+
if (track) {
|
|
147
|
+
await track.applyConstraints({
|
|
148
|
+
echoCancellation: true,
|
|
149
|
+
noiseSuppression: true,
|
|
150
|
+
autoGainControl: true
|
|
151
|
+
});
|
|
152
|
+
peerConnection.addTrack(track, mediaStream);
|
|
153
|
+
}
|
|
154
|
+
const dataChannel = peerConnection.createDataChannel('oai-events');
|
|
155
|
+
dataChannelRef.current = dataChannel;
|
|
156
|
+
dataChannel.addEventListener('open', () => {
|
|
157
|
+
pendingUserTranscriptRef.current = '';
|
|
158
|
+
const localeHint = locale || 'en-US';
|
|
159
|
+
const introductionMessage = "Respond in the language that matches the locale code \"".concat(localeHint, "\". Introduce yourself using the following sentence, translated into that language: \"Hello, I am ").concat(assistant_name, ", your virtual assistant. I can help you with information about our services and facilities. What would you like to know today?\"");
|
|
160
|
+
dataChannel.send(JSON.stringify({
|
|
161
|
+
type: 'response.create',
|
|
162
|
+
response: {
|
|
163
|
+
instructions: introductionMessage
|
|
164
|
+
}
|
|
165
|
+
}));
|
|
166
|
+
});
|
|
167
|
+
dataChannel.addEventListener('message', event => {
|
|
168
|
+
var _payload$item;
|
|
169
|
+
const payload = JSON.parse(event.data);
|
|
170
|
+
if (payload.type === 'response.output_item.done' && ((_payload$item = payload.item) === null || _payload$item === void 0 ? void 0 : _payload$item.type) === 'mcp_call') {
|
|
171
|
+
dataChannel.send(JSON.stringify({
|
|
172
|
+
type: 'response.create',
|
|
173
|
+
response: {
|
|
174
|
+
instructions: 'Response to the user'
|
|
175
|
+
}
|
|
176
|
+
}));
|
|
177
|
+
}
|
|
178
|
+
if (payload.type === 'response.function_call_arguments.done' && payload.name === 'open_url') {
|
|
179
|
+
const {
|
|
180
|
+
url
|
|
181
|
+
} = JSON.parse(payload.arguments);
|
|
182
|
+
window.location.href = url;
|
|
183
|
+
}
|
|
184
|
+
if (payload.type === 'conversation.item.input_audio_transcription.completed') {
|
|
185
|
+
var _payload$transcript;
|
|
186
|
+
const transcript = (_payload$transcript = payload.transcript) === null || _payload$transcript === void 0 ? void 0 : _payload$transcript.trim();
|
|
187
|
+
if (transcript) pendingUserTranscriptRef.current += transcript;
|
|
188
|
+
}
|
|
189
|
+
if (payload.type === 'response.output_audio_transcript.done') {
|
|
190
|
+
var _payload$transcript2;
|
|
191
|
+
const transcript = (_payload$transcript2 = payload.transcript) === null || _payload$transcript2 === void 0 ? void 0 : _payload$transcript2.trim();
|
|
192
|
+
if (!transcript || !pendingUserTranscriptRef.current) return;
|
|
193
|
+
const input = pendingUserTranscriptRef.current.trim();
|
|
194
|
+
pendingUserTranscriptRef.current = '';
|
|
195
|
+
const activeLocale = locale || 'en-US';
|
|
196
|
+
_dataSources.Event.publish(_helpers.EVENT.METRICS, {
|
|
197
|
+
id: 'SYNAPSE_RESPONSE',
|
|
198
|
+
fingerprint,
|
|
199
|
+
text: transcript,
|
|
200
|
+
input,
|
|
201
|
+
agent: 'aura',
|
|
202
|
+
locale: activeLocale
|
|
203
|
+
});
|
|
204
|
+
}
|
|
205
|
+
});
|
|
206
|
+
const offer = await peerConnection.createOffer();
|
|
207
|
+
await peerConnection.setLocalDescription(offer);
|
|
208
|
+
const sdpResponse = await fetch('https://api.openai.com/v1/realtime/calls', {
|
|
209
|
+
method: 'POST',
|
|
210
|
+
body: offer.sdp,
|
|
211
|
+
headers: {
|
|
212
|
+
Authorization: "Bearer ".concat(ephemeralKey),
|
|
213
|
+
'Content-Type': 'application/sdp'
|
|
214
|
+
}
|
|
215
|
+
});
|
|
216
|
+
if (!sdpResponse.ok) throw new Error('Failed to establish OpenAI Realtime session');
|
|
217
|
+
const answer = {
|
|
218
|
+
type: 'answer',
|
|
219
|
+
sdp: await sdpResponse.text()
|
|
220
|
+
};
|
|
221
|
+
await peerConnection.setRemoteDescription(answer);
|
|
222
|
+
} finally {
|
|
223
|
+
setIsConnecting(false);
|
|
224
|
+
setReady(true);
|
|
225
|
+
}
|
|
226
|
+
}, [cleanupRealtimeSession]);
|
|
227
|
+
const endSession = (0, _react.useCallback)(() => {
|
|
228
|
+
cleanupRealtimeSession(true);
|
|
229
|
+
}, [cleanupRealtimeSession]);
|
|
230
|
+
return {
|
|
231
|
+
startSession,
|
|
232
|
+
endSession,
|
|
233
|
+
audioAnalyzers: audioAnalyzersRef.current
|
|
234
|
+
};
|
|
235
|
+
};
|
|
236
|
+
exports.useOpenAiRealtimeSession = useOpenAiRealtimeSession;
|
|
237
|
+
//# sourceMappingURL=useOpenAiRealtimeSession.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useOpenAiRealtimeSession.js","names":["_dataSources","require","_react","_helpers","useOpenAiRealtimeSession","audioElementRef","useRef","audioContextRef","peerConnectionRef","dataChannelRef","localStreamRef","pendingUserTranscriptRef","inputSourceRef","outputSourceRef","inputFrequencyDataRef","outputFrequencyDataRef","audioAnalyzersRef","inputAnalyser","outputAnalyser","getInputByteFrequencyData","getOutputByteFrequencyData","cleanupRealtimeSession","useCallback","shouldSignal","arguments","length","undefined","dataChannel","current","readyState","send","JSON","stringify","type","close","peerConnection","getSenders","forEach","sender","track","stop","localStream","getTracks","srcObject","disconnect","audioContext","startSession","_ref","assistant_name","chainId","hotelId","isChain","locale","setIsConnecting","setReady","fingerprint","localStorage","getItem","sessionResponse","request","endpoint","concat","hostname","process","env","SERVICE_SYNAPSE","method","ephemeralKey","value","RTCPeerConnection","document","createElement","autoplay","ontrack","event","streams","remoteStream","createMediaStreamSource","connect","mediaStream","navigator","mediaDevices","getUserMedia","audio","echoCancellation","noiseSuppression","autoGainControl","channelCount","sampleRate","getAudioTracks","AudioContextConstructor","globalThis","AudioContext","webkitAudioContext","Error","state","resume","createAnalyser","fftSize","Uint8Array","frequencyBinCount","getByteFrequencyData","inputSource","applyConstraints","addTrack","createDataChannel","addEventListener","localeHint","introductionMessage","response","instructions","_payload$item","payload","parse","data","item","name","url","window","location","href","_payload$transcript","transcript","trim","_payload$transcript2","input","activeLocale","Event","publish","EVENT","METRICS","id","text","agent","offer","createOffer","setLocalDescription","sdpResponse","fetch","body","sdp","headers","Authorization","ok","answer","setRemoteDescription","endSession","audioAnalyzers","exports"],"sources":["../../../../../../src/components/Chat/components/Aura/hooks/useOpenAiRealtimeSession.js"],"sourcesContent":["import { Event, request } from '@mirai/data-sources';\nimport { useCallback, useRef } from 'react';\n\nimport { EVENT } from '../../../../helpers';\n\nconst useOpenAiRealtimeSession = () => {\n const audioElementRef = useRef(null);\n const audioContextRef = useRef(null);\n const peerConnectionRef = useRef(null);\n const dataChannelRef = useRef(null);\n const localStreamRef = useRef(null);\n const pendingUserTranscriptRef = useRef('');\n const inputSourceRef = useRef(null);\n const outputSourceRef = useRef(null);\n const inputFrequencyDataRef = useRef(null);\n const outputFrequencyDataRef = useRef(null);\n const audioAnalyzersRef = useRef({\n inputAnalyser: null,\n outputAnalyser: null,\n getInputByteFrequencyData: () => null,\n getOutputByteFrequencyData: () => null,\n });\n\n const cleanupRealtimeSession = useCallback((shouldSignal = false) => {\n const dataChannel = dataChannelRef.current;\n if (dataChannel) {\n if (shouldSignal && dataChannel.readyState === 'open') {\n dataChannel.send(JSON.stringify({ type: 'session.close' }));\n }\n dataChannel.close();\n dataChannelRef.current = null;\n }\n\n const peerConnection = peerConnectionRef.current;\n if (peerConnection) {\n peerConnection.getSenders().forEach((sender) => {\n if (sender.track) sender.track.stop();\n });\n peerConnection.close();\n peerConnectionRef.current = null;\n }\n\n const localStream = localStreamRef.current;\n if (localStream) {\n localStream.getTracks().forEach((track) => track.stop());\n localStreamRef.current = null;\n }\n\n if (audioElementRef.current) {\n audioElementRef.current.srcObject = null;\n audioElementRef.current = null;\n }\n\n if (inputSourceRef.current) {\n inputSourceRef.current.disconnect();\n inputSourceRef.current = null;\n }\n\n if (outputSourceRef.current) {\n outputSourceRef.current.disconnect();\n outputSourceRef.current = null;\n }\n\n audioAnalyzersRef.current.inputAnalyser = null;\n audioAnalyzersRef.current.outputAnalyser = null;\n audioAnalyzersRef.current.getInputByteFrequencyData = () => null;\n audioAnalyzersRef.current.getOutputByteFrequencyData = () => null;\n inputFrequencyDataRef.current = null;\n outputFrequencyDataRef.current = null;\n\n const audioContext = audioContextRef.current;\n if (audioContext) {\n audioContext.close();\n audioContextRef.current = null;\n }\n\n pendingUserTranscriptRef.current = '';\n }, []);\n\n const startSession = useCallback(\n async ({ assistant_name, chainId, hotelId, isChain, locale, setIsConnecting, setReady }) => {\n cleanupRealtimeSession();\n\n const fingerprint = localStorage.getItem('MIRAI:FINGERPRINT');\n\n try {\n const sessionResponse = await request({\n endpoint: `/audio/session?fingerprint=${fingerprint}&hotelId=${isChain ? '' : hotelId ?? ''}&chainId=${\n isChain ? chainId ?? '' : ''\n }`,\n hostname: process.env.SERVICE_SYNAPSE,\n method: 'GET',\n });\n\n const ephemeralKey = sessionResponse.value;\n const peerConnection = new RTCPeerConnection();\n peerConnectionRef.current = peerConnection;\n\n audioElementRef.current = document.createElement('audio');\n audioElementRef.current.autoplay = true;\n peerConnection.ontrack = (event) => {\n // eslint-disable-next-line prefer-destructuring\n audioElementRef.current.srcObject = event.streams[0];\n const [remoteStream] = event.streams;\n if (!audioContextRef.current || !audioAnalyzersRef.current.outputAnalyser || !remoteStream) return;\n if (outputSourceRef.current) outputSourceRef.current.disconnect();\n outputSourceRef.current = audioContextRef.current.createMediaStreamSource(remoteStream);\n outputSourceRef.current.connect(audioAnalyzersRef.current.outputAnalyser);\n };\n\n const mediaStream = await navigator.mediaDevices.getUserMedia({\n audio: {\n echoCancellation: true,\n noiseSuppression: true,\n autoGainControl: true,\n channelCount: 1,\n sampleRate: 48000,\n },\n });\n\n localStreamRef.current = mediaStream;\n const [track] = mediaStream.getAudioTracks();\n\n const AudioContextConstructor = globalThis.AudioContext || globalThis.webkitAudioContext;\n if (!AudioContextConstructor) throw new Error('AudioContext not supported');\n const audioContext = new AudioContextConstructor();\n audioContextRef.current = audioContext;\n if (audioContext.state === 'suspended') await audioContext.resume();\n const inputAnalyser = audioContext.createAnalyser();\n const outputAnalyser = audioContext.createAnalyser();\n inputAnalyser.fftSize = 1024;\n outputAnalyser.fftSize = 1024;\n audioAnalyzersRef.current.inputAnalyser = inputAnalyser;\n audioAnalyzersRef.current.outputAnalyser = outputAnalyser;\n inputFrequencyDataRef.current = new Uint8Array(inputAnalyser.frequencyBinCount);\n outputFrequencyDataRef.current = new Uint8Array(outputAnalyser.frequencyBinCount);\n audioAnalyzersRef.current.getInputByteFrequencyData = () => {\n if (!audioAnalyzersRef.current.inputAnalyser || !inputFrequencyDataRef.current) return null;\n audioAnalyzersRef.current.inputAnalyser.getByteFrequencyData(inputFrequencyDataRef.current);\n return inputFrequencyDataRef.current;\n };\n audioAnalyzersRef.current.getOutputByteFrequencyData = () => {\n if (!audioAnalyzersRef.current.outputAnalyser || !outputFrequencyDataRef.current) return null;\n audioAnalyzersRef.current.outputAnalyser.getByteFrequencyData(outputFrequencyDataRef.current);\n return outputFrequencyDataRef.current;\n };\n\n const inputSource = audioContext.createMediaStreamSource(mediaStream);\n inputSourceRef.current = inputSource;\n inputSource.connect(inputAnalyser);\n\n if (track) {\n await track.applyConstraints({\n echoCancellation: true,\n noiseSuppression: true,\n autoGainControl: true,\n });\n peerConnection.addTrack(track, mediaStream);\n }\n\n const dataChannel = peerConnection.createDataChannel('oai-events');\n dataChannelRef.current = dataChannel;\n\n dataChannel.addEventListener('open', () => {\n pendingUserTranscriptRef.current = '';\n\n const localeHint = locale || 'en-US';\n const introductionMessage = `Respond in the language that matches the locale code \"${localeHint}\". Introduce yourself using the following sentence, translated into that language: \"Hello, I am ${assistant_name}, your virtual assistant. I can help you with information about our services and facilities. What would you like to know today?\"`;\n\n dataChannel.send(\n JSON.stringify({\n type: 'response.create',\n response: {\n instructions: introductionMessage,\n },\n }),\n );\n });\n\n dataChannel.addEventListener('message', (event) => {\n const payload = JSON.parse(event.data);\n\n if (payload.type === 'response.output_item.done' && payload.item?.type === 'mcp_call') {\n dataChannel.send(\n JSON.stringify({\n type: 'response.create',\n response: {\n instructions: 'Response to the user',\n },\n }),\n );\n }\n\n if (payload.type === 'response.function_call_arguments.done' && payload.name === 'open_url') {\n const { url } = JSON.parse(payload.arguments);\n window.location.href = url;\n }\n\n if (payload.type === 'conversation.item.input_audio_transcription.completed') {\n const transcript = payload.transcript?.trim();\n if (transcript) pendingUserTranscriptRef.current += transcript;\n }\n\n if (payload.type === 'response.output_audio_transcript.done') {\n const transcript = payload.transcript?.trim();\n if (!transcript || !pendingUserTranscriptRef.current) return;\n\n const input = pendingUserTranscriptRef.current.trim();\n pendingUserTranscriptRef.current = '';\n\n const activeLocale = locale || 'en-US';\n\n Event.publish(EVENT.METRICS, {\n id: 'SYNAPSE_RESPONSE',\n fingerprint,\n text: transcript,\n input,\n agent: 'aura',\n locale: activeLocale,\n });\n }\n });\n\n const offer = await peerConnection.createOffer();\n await peerConnection.setLocalDescription(offer);\n\n const sdpResponse = await fetch('https://api.openai.com/v1/realtime/calls', {\n method: 'POST',\n body: offer.sdp,\n headers: {\n Authorization: `Bearer ${ephemeralKey}`,\n 'Content-Type': 'application/sdp',\n },\n });\n\n if (!sdpResponse.ok) throw new Error('Failed to establish OpenAI Realtime session');\n\n const answer = { type: 'answer', sdp: await sdpResponse.text() };\n\n await peerConnection.setRemoteDescription(answer);\n } finally {\n setIsConnecting(false);\n setReady(true);\n }\n },\n [cleanupRealtimeSession],\n );\n\n const endSession = useCallback(() => {\n cleanupRealtimeSession(true);\n }, [cleanupRealtimeSession]);\n\n return { startSession, endSession, audioAnalyzers: audioAnalyzersRef.current };\n};\n\nexport { useOpenAiRealtimeSession };\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -137,10 +137,20 @@
|
|
|
137
137
|
}
|
|
138
138
|
}
|
|
139
139
|
|
|
140
|
+
|
|
141
|
+
/* S */
|
|
142
|
+
@media only screen and (min-width: 481px) {
|
|
143
|
+
.inputsMode>* {
|
|
144
|
+
height: 100%;
|
|
145
|
+
max-height: calc(var(--mirai-ui-space-XXL) * 2);
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
|
|
140
149
|
@keyframes textGradient {
|
|
141
150
|
0% {
|
|
142
151
|
background-position: 0% 0%;
|
|
143
152
|
}
|
|
153
|
+
|
|
144
154
|
100% {
|
|
145
155
|
background-position: 100% 0%;
|
|
146
156
|
}
|