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 }));