@agentlensai/server 0.13.0 → 0.14.0
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/app.d.ts +27 -0
- package/dist/app.d.ts.map +1 -0
- package/dist/app.js +178 -0
- package/dist/app.js.map +1 -0
- package/dist/config.d.ts +2 -6
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +13 -10
- package/dist/config.js.map +1 -1
- package/dist/health.d.ts +22 -0
- package/dist/health.d.ts.map +1 -0
- package/dist/health.js +34 -0
- package/dist/health.js.map +1 -0
- package/dist/index.d.ts +17 -31
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +28 -502
- package/dist/index.js.map +1 -1
- package/dist/lib/api-schema.d.ts +126 -0
- package/dist/lib/api-schema.d.ts.map +1 -0
- package/dist/lib/api-schema.js +69 -0
- package/dist/lib/api-schema.js.map +1 -0
- package/dist/lib/api-version.d.ts +21 -0
- package/dist/lib/api-version.d.ts.map +1 -0
- package/dist/lib/api-version.js +36 -0
- package/dist/lib/api-version.js.map +1 -0
- package/dist/lib/lore-client.d.ts +64 -112
- package/dist/lib/lore-client.d.ts.map +1 -1
- package/dist/lib/lore-client.js +120 -155
- package/dist/lib/lore-client.js.map +1 -1
- package/dist/routes/agents.d.ts.map +1 -1
- package/dist/routes/agents.js +73 -0
- package/dist/routes/agents.js.map +1 -1
- package/dist/routes/alerts.d.ts.map +1 -1
- package/dist/routes/alerts.js +13 -36
- package/dist/routes/alerts.js.map +1 -1
- package/dist/routes/analytics.d.ts.map +1 -1
- package/dist/routes/analytics.js +93 -0
- package/dist/routes/analytics.js.map +1 -1
- package/dist/routes/api-version.d.ts +9 -0
- package/dist/routes/api-version.d.ts.map +1 -0
- package/dist/routes/api-version.js +19 -0
- package/dist/routes/api-version.js.map +1 -0
- package/dist/routes/audit-verify.d.ts +3 -2
- package/dist/routes/audit-verify.d.ts.map +1 -1
- package/dist/routes/audit-verify.js +91 -27
- package/dist/routes/audit-verify.js.map +1 -1
- package/dist/routes/cost-budgets.d.ts.map +1 -1
- package/dist/routes/cost-budgets.js +19 -36
- package/dist/routes/cost-budgets.js.map +1 -1
- package/dist/routes/guardrails.d.ts.map +1 -1
- package/dist/routes/guardrails.js +121 -37
- package/dist/routes/guardrails.js.map +1 -1
- package/dist/routes/helpers.d.ts +27 -0
- package/dist/routes/helpers.d.ts.map +1 -0
- package/dist/routes/helpers.js +46 -0
- package/dist/routes/helpers.js.map +1 -0
- package/dist/routes/lore-proxy.d.ts +8 -6
- package/dist/routes/lore-proxy.d.ts.map +1 -1
- package/dist/routes/lore-proxy.js +39 -193
- package/dist/routes/lore-proxy.js.map +1 -1
- package/dist/routes/mcp-policies.d.ts +40 -0
- package/dist/routes/mcp-policies.d.ts.map +1 -0
- package/dist/routes/mcp-policies.js +200 -0
- package/dist/routes/mcp-policies.js.map +1 -0
- package/dist/routes/optimization-advisor.d.ts +13 -0
- package/dist/routes/optimization-advisor.d.ts.map +1 -0
- package/dist/routes/optimization-advisor.js +42 -0
- package/dist/routes/optimization-advisor.js.map +1 -0
- package/dist/routes/recall.d.ts.map +1 -1
- package/dist/routes/recall.js +7 -3
- package/dist/routes/recall.js.map +1 -1
- package/dist/routes/registration.d.ts +27 -0
- package/dist/routes/registration.d.ts.map +1 -0
- package/dist/routes/registration.js +311 -0
- package/dist/routes/registration.js.map +1 -0
- package/dist/routes/replay.d.ts.map +1 -1
- package/dist/routes/replay.js +51 -0
- package/dist/routes/replay.js.map +1 -1
- package/dist/services/optimization-advisor.d.ts +37 -0
- package/dist/services/optimization-advisor.d.ts.map +1 -0
- package/dist/services/optimization-advisor.js +239 -0
- package/dist/services/optimization-advisor.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,239 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Autonomous Optimization Advisor (Feature 10)
|
|
3
|
+
*
|
|
4
|
+
* Analyzes recent sessions for a given agent and produces actionable
|
|
5
|
+
* optimization suggestions across three dimensions:
|
|
6
|
+
*
|
|
7
|
+
* 1. Model downgrade opportunities — expensive model used for simple tasks
|
|
8
|
+
* 2. Prompt optimization — repeated patterns that could be cached
|
|
9
|
+
* 3. Tool usage improvements — unused tools, redundant tool calls
|
|
10
|
+
*/
|
|
11
|
+
import { lookupModelCost, DEFAULT_MODEL_COSTS } from '@agentlensai/core';
|
|
12
|
+
import { classifyCallComplexity } from '../lib/optimization/classifier.js';
|
|
13
|
+
// ─── Constants ────────────────────────────────────────
|
|
14
|
+
const ANALYSIS_PERIOD_DAYS = 14;
|
|
15
|
+
const MAX_EVENTS = 5_000;
|
|
16
|
+
const SIMPLE_TIER_EXPENSIVE_MODELS = [
|
|
17
|
+
'claude-opus-4-6', 'claude-opus-4', 'gpt-4o', 'gpt-4.1',
|
|
18
|
+
];
|
|
19
|
+
const SYSTEM_PROMPT_TOKEN_THRESHOLD = 4000;
|
|
20
|
+
const TOOL_REDUNDANCY_THRESHOLD = 0.5; // >50% consecutive duplicate tool calls
|
|
21
|
+
// ─── Service ──────────────────────────────────────────
|
|
22
|
+
/**
|
|
23
|
+
* Analyze recent sessions for a given agent and return optimization suggestions.
|
|
24
|
+
*/
|
|
25
|
+
export async function getOptimizationSuggestions(store, agentId) {
|
|
26
|
+
const now = new Date();
|
|
27
|
+
const from = new Date(now.getTime() - ANALYSIS_PERIOD_DAYS * 24 * 60 * 60 * 1000).toISOString();
|
|
28
|
+
const to = now.toISOString();
|
|
29
|
+
// Fetch events
|
|
30
|
+
const [callResult, responseResult, toolResult] = await Promise.all([
|
|
31
|
+
store.queryEvents({ eventType: 'llm_call', agentId, from, to, limit: MAX_EVENTS, order: 'asc' }),
|
|
32
|
+
store.queryEvents({ eventType: 'llm_response', agentId, from, to, limit: MAX_EVENTS, order: 'asc' }),
|
|
33
|
+
store.queryEvents({ eventType: 'tool_call', agentId, from, to, limit: MAX_EVENTS, order: 'asc' }),
|
|
34
|
+
]);
|
|
35
|
+
const callEvents = callResult.events;
|
|
36
|
+
const responseEvents = responseResult.events;
|
|
37
|
+
const toolEvents = toolResult.events;
|
|
38
|
+
// Build response lookup
|
|
39
|
+
const responseMap = new Map();
|
|
40
|
+
for (const evt of responseEvents) {
|
|
41
|
+
const payload = evt.payload;
|
|
42
|
+
if (payload.callId) {
|
|
43
|
+
responseMap.set(payload.callId, evt);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
// Count unique sessions
|
|
47
|
+
const sessionIds = new Set();
|
|
48
|
+
for (const evt of callEvents) {
|
|
49
|
+
if (evt.sessionId)
|
|
50
|
+
sessionIds.add(evt.sessionId);
|
|
51
|
+
}
|
|
52
|
+
for (const evt of toolEvents) {
|
|
53
|
+
if (evt.sessionId)
|
|
54
|
+
sessionIds.add(evt.sessionId);
|
|
55
|
+
}
|
|
56
|
+
const suggestions = [];
|
|
57
|
+
// ── 1. Model downgrade opportunities ──────────────────
|
|
58
|
+
analyzeModelDowngrades(callEvents, responseMap, suggestions);
|
|
59
|
+
// ── 2. Prompt optimization ────────────────────────────
|
|
60
|
+
analyzePromptOptimization(callEvents, responseMap, suggestions);
|
|
61
|
+
// ── 3. Tool usage improvements ────────────────────────
|
|
62
|
+
analyzeToolUsage(toolEvents, suggestions);
|
|
63
|
+
const totalEstimatedSavings = suggestions.reduce((sum, s) => sum + s.estimatedSavings, 0);
|
|
64
|
+
return {
|
|
65
|
+
agentId,
|
|
66
|
+
suggestions,
|
|
67
|
+
analyzedSessions: sessionIds.size,
|
|
68
|
+
totalEstimatedSavings: Math.round(totalEstimatedSavings * 1_000_000) / 1_000_000,
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Aggregate suggestions across all agents.
|
|
73
|
+
*/
|
|
74
|
+
export async function getOptimizationSummary(store) {
|
|
75
|
+
const now = new Date();
|
|
76
|
+
const from = new Date(now.getTime() - ANALYSIS_PERIOD_DAYS * 24 * 60 * 60 * 1000).toISOString();
|
|
77
|
+
const to = now.toISOString();
|
|
78
|
+
// Get all recent agent IDs
|
|
79
|
+
const callResult = await store.queryEvents({
|
|
80
|
+
eventType: 'llm_call',
|
|
81
|
+
from,
|
|
82
|
+
to,
|
|
83
|
+
limit: MAX_EVENTS,
|
|
84
|
+
order: 'asc',
|
|
85
|
+
});
|
|
86
|
+
const agentIds = new Set();
|
|
87
|
+
for (const evt of callResult.events) {
|
|
88
|
+
if (evt.agentId)
|
|
89
|
+
agentIds.add(evt.agentId);
|
|
90
|
+
}
|
|
91
|
+
const agents = [];
|
|
92
|
+
for (const agentId of agentIds) {
|
|
93
|
+
const result = await getOptimizationSuggestions(store, agentId);
|
|
94
|
+
if (result.suggestions.length > 0) {
|
|
95
|
+
agents.push(result);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
const totalEstimatedSavings = agents.reduce((sum, a) => sum + a.totalEstimatedSavings, 0);
|
|
99
|
+
return {
|
|
100
|
+
agents,
|
|
101
|
+
totalEstimatedSavings: Math.round(totalEstimatedSavings * 1_000_000) / 1_000_000,
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
// ─── Internal Analyzers ──────────────────────────────
|
|
105
|
+
function analyzeModelDowngrades(callEvents, responseMap, suggestions) {
|
|
106
|
+
// Count expensive model usage at simple/moderate tiers
|
|
107
|
+
const modelTierCounts = new Map();
|
|
108
|
+
for (const callEvent of callEvents) {
|
|
109
|
+
const callPayload = callEvent.payload;
|
|
110
|
+
const model = callPayload.model;
|
|
111
|
+
if (!model)
|
|
112
|
+
continue;
|
|
113
|
+
const responseEvent = callPayload.callId ? responseMap.get(callPayload.callId) : undefined;
|
|
114
|
+
if (!responseEvent)
|
|
115
|
+
continue;
|
|
116
|
+
const { tier } = classifyCallComplexity(callEvent, responseEvent);
|
|
117
|
+
if ((tier === 'simple' || tier === 'moderate') && SIMPLE_TIER_EXPENSIVE_MODELS.includes(model)) {
|
|
118
|
+
const key = `${model}::${tier}`;
|
|
119
|
+
const existing = modelTierCounts.get(key) ?? { count: 0, totalCost: 0 };
|
|
120
|
+
const respPayload = responseEvent.payload;
|
|
121
|
+
existing.count++;
|
|
122
|
+
existing.totalCost += respPayload.costUsd ?? 0;
|
|
123
|
+
modelTierCounts.set(key, existing);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
for (const [key, stats] of modelTierCounts) {
|
|
127
|
+
if (stats.count < 5)
|
|
128
|
+
continue;
|
|
129
|
+
const [model, tier] = key.split('::');
|
|
130
|
+
const estimatedSavings = stats.totalCost * 0.6; // ~60% savings from downgrade
|
|
131
|
+
suggestions.push({
|
|
132
|
+
type: 'model_downgrade',
|
|
133
|
+
description: `${model} used ${stats.count} times for ${tier} tasks. Consider a cheaper model (e.g., sonnet/haiku) for these calls.`,
|
|
134
|
+
estimatedSavings: Math.round(estimatedSavings * 1_000_000) / 1_000_000,
|
|
135
|
+
confidence: stats.count > 50 ? 'high' : stats.count > 20 ? 'medium' : 'low',
|
|
136
|
+
metadata: { model, tier, callCount: stats.count, currentCost: stats.totalCost },
|
|
137
|
+
});
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
function analyzePromptOptimization(callEvents, responseMap, suggestions) {
|
|
141
|
+
// Detect oversized system prompts
|
|
142
|
+
const largeSystemPrompts = new Map();
|
|
143
|
+
for (const callEvent of callEvents) {
|
|
144
|
+
const callPayload = callEvent.payload;
|
|
145
|
+
const model = callPayload.model ?? 'unknown';
|
|
146
|
+
const messages = callPayload.messages;
|
|
147
|
+
if (!messages)
|
|
148
|
+
continue;
|
|
149
|
+
const systemMsg = messages.find((m) => m.role === 'system');
|
|
150
|
+
if (!systemMsg?.content)
|
|
151
|
+
continue;
|
|
152
|
+
// Rough token estimation: chars / 4
|
|
153
|
+
const estimatedTokens = Math.ceil(systemMsg.content.length / 4);
|
|
154
|
+
if (estimatedTokens > SYSTEM_PROMPT_TOKEN_THRESHOLD) {
|
|
155
|
+
const existing = largeSystemPrompts.get(model) ?? { count: 0, avgTokens: 0, totalInputCost: 0 };
|
|
156
|
+
existing.avgTokens = (existing.avgTokens * existing.count + estimatedTokens) / (existing.count + 1);
|
|
157
|
+
existing.count++;
|
|
158
|
+
// Estimate input cost for these tokens
|
|
159
|
+
const costInfo = lookupModelCost(model, DEFAULT_MODEL_COSTS);
|
|
160
|
+
if (costInfo) {
|
|
161
|
+
existing.totalInputCost += (estimatedTokens / 1_000_000) * costInfo.input;
|
|
162
|
+
}
|
|
163
|
+
largeSystemPrompts.set(model, existing);
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
for (const [model, stats] of largeSystemPrompts) {
|
|
167
|
+
if (stats.count < 3)
|
|
168
|
+
continue;
|
|
169
|
+
// Caching could save ~80% of repeated system prompt costs
|
|
170
|
+
const estimatedSavings = stats.totalInputCost * 0.8;
|
|
171
|
+
suggestions.push({
|
|
172
|
+
type: 'prompt_optimization',
|
|
173
|
+
description: `${stats.count} calls to ${model} have system prompts averaging ${Math.round(stats.avgTokens)} tokens. Consider prompt caching or shortening the system prompt.`,
|
|
174
|
+
estimatedSavings: Math.round(estimatedSavings * 1_000_000) / 1_000_000,
|
|
175
|
+
confidence: stats.count > 20 ? 'high' : 'medium',
|
|
176
|
+
metadata: { model, callCount: stats.count, avgSystemTokens: Math.round(stats.avgTokens) },
|
|
177
|
+
});
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
function analyzeToolUsage(toolEvents, suggestions) {
|
|
181
|
+
if (toolEvents.length < 5)
|
|
182
|
+
return;
|
|
183
|
+
// Group tool calls by session to find redundant consecutive calls
|
|
184
|
+
const sessionTools = new Map();
|
|
185
|
+
for (const evt of toolEvents) {
|
|
186
|
+
const sessionId = evt.sessionId ?? '';
|
|
187
|
+
const toolName = evt.payload?.toolName ?? evt.payload?.name ?? 'unknown';
|
|
188
|
+
const list = sessionTools.get(sessionId) ?? [];
|
|
189
|
+
list.push({ tool: toolName, timestamp: evt.timestamp });
|
|
190
|
+
sessionTools.set(sessionId, list);
|
|
191
|
+
}
|
|
192
|
+
// Detect consecutive duplicate tool calls across sessions
|
|
193
|
+
let totalCalls = 0;
|
|
194
|
+
let redundantCalls = 0;
|
|
195
|
+
const redundantTools = new Map();
|
|
196
|
+
for (const [, calls] of sessionTools) {
|
|
197
|
+
for (let i = 1; i < calls.length; i++) {
|
|
198
|
+
totalCalls++;
|
|
199
|
+
if (calls[i].tool === calls[i - 1].tool) {
|
|
200
|
+
redundantCalls++;
|
|
201
|
+
redundantTools.set(calls[i].tool, (redundantTools.get(calls[i].tool) ?? 0) + 1);
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
if (totalCalls > 0 && redundantCalls / totalCalls > TOOL_REDUNDANCY_THRESHOLD) {
|
|
206
|
+
const topRedundant = [...redundantTools.entries()]
|
|
207
|
+
.sort((a, b) => b[1] - a[1])
|
|
208
|
+
.slice(0, 3)
|
|
209
|
+
.map(([tool, count]) => `${tool} (${count}x)`);
|
|
210
|
+
suggestions.push({
|
|
211
|
+
type: 'tool_usage',
|
|
212
|
+
description: `${Math.round((redundantCalls / totalCalls) * 100)}% of consecutive tool calls are duplicates. Top: ${topRedundant.join(', ')}. Consider deduplication or caching.`,
|
|
213
|
+
estimatedSavings: 0, // Tool call cost is indirect
|
|
214
|
+
confidence: totalCalls > 100 ? 'high' : 'medium',
|
|
215
|
+
metadata: { totalCalls, redundantCalls, redundantRatio: redundantCalls / totalCalls },
|
|
216
|
+
});
|
|
217
|
+
}
|
|
218
|
+
// Detect tools that are declared but never called (if metadata available)
|
|
219
|
+
// This is a lightweight heuristic: if a tool appears < 1% of the time, flag it
|
|
220
|
+
const toolFrequency = new Map();
|
|
221
|
+
for (const evt of toolEvents) {
|
|
222
|
+
const toolName = evt.payload?.toolName ?? evt.payload?.name ?? 'unknown';
|
|
223
|
+
toolFrequency.set(toolName, (toolFrequency.get(toolName) ?? 0) + 1);
|
|
224
|
+
}
|
|
225
|
+
const totalToolCalls = toolEvents.length;
|
|
226
|
+
const rareTools = [...toolFrequency.entries()]
|
|
227
|
+
.filter(([, count]) => count / totalToolCalls < 0.01 && totalToolCalls > 50)
|
|
228
|
+
.map(([tool]) => tool);
|
|
229
|
+
if (rareTools.length > 0) {
|
|
230
|
+
suggestions.push({
|
|
231
|
+
type: 'tool_usage',
|
|
232
|
+
description: `Rarely used tools detected: ${rareTools.join(', ')}. Consider removing them from the tool list to reduce prompt size and model confusion.`,
|
|
233
|
+
estimatedSavings: 0,
|
|
234
|
+
confidence: 'low',
|
|
235
|
+
metadata: { rareTools, totalToolCalls },
|
|
236
|
+
});
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
//# sourceMappingURL=optimization-advisor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"optimization-advisor.js","sourceRoot":"","sources":["../../src/services/optimization-advisor.ts"],"names":[],"mappings":"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"}
|