fix: 经验/动作蒸馏不再静默丢弃(关推理 + 质量门槛 + 截断容忍)+ 前端会话显示 ID
问题:蒸馏模型把 token 预算烧在 reasoning 上 → content 为空/被截断(finish_reason=length),
代码只读 content → 经验与动作被静默丢弃("使用小红书找苏州饭店"跑完什么都没存,动作侧日志
'原始输出 0 字符')。
修复(web/agent_api.py):
- 蒸馏调用统一加 "thinking": {"type":"disabled"}(该代理支持;实测关掉后 reasoning=0、
配方 3/3 合格)——关键修复
- 配方:纯文本问法 + _recipe_ok 质量门槛(过短/含省略号占位丢弃,避免把提示词示例当真配方;
曾因提示词里写了占位示例,模型照抄成 "1. …\n2. …" 存进库)+ 空则重试一次;
仅动作提炼允许回退 reasoning_content(配方不回退,防思考草稿污染)
- 动作:JSON 输出 + _loads_lenient 截断容忍(逐对象抢救)+ {action,params} 形状归一 +
输入/产出限量(≤10 步、≤3 动作×4 步);失败日志带样本
- 前端 agent.js:会话列表显示会话 ID 前 8 位(等宽小字),点击复制完整 ID(便于引用 conv=<id>)
- doc/ARCHITECTURE.md:§3.8 序号语义 + §5.4 蒸馏健壮性与会话 ID 说明
实测:真机复跑同一句需求 → 经验已保存(配方 196 字符)+ 动作经验已保存 2 条
This commit is contained in:
+22
-1
@@ -252,15 +252,36 @@ function renderConvList(){
|
||||
}
|
||||
list.innerHTML = convs.map(c=>{
|
||||
const t = c.title || '新会话';
|
||||
const sid = String(c.id || '');
|
||||
return '<div class="agent-sess-item'+(c.id===cur?' active':'')
|
||||
+'" onclick="selectAgentSession(\''+c.id+'\')">'
|
||||
+'<button class="agent-sess-del" title="删除会话" '
|
||||
+'onclick="event.stopPropagation();deleteAgentSession(\''+c.id+'\')">✕</button>'
|
||||
+'<div class="t">'+esc(t)+'</div>'
|
||||
+'<div class="m">'+esc(c.updated_at||'')+(c.count ? ' · '+c.count+' 轮' : '')+'</div></div>';
|
||||
+'<div class="m">'+esc(c.updated_at||'')+(c.count ? ' · '+c.count+' 轮' : '')
|
||||
+' · <span style="font-family:monospace;opacity:.75" title="会话 ID:'+esc(sid)+'(点击复制)" '
|
||||
+'onclick="event.stopPropagation();copyConvId(\''+sid+'\')">#'+esc(sid.slice(0,8))+'</span>'
|
||||
+'</div></div>';
|
||||
}).join('');
|
||||
});
|
||||
}
|
||||
// 复制会话 ID(便于反馈问题时引用,如 conv=2ba4da0e43)
|
||||
function copyConvId(id){
|
||||
const done = ()=>showToast('会话 ID 已复制: '+id,'success');
|
||||
try{
|
||||
if(navigator.clipboard && navigator.clipboard.writeText){
|
||||
navigator.clipboard.writeText(id).then(done).catch(()=>fallback());
|
||||
return;
|
||||
}
|
||||
}catch(e){}
|
||||
fallback();
|
||||
function fallback(){
|
||||
const ta=document.createElement('textarea');
|
||||
ta.value=id; document.body.appendChild(ta); ta.select();
|
||||
try{ document.execCommand('copy'); done(); }catch(e){ showToast('会话 ID: '+id,'success'); }
|
||||
ta.remove();
|
||||
}
|
||||
}
|
||||
function loadCurrentConvMessages(){
|
||||
const chat = document.getElementById('agent-chat');
|
||||
if(!chat) return;
|
||||
|
||||
Reference in New Issue
Block a user