bep40 commited on
Commit
002fa7e
·
verified ·
1 Parent(s): d1872d5

feat: Greeting Trợ lý V giới thiệu V.AI STUDIO + tăng timeout 30s

Browse files
Files changed (1) hide show
  1. src/app.js +3 -3
src/app.js CHANGED
@@ -28,7 +28,7 @@ const DEFAULT_INSTRUCTIONS = [
28
  "NEVER guess facts. Use search_web/wikipedia. Get datetime first. Never mention tools.",
29
  ].join(" ");
30
 
31
- const GREETING_INSTRUCTIONS = "You are Gemma. Say exactly: 'Xin chào! Em là Gemma, trợ lý AI thân thiện của Vương V AI STUDIO. Em đây để giúp anh chị trò chuyện, trả lời câu hỏi, xem tin tức, hoặc tìm sản phẩm trong V.AI STUDIO. Rất vui được gặp anh chị!' Then end. No tools.";
32
 
33
  const STORAGE_KEYS = { voice:"avatar.voice", avatar:"avatar.model", instructions:"avatar.instructions", directUrl:"avatar.directUrl", subtitles:"avatar.subtitles" };
34
 
@@ -243,7 +243,7 @@ function _a(c){
243
  c.addEventListener("status",e=>onStatus(e.detail.status));
244
  c.addEventListener("queue",e=>{const{position}=e.detail;if(isGreetingSession)return;setCaption(position>0?`#${position} IN LINE…`:"ALMOST THERE…","live")});
245
  c.addEventListener("transcript",e=>{const{role,text}=e.detail;if(role==="assistant"&&text){const n=smartNormalize(text);showSubtitles(n);addChatMessage("assistant",n)}});
246
- c.addEventListener("response-finished",()=>{autoGreetingSent=true;fadeSubtitles();if(isGreetingSession)setTimeout(()=>void endSession(true),500)});
247
  c.addEventListener("toolcall",e=>{const{name,arguments:a,callId}=e.detail;runTool(name,a,callId)});
248
  c.addEventListener("server-error",e=>console.warn("err:",e.detail.error));
249
  c.addEventListener("error",()=>void endSession());
@@ -290,7 +290,7 @@ async function boot(){
290
  makeDraggable();makeResizable();
291
  setCaption("KHỞI ĐỘNG…");setMainButton("busy","Loading…");
292
  const newsPromise=(settings.avatar==="vuong.glb"||!settings.avatar)?getHotNewsGreeting().catch(()=>null):Promise.resolve(null);
293
- try{await Promise.race([stage.init({avatarUrl:settings.avatar?`/avatars/${settings.avatar}`:void 0,onprogress:e=>{if(e.lengthComputable)loading.textContent=`Loading avatar ${Math.min(100,Math.round(e.loaded/e.total*100))}%`}}),new Promise((_,rej)=>setTimeout(()=>rej(new Error("avatar timeout")),30000))])}catch(e){console.error("[app] Avatar init failed:", e?.message || e);loading.textContent="Avatar failed. Check console.";setCaption("AVATAR FAILED: "+(e?.message || "unknown"),"error");return welcome}
294
  preFetchedGreeting=await newsPromise;
295
  loading.classList.add("done");
296
 
 
28
  "NEVER guess facts. Use search_web/wikipedia. Get datetime first. Never mention tools.",
29
  ].join(" ");
30
 
31
+ const GREETING_INSTRUCTIONS = "You are V, a friendly helpful voice assistant avatar from V.AI STUDIO. Say exactly: 'Chào anh chị! Em là Trợ lý V, trợ lý AI trực quan của V.AI STUDIO. Em thể giúp anh chị: một là nhấn nút Start để trò chuyện thoại — Anh chị nói tự nhiên, Em sẽ nghe và trả lời ngay; hai nhấn nút Chat để nhắn tin; ba là nhấn nút V.AI STUDIO để xem 8.000 sản phẩm gia dụng: bếp, hút mùi, bồn cầu, bình nóng lạnh, khóa vân tay. Em sẽ trả lời ngắn gọn, dùng tiếng Việt, số đọc成 lời, tiền đồng. Rất vui được phục vụ anh chị!' Then end. No tools. No questions back.";
32
 
33
  const STORAGE_KEYS = { voice:"avatar.voice", avatar:"avatar.model", instructions:"avatar.instructions", directUrl:"avatar.directUrl", subtitles:"avatar.subtitles" };
34
 
 
243
  c.addEventListener("status",e=>onStatus(e.detail.status));
244
  c.addEventListener("queue",e=>{const{position}=e.detail;if(isGreetingSession)return;setCaption(position>0?`#${position} IN LINE…`:"ALMOST THERE…","live")});
245
  c.addEventListener("transcript",e=>{const{role,text}=e.detail;if(role==="assistant"&&text){const n=smartNormalize(text);showSubtitles(n);addChatMessage("assistant",n)}});
246
+ c.addEventListener("response-finished",()=>{autoGreetingSent=true;fadeSubtitles();if(isGreetingSession){setTimeout(()=>void endSession(true),3000)}});
247
  c.addEventListener("toolcall",e=>{const{name,arguments:a,callId}=e.detail;runTool(name,a,callId)});
248
  c.addEventListener("server-error",e=>console.warn("err:",e.detail.error));
249
  c.addEventListener("error",()=>void endSession());
 
290
  makeDraggable();makeResizable();
291
  setCaption("KHỞI ĐỘNG…");setMainButton("busy","Loading…");
292
  const newsPromise=(settings.avatar==="vuong.glb"||!settings.avatar)?getHotNewsGreeting().catch(()=>null):Promise.resolve(null);
293
+ try{await Promise.race([stage.init({avatarUrl:settings.avatar?`/avatars/${settings.avatar}`:void 0,onprogress:e=>{if(e.lengthComputable)loading.textContent=`Loading avatar ${Math.min(100,Math.round(e.loaded/e.total*100))}%`}}),new Promise((_,rej)=>setTimeout(()=>rej(new Error("avatar timeout")),30000))])}catch(e){console.error(e);loading.textContent="Avatar failed.";setCaption("AVATAR FAILED","error");return welcome}
294
  preFetchedGreeting=await newsPromise;
295
  loading.classList.add("done");
296