feat: agent-hermes reads real token counts from session DB
CI / check (pull_request) Successful in 1m41s
CI / check (pull_request) Successful in 1m41s
- Add inputTokens/outputTokens to HermesSessionJson type - Query input_tokens, output_tokens from sessions table in loadHermesSessionFromDb - Update test fixture schema with token columns - runPrompt now reports real token counts from Hermes state.db Refs #76, #68
This commit is contained in:
@@ -140,7 +140,9 @@ function createTestDb(dbPath: string): TestDb {
|
|||||||
db.exec(`CREATE TABLE sessions (
|
db.exec(`CREATE TABLE sessions (
|
||||||
id TEXT PRIMARY KEY,
|
id TEXT PRIMARY KEY,
|
||||||
model TEXT NOT NULL,
|
model TEXT NOT NULL,
|
||||||
started_at INTEGER NOT NULL
|
started_at INTEGER NOT NULL,
|
||||||
|
input_tokens INTEGER DEFAULT 0,
|
||||||
|
output_tokens INTEGER DEFAULT 0
|
||||||
)`);
|
)`);
|
||||||
db.exec(`CREATE TABLE messages (
|
db.exec(`CREATE TABLE messages (
|
||||||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||||
|
|||||||
@@ -127,8 +127,8 @@ export function createHermesAgent(resumeDisabled: boolean): () => Promise<void>
|
|||||||
|
|
||||||
const usage: Usage = {
|
const usage: Usage = {
|
||||||
turns,
|
turns,
|
||||||
inputTokens: 0,
|
inputTokens: session !== null ? session.inputTokens : 0,
|
||||||
outputTokens: 0,
|
outputTokens: session !== null ? session.outputTokens : 0,
|
||||||
duration: Math.round(durationSec),
|
duration: Math.round(durationSec),
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -106,7 +106,7 @@ function parseSessionJson(raw: unknown): HermesSessionJson | null {
|
|||||||
messages.push(msg);
|
messages.push(msg);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return { session_id, model, session_start, messages };
|
return { session_id, model, session_start, messages, inputTokens: 0, outputTokens: 0 };
|
||||||
}
|
}
|
||||||
|
|
||||||
export function getHermesDbPath(): string {
|
export function getHermesDbPath(): string {
|
||||||
@@ -117,6 +117,8 @@ type DbSessionRow = {
|
|||||||
id: string;
|
id: string;
|
||||||
model: string;
|
model: string;
|
||||||
started_at: number;
|
started_at: number;
|
||||||
|
input_tokens: number;
|
||||||
|
output_tokens: number;
|
||||||
};
|
};
|
||||||
|
|
||||||
type DbMessageRow = {
|
type DbMessageRow = {
|
||||||
@@ -156,7 +158,9 @@ export function loadHermesSessionFromDb(
|
|||||||
try {
|
try {
|
||||||
db = new DatabaseSync(resolvedPath, { readOnly: true });
|
db = new DatabaseSync(resolvedPath, { readOnly: true });
|
||||||
const session = db
|
const session = db
|
||||||
.prepare("SELECT id, model, started_at FROM sessions WHERE id = ?")
|
.prepare(
|
||||||
|
"SELECT id, model, started_at, input_tokens, output_tokens FROM sessions WHERE id = ?",
|
||||||
|
)
|
||||||
.get(sessionId) as DbSessionRow | null;
|
.get(sessionId) as DbSessionRow | null;
|
||||||
if (session === null) {
|
if (session === null) {
|
||||||
return null;
|
return null;
|
||||||
@@ -181,6 +185,8 @@ export function loadHermesSessionFromDb(
|
|||||||
model: session.model,
|
model: session.model,
|
||||||
session_start: new Date(session.started_at * 1000).toISOString(),
|
session_start: new Date(session.started_at * 1000).toISOString(),
|
||||||
messages,
|
messages,
|
||||||
|
inputTokens: session.input_tokens ?? 0,
|
||||||
|
outputTokens: session.output_tokens ?? 0,
|
||||||
};
|
};
|
||||||
} catch {
|
} catch {
|
||||||
return null;
|
return null;
|
||||||
|
|||||||
@@ -40,4 +40,6 @@ export type HermesSessionJson = {
|
|||||||
model: string;
|
model: string;
|
||||||
session_start: string;
|
session_start: string;
|
||||||
messages: HermesSessionMessage[];
|
messages: HermesSessionMessage[];
|
||||||
|
inputTokens: number;
|
||||||
|
outputTokens: number;
|
||||||
};
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user