From 43fa29c08c1d28bbd6d586a0ed9d0c6b47689d3c Mon Sep 17 00:00:00 2001 From: mango Date: Sun, 22 Feb 2026 22:27:55 +0800 Subject: [PATCH] feat: add cache_read/cache_write to request logs, fix display --- agent/agent.sh | 1 + public/index.html | 8 ++++---- server/index.js | 11 ++++++++--- 3 files changed, 13 insertions(+), 7 deletions(-) diff --git a/agent/agent.sh b/agent/agent.sh index a94d6f1..71c16f1 100755 --- a/agent/agent.sh +++ b/agent/agent.sh @@ -305,6 +305,7 @@ for sd in glob.glob(os.path.join(oc_dir,'agents','*','sessions')): reqs.append({'node_id':nid,'upstream':m.get('provider',''), 'model':m.get('model',''),'status':200, 'input_tokens':u.get('input',0),'output_tokens':u.get('output',0), + 'cache_read':u.get('cacheRead',0),'cache_write':u.get('cacheWrite',0), 'ttft_ms':0,'total_ms':0,'success':True, 'ts':ts_val}) except: pass diff --git a/public/index.html b/public/index.html index 0fe29bf..8bf214a 100644 --- a/public/index.html +++ b/public/index.html @@ -228,13 +228,13 @@ function renderLogs(){ if(fR!==''&&String(r.success?1:0)!==fR)return false; return true; }); - let h='时间节点供应商模型结果状态输入输出首字总耗时'; + let h='时间节点供应商模型结果输入输出缓存读缓存写'; filtered.forEach(r=>{ const t=new Date(r.ts*1000).toLocaleTimeString('zh-CN'); h+=''+t+''+(r.node_name||r.node_id)+''+r.upstream+''+r.model+''; - h+=''+(r.success?'✓':'✗')+''+r.status+''; - h+=''+fmtTok(r.input_tokens)+''+r.output_tokens+''; - h+=''+r.ttft_ms+'ms'+fmtUp(r.total_ms)+''; + h+=''+(r.success?'✓':'✗')+''; + h+=''+fmtTok(r.input_tokens)+''+fmtTok(r.output_tokens)+''; + h+=''+fmtTok(r.cache_read||0)+''+fmtTok(r.cache_write||0)+''; }); $('#logTable').innerHTML=h+''; // pager diff --git a/server/index.js b/server/index.js index dc931c8..ba7b03f 100644 --- a/server/index.js +++ b/server/index.js @@ -41,7 +41,11 @@ CREATE TABLE IF NOT EXISTS requests ( ); CREATE INDEX IF NOT EXISTS idx_req_ts ON requests(ts); CREATE INDEX IF NOT EXISTS idx_req_node ON requests(node_id); -CREATE TABLE IF NOT EXISTS tokens ( +`); +// Add cache columns if missing (migration) +try { db.exec('ALTER TABLE requests ADD COLUMN cache_read INTEGER DEFAULT 0'); } catch(e) {} +try { db.exec('ALTER TABLE requests ADD COLUMN cache_write INTEGER DEFAULT 0'); } catch(e) {} +db.exec(`CREATE TABLE IF NOT EXISTS tokens ( id TEXT PRIMARY KEY DEFAULT 'global', token TEXT UNIQUE ); @@ -59,7 +63,7 @@ const upsertNode = db.prepare(`INSERT INTO nodes(id,name,host,os,oc_version,role swap=excluded.swap,sessions=excluded.sessions,gw_ok=excluded.gw_ok,daemon_ok=excluded.daemon_ok, uptime=excluded.uptime,tok_today=excluded.tok_today,tok_week=excluded.tok_week,tok_month=excluded.tok_month, last_seen=excluded.last_seen`); -const insertReq = db.prepare(`INSERT INTO requests(node_id,upstream,model,status,input_tokens,output_tokens,ttft_ms,total_ms,success,ts) VALUES(?,?,?,?,?,?,?,?,?,?)`); +const insertReq = db.prepare(`INSERT INTO requests(node_id,upstream,model,status,input_tokens,output_tokens,cache_read,cache_write,ttft_ms,total_ms,success,ts) VALUES(?,?,?,?,?,?,?,?,?,?,?,?)`); const getNodes = db.prepare("SELECT * FROM nodes ORDER BY role='master' DESC, name"); const getReqs = db.prepare("SELECT r.*,n.name as node_name FROM requests r LEFT JOIN nodes n ON r.node_id=n.id ORDER BY r.ts DESC LIMIT ?"); const getReqsPage = db.prepare("SELECT r.*,n.name as node_name FROM requests r LEFT JOIN nodes n ON r.node_id=n.id ORDER BY r.ts DESC LIMIT ? OFFSET ?"); @@ -161,7 +165,8 @@ const server = http.createServer((req, res) => { const items = Array.isArray(b) ? b : [b]; for (const r of items) { insertReq.run(r.node_id,r.upstream,r.model,r.status||200, - r.input_tokens||0,r.output_tokens||0,r.ttft_ms||0,r.total_ms||0, + r.input_tokens||0,r.output_tokens||0,r.cache_read||0,r.cache_write||0, + r.ttft_ms||0,r.total_ms||0, r.success!==false?1:0, r.ts||now); } if (items.length <= 5) items.forEach(r => broadcast({ type:'request', request: r }));