diff --git a/vite/public/assets/ai/sfx-06-ai-04-record-03-ai-05-sfx-07.mp3 b/vite/public/assets/ai/sfx-06-ai-04-record-03-ai-05-sfx-07.mp3 index f42f701..90a153a 100644 Binary files a/vite/public/assets/ai/sfx-06-ai-04-record-03-ai-05-sfx-07.mp3 and b/vite/public/assets/ai/sfx-06-ai-04-record-03-ai-05-sfx-07.mp3 differ diff --git a/vite/src/pages/flow_free.jsx b/vite/src/pages/flow_free.jsx index 18fa2de..a253adf 100644 --- a/vite/src/pages/flow_free.jsx +++ b/vite/src/pages/flow_free.jsx @@ -14,6 +14,7 @@ import VoiceAnalysis from "../comps/voiceanalysis"; import { sendOsc, OSC_ADDRESS, updatePrompt, onOscMessageReceived, sendOscStatus } from "../util/osc"; import { DebugControl, TEST_PROMPT } from "../comps/debug"; import { useUser } from "../util/useUser"; +import { set } from 'zod/v4'; const CUELIST_FILE = 'cuelist_demo3.json'; @@ -56,6 +57,9 @@ export function FreeFlow(){ const [audioInput, setAudioInput] = useState(true); const [autoSend, setAutoSend] = useState(true); const [chatStatus, setChatStatus] = useState(ChatStatus.System); // System, User, Processing + + const [padInput, setPadInput] = useState(null); + const { userId, setUserId, getFileId, setPassword, reset:resetUser, uploadHistory, setSummary, summary,setChoice,choice, getUploadFolder,getDataId } = useUser(); const refTimer=useRef(); @@ -258,6 +262,7 @@ export function FreeFlow(){ // clear unity hint sendOsc(OSC_ADDRESS.HINT, ''); // Clear hint message sendOsc(OSC_ADDRESS.INPUT, ''); // Clear input message + sendOsc(OSC_ADDRESS.SPEECH, 'stop'); switch(cue.type){ case 'chat': @@ -284,17 +289,28 @@ export function FreeFlow(){ setChatStatus(ChatStatus.Clear); // Set chat status to Processing let message=refInput.current?.value?.trim() || history.map(el=>`${el.role}:${el.content}`).join('\n'); - getSummary(message, data).then(summary_ => { + console.log('Summary input message:', message); + + if(!message || message.length==0) { - console.log('Summary:', summary_); + setSummary(); + console.log('no message input, clear summary'); onCueEnd(); // End the current cue after getting summary - setSummary(()=>summary_?.result); - refContainer.current.scrollTop = refContainer.current.scrollHeight; // Scroll to bottom - - }).catch(error => { - console.error('Error getting summary:', error); - }); + }else{ + + getSummary(message, data).then(summary_ => { + + console.log('Summary:', summary_); + onCueEnd(); // End the current cue after getting summary + + setSummary(()=>summary_?.result); + refContainer.current.scrollTop = refContainer.current.scrollHeight; // Scroll to bottom + + }).catch(error => { + console.error('Error getting summary:', error); + }); + } break; @@ -367,7 +383,7 @@ export function FreeFlow(){ }else{ sendOsc(OSC_ADDRESS.HINT, ''); // Clear hint message } - + sendOsc(OSC_ADDRESS.SPEECH, 'stop'); refAudio.current?.pause(); // Pause any playing audio console.log('onCueEnd:', cue.id); @@ -399,23 +415,34 @@ export function FreeFlow(){ function onNumpad(mess){ - console.log('Numpad input:', mess); + setPadInput(mess); + } + + useEffect(()=>{ + + + if(padInput==null) return; + + console.log('Numpad input:', padInput); if(refCurrentCue.current?.callback!='numpad') return; let cue=refCurrentCue.current; let next=cue.nextcue; switch(cue.numpad_type){ case NUMPAD_TYPE.USERID: - setUserId(()=>mess); + setUserId(()=>padInput); break; case NUMPAD_TYPE.CHOICE: - next=cue.branch[mess.toString()].nextcue; - setChoice(cue.branch[mess.toString()].description); // Set choice for user input + next=cue.branch[padInput.toString()].nextcue; + setChoice(()=>cue.branch[padInput.toString()].description); // Set choice for user input break; case NUMPAD_TYPE.PASSWORD: - setPassword(()=>mess); + setPassword(()=>padInput); // sendOsc(OSC_ADDRESS.PASSWORD, mess); // Send OSC password message - sendOsc(OSC_ADDRESS.EXPORT, `${getUploadFolder()}#${getDataId()}#${summary}#${getFileId(mess)}`); + const user_input = history.find(msg => msg.role === 'user'); + const default_image=!(user_input && user_input.content.trim() !== ''); + + sendOsc(OSC_ADDRESS.EXPORT, `${getUploadFolder()}#${getDataId()}#${summary||''}#${getFileId(padInput)}#${choice||''}#${default_image?'default':'generated'}`); // Send OSC export message sendOsc(OSC_ADDRESS.CHOICE, choice); // Send OSC save choice message break; } @@ -425,10 +452,9 @@ export function FreeFlow(){ console.log('Finish enter number, next cue:', next); playCue(cuelist.find(c => c.id === next)); } - } - function saveImage(){ - sendOsc('/export', 'output/test.png'); // Send OSC message to save image - } + + + },[padInput]); useEffect(()=>{ @@ -561,11 +587,14 @@ export function FreeFlow(){ if(refPauseTimer.current) clearTimeout(refPauseTimer.current); refSpeechPaused.current=false; } - + + sendOsc(OSC_ADDRESS.SPEECH, 'start'); + sendOscStatus(OSC_ADDRESS.CLIENT_INPUT, `${data.id}#${transcript}`); // Send current input via OSC + + } - sendOsc(OSC_ADDRESS.SPEECH, 'start'); },[transcript]); @@ -703,9 +732,7 @@ export function FreeFlow(){ UserId{userId} FileId{getFileId()} - + Choice{choice || ''} diff --git a/vite/src/util/useUser.jsx b/vite/src/util/useUser.jsx index 2afcdb4..6830689 100644 --- a/vite/src/util/useUser.jsx +++ b/vite/src/util/useUser.jsx @@ -1,4 +1,4 @@ -import { createContext, useState, useEffect, useContext, use } from "react"; +import { createContext, useState, useEffect, useContext, use, useRef } from "react"; import moment from "moment"; import { updateUser } from "./backend"; import { useData } from "./useData"; @@ -23,6 +23,8 @@ export function UserProvider({children}) { const [choice, setChoice] = useState(null); const [summary, setSummary] = useState(null); + const refChoice=useRef(); + const {data}=useData(); @@ -114,11 +116,16 @@ export function UserProvider({children}) { console.log("Session ID changed:", sessionId); }, [sessionId]); + // useEffect(()=>{ + // refChoice.current=choice; + // console.log("Choice changed:", choice); + // }, [choice]); return ( {children}