@cyanautomation/kaseki-agent 1.64.2 → 1.65.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/pi-event-filter.js +36 -0
- package/dist/pi-event-filter.js.map +1 -1
- package/dist/token-usage-aggregator.d.ts +85 -0
- package/dist/token-usage-aggregator.d.ts.map +1 -0
- package/dist/token-usage-aggregator.js +135 -0
- package/dist/token-usage-aggregator.js.map +1 -0
- package/kaseki-agent.sh +385 -383
- package/package.json +2 -2
- package/scripts/docker-entrypoint.sh +12 -5
- package/scripts/kaseki-setup-host.sh +7 -1
- package/scripts/startup-checks.sh +40 -25
package/dist/pi-event-filter.js
CHANGED
|
@@ -5,6 +5,7 @@ import readline from 'node:readline';
|
|
|
5
5
|
import { EventCounterAggregator } from './event-aggregator.js';
|
|
6
6
|
import { ToolReliabilityAggregator } from './tool-reliability-aggregator.js';
|
|
7
7
|
import { ExecutionTimeAggregator } from './execution-time-aggregator.js';
|
|
8
|
+
import { TokenUsageAggregator } from './token-usage-aggregator.js';
|
|
8
9
|
import { TimestampTracker } from './timestamp-tracker.js';
|
|
9
10
|
import { extractEventTimestamp } from './lib/event-timestamp-helpers.js';
|
|
10
11
|
const inputPath = process.argv[2] ?? '/tmp/pi-events.raw.jsonl';
|
|
@@ -120,6 +121,32 @@ function extractPhase(event) {
|
|
|
120
121
|
const context = event.context || event.phase || 'unknown';
|
|
121
122
|
return typeof context === 'string' ? context : 'unknown';
|
|
122
123
|
}
|
|
124
|
+
/**
|
|
125
|
+
* Extract usage information from a Pi event.
|
|
126
|
+
* Looks for usage in message, assistantMessageEvent, or top-level usage field.
|
|
127
|
+
*/
|
|
128
|
+
function extractUsage(event) {
|
|
129
|
+
// Check message.usage (OpenRouter format)
|
|
130
|
+
if (event.message?.usage) {
|
|
131
|
+
return event.message.usage;
|
|
132
|
+
}
|
|
133
|
+
// Check top-level usage field
|
|
134
|
+
if (event.usage) {
|
|
135
|
+
return event.usage;
|
|
136
|
+
}
|
|
137
|
+
// Check assistantMessageEvent.usage
|
|
138
|
+
if (event.assistantMessageEvent?.usage) {
|
|
139
|
+
return event.assistantMessageEvent.usage;
|
|
140
|
+
}
|
|
141
|
+
return null;
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Extract model name from event (for token usage association).
|
|
145
|
+
*/
|
|
146
|
+
function extractModelName(event) {
|
|
147
|
+
const model = event.message?.model || event.model || 'unknown';
|
|
148
|
+
return typeof model === 'string' ? model : 'unknown';
|
|
149
|
+
}
|
|
123
150
|
async function main() {
|
|
124
151
|
startRssSampler();
|
|
125
152
|
const input = fs.createReadStream(inputPath, { encoding: 'utf8' });
|
|
@@ -128,6 +155,7 @@ async function main() {
|
|
|
128
155
|
const aggregator = new EventCounterAggregator();
|
|
129
156
|
const toolReliability = new ToolReliabilityAggregator();
|
|
130
157
|
const executionTime = new ExecutionTimeAggregator();
|
|
158
|
+
const tokenUsage = new TokenUsageAggregator();
|
|
131
159
|
const tracker = new TimestampTracker();
|
|
132
160
|
let invalidJsonLines = 0;
|
|
133
161
|
// Track agent phase timing
|
|
@@ -158,6 +186,12 @@ async function main() {
|
|
|
158
186
|
// Record assistant event type
|
|
159
187
|
const assistantType = event.assistantMessageEvent?.type;
|
|
160
188
|
aggregator.recordAssistantEventType(assistantType);
|
|
189
|
+
// Track token usage from events
|
|
190
|
+
const usage = extractUsage(event);
|
|
191
|
+
if (usage) {
|
|
192
|
+
const modelName = extractModelName(event);
|
|
193
|
+
tokenUsage.recordUsage(modelName, usage);
|
|
194
|
+
}
|
|
161
195
|
// Track agent timing (API invocation time)
|
|
162
196
|
const timestampSecs = extractTimestampSeconds(event);
|
|
163
197
|
if (isAgentStart(event)) {
|
|
@@ -203,6 +237,8 @@ async function main() {
|
|
|
203
237
|
execution_time: executionTime.getSummary(),
|
|
204
238
|
execution_api_stats: executionTime.getApiStats(),
|
|
205
239
|
execution_tool_stats: executionTime.getToolStats(),
|
|
240
|
+
token_usage: tokenUsage.getSummary(),
|
|
241
|
+
model_token_stats: tokenUsage.getModelStats(),
|
|
206
242
|
};
|
|
207
243
|
fs.writeFileSync(summaryPath, `${JSON.stringify(summary, null, 2)}\n`);
|
|
208
244
|
stopRssSampler();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pi-event-filter.js","sourceRoot":"","sources":["../src/pi-event-filter.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AACnC,OAAO,QAAQ,MAAM,eAAe,CAAC;AACrC,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAC/D,OAAO,EAAE,yBAAyB,EAAqC,MAAM,kCAAkC,CAAC;AAChH,OAAO,EAAE,uBAAuB,EAAwC,MAAM,gCAAgC,CAAC;AAC/G,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAE,qBAAqB,EAAW,MAAM,kCAAkC,CAAC;
|
|
1
|
+
{"version":3,"file":"pi-event-filter.js","sourceRoot":"","sources":["../src/pi-event-filter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* token-usage-aggregator.ts
|
|
3
|
+
*
|
|
4
|
+
* Aggregates token usage metrics from Pi event stream.
|
|
5
|
+
* Tracks input tokens, output tokens, and cache-related tokens (creation and read).
|
|
6
|
+
* Supports OpenRouter-style usage objects from Pi API responses.
|
|
7
|
+
*/
|
|
8
|
+
export interface UsageObject {
|
|
9
|
+
prompt_tokens?: number;
|
|
10
|
+
completion_tokens?: number;
|
|
11
|
+
prompt_tokens_details?: {
|
|
12
|
+
cache_creation_input_tokens?: number;
|
|
13
|
+
cache_read_input_tokens?: number;
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
export interface TokenUsageSummary {
|
|
17
|
+
total_input_tokens: number;
|
|
18
|
+
total_output_tokens: number;
|
|
19
|
+
total_cache_creation_tokens: number;
|
|
20
|
+
total_cache_read_tokens: number;
|
|
21
|
+
total_tokens: number;
|
|
22
|
+
cache_efficiency_percent: number;
|
|
23
|
+
}
|
|
24
|
+
export interface ModelTokenStats {
|
|
25
|
+
[modelName: string]: {
|
|
26
|
+
input_tokens: number;
|
|
27
|
+
output_tokens: number;
|
|
28
|
+
cache_creation_tokens: number;
|
|
29
|
+
cache_read_tokens: number;
|
|
30
|
+
total_tokens: number;
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* TokenUsageAggregator tracks token usage across Pi event streams.
|
|
35
|
+
*
|
|
36
|
+
* Accumulates:
|
|
37
|
+
* - Input tokens (prompt_tokens)
|
|
38
|
+
* - Output tokens (completion_tokens)
|
|
39
|
+
* - Cache creation tokens (prompt_tokens_details.cache_creation_input_tokens)
|
|
40
|
+
* - Cache read tokens (prompt_tokens_details.cache_read_input_tokens)
|
|
41
|
+
*
|
|
42
|
+
* Also tracks per-model usage for cost estimation and performance analysis.
|
|
43
|
+
*/
|
|
44
|
+
export declare class TokenUsageAggregator {
|
|
45
|
+
private totalInputTokens;
|
|
46
|
+
private totalOutputTokens;
|
|
47
|
+
private totalCacheCreationTokens;
|
|
48
|
+
private totalCacheReadTokens;
|
|
49
|
+
private modelStats;
|
|
50
|
+
/**
|
|
51
|
+
* Get or initialize model stats.
|
|
52
|
+
*/
|
|
53
|
+
private ensureModelStats;
|
|
54
|
+
/**
|
|
55
|
+
* Record input tokens for a model.
|
|
56
|
+
*/
|
|
57
|
+
recordInputTokens(modelName: string, tokens: number): void;
|
|
58
|
+
/**
|
|
59
|
+
* Record output tokens for a model.
|
|
60
|
+
*/
|
|
61
|
+
recordOutputTokens(modelName: string, tokens: number): void;
|
|
62
|
+
/**
|
|
63
|
+
* Record cache creation tokens for a model.
|
|
64
|
+
*/
|
|
65
|
+
recordCacheCreationTokens(modelName: string, tokens: number): void;
|
|
66
|
+
/**
|
|
67
|
+
* Record cache read tokens for a model.
|
|
68
|
+
*/
|
|
69
|
+
recordCacheReadTokens(modelName: string, tokens: number): void;
|
|
70
|
+
/**
|
|
71
|
+
* Record usage from an OpenRouter-style usage object.
|
|
72
|
+
* @param modelName - Model identifier
|
|
73
|
+
* @param usage - Usage object with prompt_tokens, completion_tokens, etc.
|
|
74
|
+
*/
|
|
75
|
+
recordUsage(modelName: string, usage: UsageObject | null | undefined): void;
|
|
76
|
+
/**
|
|
77
|
+
* Get the overall token usage summary.
|
|
78
|
+
*/
|
|
79
|
+
getSummary(): TokenUsageSummary;
|
|
80
|
+
/**
|
|
81
|
+
* Get per-model token usage statistics.
|
|
82
|
+
*/
|
|
83
|
+
getModelStats(): ModelTokenStats;
|
|
84
|
+
}
|
|
85
|
+
//# sourceMappingURL=token-usage-aggregator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"token-usage-aggregator.d.ts","sourceRoot":"","sources":["../src/token-usage-aggregator.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,MAAM,WAAW,WAAW;IAC1B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,qBAAqB,CAAC,EAAE;QACtB,2BAA2B,CAAC,EAAE,MAAM,CAAC;QACrC,uBAAuB,CAAC,EAAE,MAAM,CAAC;KAClC,CAAC;CACH;AAED,MAAM,WAAW,iBAAiB;IAChC,kBAAkB,EAAE,MAAM,CAAC;IAC3B,mBAAmB,EAAE,MAAM,CAAC;IAC5B,2BAA2B,EAAE,MAAM,CAAC;IACpC,uBAAuB,EAAE,MAAM,CAAC;IAChC,YAAY,EAAE,MAAM,CAAC;IACrB,wBAAwB,EAAE,MAAM,CAAC;CAClC;AAED,MAAM,WAAW,eAAe;IAC9B,CAAC,SAAS,EAAE,MAAM,GAAG;QACnB,YAAY,EAAE,MAAM,CAAC;QACrB,aAAa,EAAE,MAAM,CAAC;QACtB,qBAAqB,EAAE,MAAM,CAAC;QAC9B,iBAAiB,EAAE,MAAM,CAAC;QAC1B,YAAY,EAAE,MAAM,CAAC;KACtB,CAAC;CACH;AAED;;;;;;;;;;GAUG;AACH,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,gBAAgB,CAAK;IAC7B,OAAO,CAAC,iBAAiB,CAAK;IAC9B,OAAO,CAAC,wBAAwB,CAAK;IACrC,OAAO,CAAC,oBAAoB,CAAK;IAGjC,OAAO,CAAC,UAAU,CAQJ;IAEd;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAmBxB;;OAEG;IACH,iBAAiB,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI;IAM1D;;OAEG;IACH,kBAAkB,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI;IAM3D;;OAEG;IACH,yBAAyB,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI;IAMlE;;OAEG;IACH,qBAAqB,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI;IAM9D;;;;OAIG;IACH,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,GAAG,IAAI,GAAG,SAAS,GAAG,IAAI;IAyB3E;;OAEG;IACH,UAAU,IAAI,iBAAiB;IAuB/B;;OAEG;IACH,aAAa,IAAI,eAAe;CAkBjC"}
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* token-usage-aggregator.ts
|
|
3
|
+
*
|
|
4
|
+
* Aggregates token usage metrics from Pi event stream.
|
|
5
|
+
* Tracks input tokens, output tokens, and cache-related tokens (creation and read).
|
|
6
|
+
* Supports OpenRouter-style usage objects from Pi API responses.
|
|
7
|
+
*/
|
|
8
|
+
/**
|
|
9
|
+
* TokenUsageAggregator tracks token usage across Pi event streams.
|
|
10
|
+
*
|
|
11
|
+
* Accumulates:
|
|
12
|
+
* - Input tokens (prompt_tokens)
|
|
13
|
+
* - Output tokens (completion_tokens)
|
|
14
|
+
* - Cache creation tokens (prompt_tokens_details.cache_creation_input_tokens)
|
|
15
|
+
* - Cache read tokens (prompt_tokens_details.cache_read_input_tokens)
|
|
16
|
+
*
|
|
17
|
+
* Also tracks per-model usage for cost estimation and performance analysis.
|
|
18
|
+
*/
|
|
19
|
+
export class TokenUsageAggregator {
|
|
20
|
+
totalInputTokens = 0;
|
|
21
|
+
totalOutputTokens = 0;
|
|
22
|
+
totalCacheCreationTokens = 0;
|
|
23
|
+
totalCacheReadTokens = 0;
|
|
24
|
+
// Per-model tracking
|
|
25
|
+
modelStats = new Map();
|
|
26
|
+
/**
|
|
27
|
+
* Get or initialize model stats.
|
|
28
|
+
*/
|
|
29
|
+
ensureModelStats(modelName) {
|
|
30
|
+
if (!this.modelStats.has(modelName)) {
|
|
31
|
+
this.modelStats.set(modelName, {
|
|
32
|
+
input_tokens: 0,
|
|
33
|
+
output_tokens: 0,
|
|
34
|
+
cache_creation_tokens: 0,
|
|
35
|
+
cache_read_tokens: 0,
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
return this.modelStats.get(modelName);
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Record input tokens for a model.
|
|
42
|
+
*/
|
|
43
|
+
recordInputTokens(modelName, tokens) {
|
|
44
|
+
this.totalInputTokens += tokens;
|
|
45
|
+
const stats = this.ensureModelStats(modelName);
|
|
46
|
+
stats.input_tokens += tokens;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Record output tokens for a model.
|
|
50
|
+
*/
|
|
51
|
+
recordOutputTokens(modelName, tokens) {
|
|
52
|
+
this.totalOutputTokens += tokens;
|
|
53
|
+
const stats = this.ensureModelStats(modelName);
|
|
54
|
+
stats.output_tokens += tokens;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Record cache creation tokens for a model.
|
|
58
|
+
*/
|
|
59
|
+
recordCacheCreationTokens(modelName, tokens) {
|
|
60
|
+
this.totalCacheCreationTokens += tokens;
|
|
61
|
+
const stats = this.ensureModelStats(modelName);
|
|
62
|
+
stats.cache_creation_tokens += tokens;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Record cache read tokens for a model.
|
|
66
|
+
*/
|
|
67
|
+
recordCacheReadTokens(modelName, tokens) {
|
|
68
|
+
this.totalCacheReadTokens += tokens;
|
|
69
|
+
const stats = this.ensureModelStats(modelName);
|
|
70
|
+
stats.cache_read_tokens += tokens;
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Record usage from an OpenRouter-style usage object.
|
|
74
|
+
* @param modelName - Model identifier
|
|
75
|
+
* @param usage - Usage object with prompt_tokens, completion_tokens, etc.
|
|
76
|
+
*/
|
|
77
|
+
recordUsage(modelName, usage) {
|
|
78
|
+
if (!usage || typeof usage !== 'object')
|
|
79
|
+
return;
|
|
80
|
+
if (typeof usage.prompt_tokens === 'number') {
|
|
81
|
+
this.recordInputTokens(modelName, usage.prompt_tokens);
|
|
82
|
+
}
|
|
83
|
+
if (typeof usage.completion_tokens === 'number') {
|
|
84
|
+
this.recordOutputTokens(modelName, usage.completion_tokens);
|
|
85
|
+
}
|
|
86
|
+
if (usage.prompt_tokens_details) {
|
|
87
|
+
const details = usage.prompt_tokens_details;
|
|
88
|
+
if (typeof details.cache_creation_input_tokens === 'number') {
|
|
89
|
+
this.recordCacheCreationTokens(modelName, details.cache_creation_input_tokens);
|
|
90
|
+
}
|
|
91
|
+
if (typeof details.cache_read_input_tokens === 'number') {
|
|
92
|
+
this.recordCacheReadTokens(modelName, details.cache_read_input_tokens);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Get the overall token usage summary.
|
|
98
|
+
*/
|
|
99
|
+
getSummary() {
|
|
100
|
+
const totalTokens = this.totalInputTokens +
|
|
101
|
+
this.totalOutputTokens +
|
|
102
|
+
this.totalCacheCreationTokens +
|
|
103
|
+
this.totalCacheReadTokens;
|
|
104
|
+
// Cache efficiency: percentage of tokens from cache reads
|
|
105
|
+
const cacheEfficiency = totalTokens === 0
|
|
106
|
+
? 0
|
|
107
|
+
: Math.round((this.totalCacheReadTokens / totalTokens) * 10000) / 100;
|
|
108
|
+
return {
|
|
109
|
+
total_input_tokens: this.totalInputTokens,
|
|
110
|
+
total_output_tokens: this.totalOutputTokens,
|
|
111
|
+
total_cache_creation_tokens: this.totalCacheCreationTokens,
|
|
112
|
+
total_cache_read_tokens: this.totalCacheReadTokens,
|
|
113
|
+
total_tokens: totalTokens,
|
|
114
|
+
cache_efficiency_percent: cacheEfficiency,
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Get per-model token usage statistics.
|
|
119
|
+
*/
|
|
120
|
+
getModelStats() {
|
|
121
|
+
const result = {};
|
|
122
|
+
for (const [modelName, stats] of this.modelStats.entries()) {
|
|
123
|
+
const total = stats.input_tokens +
|
|
124
|
+
stats.output_tokens +
|
|
125
|
+
stats.cache_creation_tokens +
|
|
126
|
+
stats.cache_read_tokens;
|
|
127
|
+
result[modelName] = {
|
|
128
|
+
...stats,
|
|
129
|
+
total_tokens: total,
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
return result;
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
//# sourceMappingURL=token-usage-aggregator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"token-usage-aggregator.js","sourceRoot":"","sources":["../src/token-usage-aggregator.ts"],"names":[],"mappings":"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"}
|