|
@@ -218,9 +218,8 @@
|
|
|
try {
|
|
try {
|
|
|
fetch(API_BASE + '/api/v1/analytics/events', {
|
|
fetch(API_BASE + '/api/v1/analytics/events', {
|
|
|
method: 'POST', headers: h, body: JSON.stringify(payload), keepalive: true
|
|
method: 'POST', headers: h, body: JSON.stringify(payload), keepalive: true
|
|
|
- }).then(function(r){
|
|
|
|
|
- }).catch(function(e){ console.error('[track] error', e); });
|
|
|
|
|
- } catch(e) { console.error('[track] exception', e); }
|
|
|
|
|
|
|
+ }).catch(function(){});
|
|
|
|
|
+ } catch(e) {}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
// 自动埋点所有 fetch 调用
|
|
// 自动埋点所有 fetch 调用
|
|
@@ -404,28 +403,31 @@
|
|
|
if(!msgs.length)return;
|
|
if(!msgs.length)return;
|
|
|
renderMessages(msgs);
|
|
renderMessages(msgs);
|
|
|
}
|
|
}
|
|
|
|
|
+ /** 统一渲染 AI 消息的内部 HTML(标签+内容+来源+品牌推荐) */
|
|
|
|
|
+ function buildAiInnerHtml(m) {
|
|
|
|
|
+ var tag=m.intent||'';
|
|
|
|
|
+ var tagHtml=tag?'<div class="tag '+tagClass(tag)+'">'+intentLabel(tag)+'</div>':'<div class="tag tag-fallback">AI 药典助手</div>';
|
|
|
|
|
+ var h = tagHtml+'<div class="content">'+md2html(m.content||'')+'</div>';
|
|
|
|
|
+ if (m.sources && m.sources.length) {
|
|
|
|
|
+ sourcesData = m.sources;
|
|
|
|
|
+ h += buildSourceTags();
|
|
|
|
|
+ sourcesData = [];
|
|
|
|
|
+ }
|
|
|
|
|
+ if (m.brand_recommendations && m.brand_recommendations.length) {
|
|
|
|
|
+ brandRecsData = m.brand_recommendations;
|
|
|
|
|
+ h += buildBrandRecs();
|
|
|
|
|
+ brandRecsData = [];
|
|
|
|
|
+ }
|
|
|
|
|
+ return h;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
function renderMessages(msgs){
|
|
function renderMessages(msgs){
|
|
|
var w=document.getElementById('chat').querySelector('.welcome');if(w)w.remove();
|
|
var w=document.getElementById('chat').querySelector('.welcome');if(w)w.remove();
|
|
|
for(var i=0;i<msgs.length;i++){
|
|
for(var i=0;i<msgs.length;i++){
|
|
|
var m=msgs[i],div=document.createElement('div');
|
|
var m=msgs[i],div=document.createElement('div');
|
|
|
div.className='msg '+m.role;
|
|
div.className='msg '+m.role;
|
|
|
if(m.role==='user'){div.textContent=m.content}
|
|
if(m.role==='user'){div.textContent=m.content}
|
|
|
- else{
|
|
|
|
|
- var tag=m.intent||'';
|
|
|
|
|
- var tagHtml=tag?'<div class="tag '+tagClass(tag)+'">'+intentLabel(tag)+'</div>':'<div class="tag tag-fallback">AI 药典助手</div>';
|
|
|
|
|
- div.innerHTML=tagHtml+'<div class="content">'+md2html(m.content)+'</div>';
|
|
|
|
|
- // 恢复历史记录中的来源引用和品牌推荐
|
|
|
|
|
- if (m.sources && m.sources.length) {
|
|
|
|
|
- sourcesData = m.sources;
|
|
|
|
|
- div.innerHTML += buildSourceTags();
|
|
|
|
|
- sourcesData = [];
|
|
|
|
|
- }
|
|
|
|
|
- if (m.brand_recommendations && m.brand_recommendations.length) {
|
|
|
|
|
- brandRecsData = m.brand_recommendations;
|
|
|
|
|
- div.innerHTML += buildBrandRecs();
|
|
|
|
|
- brandRecsData = [];
|
|
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ else{ div.innerHTML = buildAiInnerHtml(m); }
|
|
|
document.getElementById('chat').appendChild(div);
|
|
document.getElementById('chat').appendChild(div);
|
|
|
}
|
|
}
|
|
|
document.getElementById('chat').scrollTop=document.getElementById('chat').scrollHeight;
|
|
document.getElementById('chat').scrollTop=document.getElementById('chat').scrollHeight;
|