|
|
|
|
@ -4,8 +4,10 @@
@@ -4,8 +4,10 @@
|
|
|
|
|
var ENABLED_KEY = 'dshmem-log-enabled' |
|
|
|
|
var BASE = 'http' + ':' + '//' + '127.0.0.1' + ':' + '8766' |
|
|
|
|
var CHUNK = 700 |
|
|
|
|
var K_RATIO = 2.5 |
|
|
|
|
var seen = Object.create(null) |
|
|
|
|
var cfg = null |
|
|
|
|
var lastAccum = null |
|
|
|
|
var SEP = String.fromCharCode(10) + String.fromCharCode(10) |
|
|
|
|
|
|
|
|
|
function hash(s) { |
|
|
|
|
@ -123,6 +125,32 @@
@@ -123,6 +125,32 @@
|
|
|
|
|
return out.join('') |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
function extractAccum(sse) { |
|
|
|
|
if (!sse) return null |
|
|
|
|
var idx = sse.lastIndexOf('accumulated_token_usage') |
|
|
|
|
if (idx === -1) return null |
|
|
|
|
var tail = sse.slice(idx, idx + 80) |
|
|
|
|
var start = -1 |
|
|
|
|
var i = 0 |
|
|
|
|
while (i < tail.length) { |
|
|
|
|
var ch = tail.charCodeAt(i) |
|
|
|
|
if (ch >= 48 && ch <= 57) { |
|
|
|
|
start = i |
|
|
|
|
break |
|
|
|
|
} |
|
|
|
|
i++ |
|
|
|
|
} |
|
|
|
|
if (start === -1) return null |
|
|
|
|
var end = start |
|
|
|
|
while (end < tail.length) { |
|
|
|
|
var cd = tail.charCodeAt(end) |
|
|
|
|
if (cd < 48 || cd > 57) break |
|
|
|
|
end++ |
|
|
|
|
} |
|
|
|
|
if (end === start) return null |
|
|
|
|
return parseInt(tail.slice(start, end), 10) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
function process(entry) { |
|
|
|
|
if (!entry || !entry.url) return |
|
|
|
|
if (entry.url.indexOf('chat/completion') === -1) return |
|
|
|
|
@ -134,7 +162,8 @@
@@ -134,7 +162,8 @@
|
|
|
|
|
var messages = [] |
|
|
|
|
try { |
|
|
|
|
var req = JSON.parse(entry.body) |
|
|
|
|
if (req && Array.isArray(req.messages)) messages = req.messages; else if (req && typeof req.prompt === 'string' && req.prompt) messages = [{ role: 'user', content: req.prompt }] |
|
|
|
|
if (req && Array.isArray(req.messages)) messages = req.messages |
|
|
|
|
else if (req && typeof req.prompt === 'string' && req.prompt) messages = [{ role: 'user', content: req.prompt }] |
|
|
|
|
} catch (e) { return } |
|
|
|
|
var assistant = '' |
|
|
|
|
try { assistant = extractAssistant(entry.resp || '') } catch (e) { } |
|
|
|
|
@ -154,6 +183,31 @@
@@ -154,6 +183,31 @@
|
|
|
|
|
var ls = linesFor(role + '-' + h, role, text, Date.now()) |
|
|
|
|
for (var j = 0; j !== ls.length; j++) lines.push(ls[j]) |
|
|
|
|
} |
|
|
|
|
var accum = null |
|
|
|
|
try { accum = extractAccum(entry.resp || '') } catch (e) { accum = null } |
|
|
|
|
if (accum !== null) { |
|
|
|
|
var delta = 0 |
|
|
|
|
if (lastAccum !== null && accum > lastAccum) delta = accum - lastAccum |
|
|
|
|
lastAccum = accum |
|
|
|
|
var ctxChars = 0 |
|
|
|
|
for (var m = 0; m !== all.length; m++) { |
|
|
|
|
if (all[m] && typeof all[m].content === 'string') ctxChars += all[m].content.length |
|
|
|
|
} |
|
|
|
|
var meta = { |
|
|
|
|
mid: 'meta-' + Date.now(), |
|
|
|
|
part: 0, |
|
|
|
|
total: 1, |
|
|
|
|
role: 'meta', |
|
|
|
|
ts: Date.now(), |
|
|
|
|
inj: false, |
|
|
|
|
text: 'metrics', |
|
|
|
|
accum: accum, |
|
|
|
|
delta: delta, |
|
|
|
|
chars: ctxChars, |
|
|
|
|
est_tok: Math.round(ctxChars / K_RATIO) |
|
|
|
|
} |
|
|
|
|
lines.push(JSON.stringify(meta)) |
|
|
|
|
} |
|
|
|
|
if (!lines.length) return |
|
|
|
|
sendLines(file, lines).then(function (ok) { |
|
|
|
|
if (ok) console.log('[chat-log] saved', lines.length) |
|
|
|
|
|