snow-flow 2.0.2 → 2.0.3
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/{.claude/mcp-config.json → .mcp.json} +13 -12
- package/.releaserc.json +47 -0
- package/README.md +6 -0
- package/package.json +1 -1
- package/.claude/claude-settings.json +0 -15
- package/.claude/commands/analysis/README.md +0 -9
- package/.claude/commands/automation/README.md +0 -9
- package/.claude/commands/github/README.md +0 -11
- package/.claude/commands/helpers/standard-checkpoint-hooks.sh +0 -179
- package/.claude/commands/hooks/README.md +0 -11
- package/.claude/commands/monitoring/README.md +0 -9
- package/.claude/commands/optimization/README.md +0 -9
- package/.claude/commands/training/README.md +0 -9
- package/.claude/commands/workflows/README.md +0 -9
- package/.claude/config.json +0 -36
- package/.claude/helpers/github-setup.sh +0 -28
- package/.claude/helpers/quick-start.sh +0 -19
- package/.claude/helpers/setup-mcp.sh +0 -18
- package/.claude/settings.json +0 -114
- package/.claude/settings.local.json +0 -33
- package/.claude-flow/metrics/agent-metrics.json +0 -1
- package/.claude-flow/metrics/performance.json +0 -9
- package/.claude-flow/metrics/system-metrics.json +0 -15986
- package/.claude-flow/metrics/task-metrics.json +0 -10
- package/.roo/README.md +0 -402
- package/.roo/mcp-list.txt +0 -257
- package/.roo/mcp.json +0 -32
- package/.roo/workflows/basic-tdd.json +0 -32
- package/.roomodes +0 -201
- package/CLAUDE.md +0 -393
- package/bin/snow-flow.js +0 -3
- package/dist/cli.js.bak +0 -2052
- package/dist/config/snow-flow-config.d.ts +0 -1492
- package/dist/config/snow-flow-config.js +0 -938
- package/scripts/create-env.js +0 -91
- package/scripts/postinstall.js +0 -30
- package/scripts/register-mcp-servers.js +0 -210
- package/scripts/reset-mcp-servers.js +0 -246
- package/scripts/setup-mcp.js +0 -106
- package/scripts/update-version.js +0 -31
- package/src/agents/README.md +0 -192
- package/src/agents/base-agent.ts +0 -251
- package/src/agents/coordinator.ts +0 -971
- package/src/agents/index.ts +0 -18
- package/src/agents/queen-403-handler.ts +0 -230
- package/src/agents/queen-agent.ts +0 -1399
- package/src/agents/script-writer-agent.ts +0 -769
- package/src/agents/security-agent.ts +0 -726
- package/src/agents/widget-creator-agent.ts +0 -568
- package/src/api/error-handling.ts +0 -1758
- package/src/api/natural-language-mapper.ts +0 -630
- package/src/api/performance-optimizer.ts +0 -891
- package/src/api/transaction-manager.ts +0 -754
- package/src/cli/deploy-artifact.ts +0 -304
- package/src/cli/snow-flow-cli-integration.ts +0 -434
- package/src/cli.ts +0 -4455
- package/src/cli.ts.bak +0 -5616
- package/src/compliance/advanced-compliance-system.ts +0 -1268
- package/src/compliance/index.ts +0 -19
- package/src/config/snow-flow-config.ts +0 -1019
- package/src/documentation/index.ts +0 -16
- package/src/documentation/self-documenting-system.ts +0 -1421
- package/src/dynamic-version.ts +0 -44
- package/src/healing/index.ts +0 -20
- package/src/healing/self-healing-system.ts +0 -1435
- package/src/health/README.md +0 -161
- package/src/health/system-health.ts +0 -995
- package/src/index.ts +0 -60
- package/src/intelligence/acl-analyzer.ts +0 -377
- package/src/intelligence/auto-resolution-engine.ts +0 -643
- package/src/intelligence/gap-analysis-engine.ts +0 -488
- package/src/intelligence/manual-instructions-generator.ts +0 -744
- package/src/intelligence/mcp-coverage-analyzer.ts +0 -708
- package/src/intelligence/multi-pass-requirements-analyzer.ts +0 -603
- package/src/intelligence/performance-recommendations-engine.ts +0 -1223
- package/src/intelligence/requirements-analyzer.ts +0 -1148
- package/src/intelligence/task-analyzer.ts +0 -628
- package/src/managers/scope-manager.ts +0 -555
- package/src/mcp/advanced/servicenow-advanced-features-mcp.ts +0 -16110
- package/src/mcp/base-mcp-server.ts +0 -660
- package/src/mcp/http-transport-wrapper.ts +0 -426
- package/src/mcp/service-discovery-client.ts +0 -312
- package/src/mcp/servicenow-automation-mcp-refactored.ts +0 -678
- package/src/mcp/servicenow-automation-mcp.ts +0 -838
- package/src/mcp/servicenow-deployment-mcp-refactored.ts +0 -1292
- package/src/mcp/servicenow-deployment-mcp.ts +0 -7244
- package/src/mcp/servicenow-graph-memory-mcp-refactored.ts +0 -721
- package/src/mcp/servicenow-graph-memory-mcp.ts +0 -832
- package/src/mcp/servicenow-integration-mcp-refactored.ts +0 -655
- package/src/mcp/servicenow-integration-mcp.ts +0 -819
- package/src/mcp/servicenow-intelligent-mcp-refactored.ts +0 -977
- package/src/mcp/servicenow-intelligent-mcp.ts +0 -4638
- package/src/mcp/servicenow-mcp-server.ts +0 -728
- package/src/mcp/servicenow-memory-mcp.ts +0 -474
- package/src/mcp/servicenow-operations-mcp-refactored.ts +0 -1995
- package/src/mcp/servicenow-operations-mcp.ts +0 -3384
- package/src/mcp/servicenow-platform-development-mcp-refactored.ts +0 -611
- package/src/mcp/servicenow-platform-development-mcp.ts +0 -970
- package/src/mcp/servicenow-progressive-indexer.ts +0 -370
- package/src/mcp/servicenow-reporting-analytics-mcp-refactored.ts +0 -695
- package/src/mcp/servicenow-reporting-analytics-mcp.ts +0 -1123
- package/src/mcp/servicenow-security-compliance-mcp-refactored.ts +0 -642
- package/src/mcp/servicenow-security-compliance-mcp.ts +0 -1157
- package/src/mcp/servicenow-update-set-mcp-refactored.ts +0 -751
- package/src/mcp/servicenow-update-set-mcp.ts +0 -811
- package/src/mcp/shared/agent-context-provider.ts +0 -365
- package/src/mcp/shared/base-mcp-server.ts +0 -2463
- package/src/mcp/shared/mcp-memory-manager.ts +0 -540
- package/src/mcp/shared/mcp-resource-manager.ts +0 -367
- package/src/mcp/snow-flow-mcp.ts +0 -911
- package/src/mcp/start-all-mcp-servers.ts +0 -102
- package/src/mcp/start-servicenow-mcp.ts +0 -67
- package/src/monitoring/enhanced-monitoring-system.ts +0 -1345
- package/src/monitoring/performance-tracker.ts +0 -777
- package/src/optimization/cost-optimization-engine.ts +0 -1125
- package/src/optimization/index.ts +0 -10
- package/src/queen/README.md +0 -403
- package/src/queen/agent-factory.ts +0 -574
- package/src/queen/index.ts +0 -94
- package/src/queen/mcp-execution-bridge.ts +0 -681
- package/src/queen/neural-learning.ts +0 -319
- package/src/queen/parallel-agent-engine.ts +0 -848
- package/src/queen/queen-memory-system.ts +0 -490
- package/src/queen/queen-memory.ts +0 -456
- package/src/queen/servicenow-queen.ts +0 -1029
- package/src/queen/types.ts +0 -87
- package/src/rollback/smart-rollback-system.ts +0 -866
- package/src/schemas/deployment.schema.json +0 -58
- package/src/schemas/flow.schema.json +0 -79
- package/src/schemas/widget.schema.json +0 -72
- package/src/snow-flow-system.ts +0 -541
- package/src/sparc/sparc-help.ts +0 -49
- package/src/sparc/team-sparc.ts +0 -88
- package/src/strategies/global-scope-strategy.ts +0 -736
- package/src/templates/base/application.template.json +0 -45
- package/src/templates/base/business_rule.template.json +0 -33
- package/src/templates/base/script_include.template.json +0 -18
- package/src/templates/base/table.template.json +0 -64
- package/src/templates/base/widget.template.json +0 -25
- package/src/templates/patterns/composite.incident-management.template.json +0 -140
- package/src/templates/patterns/widget.dashboard.template.json +0 -238
- package/src/templates/patterns/widget.datatable.template.json +0 -292
- package/src/testing/integration-test-suite.ts +0 -1276
- package/src/types/index.ts +0 -183
- package/src/types/neo4j-driver.d.ts +0 -23
- package/src/types/servicenow.types.ts +0 -307
- package/src/types/snow-flow.types.ts +0 -186
- package/src/types/todo.types.ts +0 -70
- package/src/utils/action-type-cache.ts +0 -286
- package/src/utils/agent-detector.ts +0 -573
- package/src/utils/artifact-tracker.ts +0 -379
- package/src/utils/dependency-detector.ts +0 -233
- package/src/utils/deployment-metadata-handler.ts +0 -518
- package/src/utils/error-recovery.ts +0 -680
- package/src/utils/logger.ts +0 -60
- package/src/utils/mcp-auth-middleware.ts +0 -262
- package/src/utils/mcp-config-manager.ts +0 -270
- package/src/utils/mcp-server-manager.ts +0 -446
- package/src/utils/mcp-tool-registry.ts +0 -298
- package/src/utils/migrate-snow-flow.ts +0 -98
- package/src/utils/oauth-html-templates.ts +0 -188
- package/src/utils/scope-utils.ts +0 -443
- package/src/utils/servicenow-client.ts +0 -3321
- package/src/utils/servicenow-id-generator.ts +0 -181
- package/src/utils/snow-memory-manager.ts +0 -605
- package/src/utils/snow-oauth.ts +0 -797
- package/src/utils/template-engine.ts +0 -463
- package/src/utils/theme-manager.ts +0 -295
- package/src/utils/unified-auth-store.ts +0 -222
- package/src/utils/update-set-importer.ts +0 -422
- package/src/utils/update-set-xml-packager.ts +0 -371
- package/src/utils/widget-template-generator.ts +0 -1744
- package/src/version.ts +0 -1950
|
@@ -1,1125 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* 💰 Cost Optimization Engine for AI-Driven Cost Management
|
|
3
|
-
*
|
|
4
|
-
* Revolutionary autonomous system that monitors, analyzes, and optimizes
|
|
5
|
-
* AI usage costs in real-time, implementing cost-saving strategies
|
|
6
|
-
* without manual intervention.
|
|
7
|
-
*/
|
|
8
|
-
|
|
9
|
-
import { Logger } from '../utils/logger.js';
|
|
10
|
-
import { ServiceNowClient } from '../utils/servicenow-client.js';
|
|
11
|
-
import { MemorySystem } from '../memory/memory-system.js';
|
|
12
|
-
|
|
13
|
-
export interface CostProfile {
|
|
14
|
-
id: string;
|
|
15
|
-
period: string;
|
|
16
|
-
startDate: string;
|
|
17
|
-
endDate: string;
|
|
18
|
-
totalCost: number;
|
|
19
|
-
breakdown: CostBreakdown;
|
|
20
|
-
trends: CostTrend[];
|
|
21
|
-
optimizations: CostOptimization[];
|
|
22
|
-
forecast: CostForecast;
|
|
23
|
-
savings: SavingsReport;
|
|
24
|
-
alerts: CostAlert[];
|
|
25
|
-
metadata: CostMetadata;
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
export interface CostBreakdown {
|
|
29
|
-
byService: ServiceCost[];
|
|
30
|
-
byOperation: OperationCost[];
|
|
31
|
-
byAgent: AgentCost[];
|
|
32
|
-
byTimeframe: TimeframeCost[];
|
|
33
|
-
byModel: ModelCost[];
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
export interface ServiceCost {
|
|
37
|
-
service: string;
|
|
38
|
-
cost: number;
|
|
39
|
-
usage: {
|
|
40
|
-
requests: number;
|
|
41
|
-
tokens: number;
|
|
42
|
-
computeTime: number;
|
|
43
|
-
};
|
|
44
|
-
percentageOfTotal: number;
|
|
45
|
-
trend: 'increasing' | 'stable' | 'decreasing';
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
export interface OperationCost {
|
|
49
|
-
operation: string;
|
|
50
|
-
cost: number;
|
|
51
|
-
frequency: number;
|
|
52
|
-
averageCostPerOperation: number;
|
|
53
|
-
optimization: string;
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
export interface AgentCost {
|
|
57
|
-
agentId: string;
|
|
58
|
-
agentType: string;
|
|
59
|
-
cost: number;
|
|
60
|
-
efficiency: number; // cost per successful operation
|
|
61
|
-
recommendations: string[];
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
export interface TimeframeCost {
|
|
65
|
-
timeframe: string;
|
|
66
|
-
cost: number;
|
|
67
|
-
peakHours: string[];
|
|
68
|
-
lowUsageHours: string[];
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
export interface ModelCost {
|
|
72
|
-
model: string;
|
|
73
|
-
cost: number;
|
|
74
|
-
tokens: number;
|
|
75
|
-
requests: number;
|
|
76
|
-
costPerToken: number;
|
|
77
|
-
alternativeModels: ModelAlternative[];
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
export interface ModelAlternative {
|
|
81
|
-
model: string;
|
|
82
|
-
potentialSavings: number;
|
|
83
|
-
performanceImpact: 'minimal' | 'moderate' | 'significant';
|
|
84
|
-
recommendation: string;
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
export interface CostTrend {
|
|
88
|
-
date: string;
|
|
89
|
-
cost: number;
|
|
90
|
-
change: number;
|
|
91
|
-
changePercentage: number;
|
|
92
|
-
anomaly: boolean;
|
|
93
|
-
reason?: string;
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
export interface CostOptimization {
|
|
97
|
-
id: string;
|
|
98
|
-
type: 'model_switching' | 'caching' | 'batching' | 'scheduling' | 'token_reduction' | 'service_consolidation';
|
|
99
|
-
title: string;
|
|
100
|
-
description: string;
|
|
101
|
-
potentialSavings: number;
|
|
102
|
-
implementation: OptimizationImplementation;
|
|
103
|
-
impact: OptimizationImpact;
|
|
104
|
-
status: 'suggested' | 'testing' | 'implemented' | 'rejected';
|
|
105
|
-
automationLevel: 'full' | 'semi' | 'manual';
|
|
106
|
-
}
|
|
107
|
-
|
|
108
|
-
export interface OptimizationImplementation {
|
|
109
|
-
steps: ImplementationStep[];
|
|
110
|
-
estimatedTime: number;
|
|
111
|
-
requirements: string[];
|
|
112
|
-
risks: string[];
|
|
113
|
-
rollbackPlan: string;
|
|
114
|
-
}
|
|
115
|
-
|
|
116
|
-
export interface ImplementationStep {
|
|
117
|
-
order: number;
|
|
118
|
-
action: string;
|
|
119
|
-
automated: boolean;
|
|
120
|
-
script?: string;
|
|
121
|
-
validation: string;
|
|
122
|
-
}
|
|
123
|
-
|
|
124
|
-
export interface OptimizationImpact {
|
|
125
|
-
costReduction: number;
|
|
126
|
-
performanceChange: number;
|
|
127
|
-
reliabilityChange: number;
|
|
128
|
-
userExperience: 'improved' | 'unchanged' | 'degraded';
|
|
129
|
-
confidence: number; // 0-1
|
|
130
|
-
}
|
|
131
|
-
|
|
132
|
-
export interface CostForecast {
|
|
133
|
-
period: string;
|
|
134
|
-
predictedCost: number;
|
|
135
|
-
confidenceInterval: {
|
|
136
|
-
low: number;
|
|
137
|
-
high: number;
|
|
138
|
-
};
|
|
139
|
-
assumptions: string[];
|
|
140
|
-
risks: ForecastRisk[];
|
|
141
|
-
recommendations: string[];
|
|
142
|
-
}
|
|
143
|
-
|
|
144
|
-
export interface ForecastRisk {
|
|
145
|
-
risk: string;
|
|
146
|
-
probability: 'low' | 'medium' | 'high';
|
|
147
|
-
impact: number;
|
|
148
|
-
mitigation: string;
|
|
149
|
-
}
|
|
150
|
-
|
|
151
|
-
export interface SavingsReport {
|
|
152
|
-
totalSaved: number;
|
|
153
|
-
savingsByOptimization: SavingsByType[];
|
|
154
|
-
comparisonToPrevious: number;
|
|
155
|
-
projectedAnnualSavings: number;
|
|
156
|
-
implementedOptimizations: number;
|
|
157
|
-
}
|
|
158
|
-
|
|
159
|
-
export interface SavingsByType {
|
|
160
|
-
type: string;
|
|
161
|
-
amount: number;
|
|
162
|
-
percentage: number;
|
|
163
|
-
examples: string[];
|
|
164
|
-
}
|
|
165
|
-
|
|
166
|
-
export interface CostAlert {
|
|
167
|
-
id: string;
|
|
168
|
-
type: 'threshold' | 'anomaly' | 'trend' | 'forecast';
|
|
169
|
-
severity: 'info' | 'warning' | 'critical';
|
|
170
|
-
message: string;
|
|
171
|
-
timestamp: string;
|
|
172
|
-
value: number;
|
|
173
|
-
threshold?: number;
|
|
174
|
-
action: string;
|
|
175
|
-
autoResolved: boolean;
|
|
176
|
-
}
|
|
177
|
-
|
|
178
|
-
export interface CostMetadata {
|
|
179
|
-
currency: string;
|
|
180
|
-
billingCycle: string;
|
|
181
|
-
lastUpdated: string;
|
|
182
|
-
dataQuality: number; // 0-100
|
|
183
|
-
coveragePercentage: number;
|
|
184
|
-
missingData: string[];
|
|
185
|
-
}
|
|
186
|
-
|
|
187
|
-
export interface CostOptimizationRequest {
|
|
188
|
-
scope: 'all' | 'service' | 'agent' | 'operation';
|
|
189
|
-
targetReduction?: number; // percentage
|
|
190
|
-
constraints?: OptimizationConstraints;
|
|
191
|
-
autoImplement?: boolean;
|
|
192
|
-
testingEnabled?: boolean;
|
|
193
|
-
}
|
|
194
|
-
|
|
195
|
-
export interface OptimizationConstraints {
|
|
196
|
-
maintainPerformance?: boolean;
|
|
197
|
-
maxPerformanceDegradation?: number;
|
|
198
|
-
preserveReliability?: boolean;
|
|
199
|
-
excludeServices?: string[];
|
|
200
|
-
priorityOperations?: string[];
|
|
201
|
-
}
|
|
202
|
-
|
|
203
|
-
export interface CostOptimizationResult {
|
|
204
|
-
success: boolean;
|
|
205
|
-
profile: CostProfile;
|
|
206
|
-
implementedOptimizations: CostOptimization[];
|
|
207
|
-
projectedSavings: number;
|
|
208
|
-
actualSavings?: number;
|
|
209
|
-
recommendations: string[];
|
|
210
|
-
nextSteps: string[];
|
|
211
|
-
}
|
|
212
|
-
|
|
213
|
-
export class CostOptimizationEngine {
|
|
214
|
-
private logger: Logger;
|
|
215
|
-
private client: ServiceNowClient;
|
|
216
|
-
private memory: MemorySystem;
|
|
217
|
-
private costProfiles: Map<string, CostProfile> = new Map();
|
|
218
|
-
private activeOptimizations: Map<string, CostOptimization> = new Map();
|
|
219
|
-
private costThresholds: Map<string, number> = new Map();
|
|
220
|
-
private monitoringEnabled: boolean = true;
|
|
221
|
-
|
|
222
|
-
// Cost factors per service/operation
|
|
223
|
-
private costModel = {
|
|
224
|
-
aiTokens: {
|
|
225
|
-
'gpt-4': 0.03, // per 1K tokens
|
|
226
|
-
'gpt-3.5-turbo': 0.002,
|
|
227
|
-
'claude-3-opus': 0.015,
|
|
228
|
-
'claude-3-sonnet': 0.003,
|
|
229
|
-
},
|
|
230
|
-
operations: {
|
|
231
|
-
flowCreation: 0.50,
|
|
232
|
-
deployment: 0.30,
|
|
233
|
-
testing: 0.20,
|
|
234
|
-
documentation: 0.15,
|
|
235
|
-
rollback: 0.25,
|
|
236
|
-
},
|
|
237
|
-
compute: {
|
|
238
|
-
perMinute: 0.05,
|
|
239
|
-
perGB: 0.10,
|
|
240
|
-
}
|
|
241
|
-
};
|
|
242
|
-
|
|
243
|
-
constructor(client: ServiceNowClient, memory: MemorySystem) {
|
|
244
|
-
this.logger = new Logger('CostOptimizationEngine');
|
|
245
|
-
this.client = client;
|
|
246
|
-
this.memory = memory;
|
|
247
|
-
|
|
248
|
-
this.initializeCostTracking();
|
|
249
|
-
this.startContinuousMonitoring();
|
|
250
|
-
}
|
|
251
|
-
|
|
252
|
-
/**
|
|
253
|
-
* Analyze costs and generate optimization recommendations
|
|
254
|
-
*/
|
|
255
|
-
async analyzeCosts(request: CostOptimizationRequest = { scope: 'all' }): Promise<CostOptimizationResult> {
|
|
256
|
-
this.logger.info('💰 Analyzing costs and generating optimizations', request);
|
|
257
|
-
|
|
258
|
-
const profileId = `cost_${Date.now()}_${Math.random().toString(36).substr(2, 8)}`;
|
|
259
|
-
const startTime = Date.now();
|
|
260
|
-
|
|
261
|
-
try {
|
|
262
|
-
// Collect cost data
|
|
263
|
-
const costData = await this.collectCostData(request);
|
|
264
|
-
|
|
265
|
-
// Analyze cost breakdown
|
|
266
|
-
const breakdown = await this.analyzeCostBreakdown(costData);
|
|
267
|
-
|
|
268
|
-
// Identify trends
|
|
269
|
-
const trends = await this.analyzeCostTrends(costData);
|
|
270
|
-
|
|
271
|
-
// Generate optimizations
|
|
272
|
-
const optimizations = await this.generateOptimizations(breakdown, trends, request);
|
|
273
|
-
|
|
274
|
-
// Create forecast
|
|
275
|
-
const forecast = await this.generateCostForecast(costData, optimizations);
|
|
276
|
-
|
|
277
|
-
// Calculate savings
|
|
278
|
-
const savings = await this.calculateSavings(optimizations);
|
|
279
|
-
|
|
280
|
-
// Generate alerts
|
|
281
|
-
const alerts = await this.generateCostAlerts(breakdown, trends, forecast);
|
|
282
|
-
|
|
283
|
-
const profile: CostProfile = {
|
|
284
|
-
id: profileId,
|
|
285
|
-
period: 'monthly',
|
|
286
|
-
startDate: new Date(Date.now() - 30 * 24 * 60 * 60 * 1000).toISOString(),
|
|
287
|
-
endDate: new Date().toISOString(),
|
|
288
|
-
totalCost: breakdown.byService.reduce((sum, s) => sum + s.cost, 0),
|
|
289
|
-
breakdown,
|
|
290
|
-
trends,
|
|
291
|
-
optimizations,
|
|
292
|
-
forecast,
|
|
293
|
-
savings,
|
|
294
|
-
alerts,
|
|
295
|
-
metadata: {
|
|
296
|
-
currency: 'USD',
|
|
297
|
-
billingCycle: 'monthly',
|
|
298
|
-
lastUpdated: new Date().toISOString(),
|
|
299
|
-
dataQuality: 95,
|
|
300
|
-
coveragePercentage: 98,
|
|
301
|
-
missingData: []
|
|
302
|
-
}
|
|
303
|
-
};
|
|
304
|
-
|
|
305
|
-
// Store profile
|
|
306
|
-
this.costProfiles.set(profileId, profile);
|
|
307
|
-
await this.memory.store(`cost_profile_${profileId}`, profile, 2592000000); // 30 days
|
|
308
|
-
|
|
309
|
-
// Auto-implement if requested
|
|
310
|
-
let implementedOptimizations: CostOptimization[] = [];
|
|
311
|
-
if (request.autoImplement) {
|
|
312
|
-
implementedOptimizations = await this.autoImplementOptimizations(
|
|
313
|
-
optimizations.filter(o => o.automationLevel === 'full'),
|
|
314
|
-
request.constraints
|
|
315
|
-
);
|
|
316
|
-
}
|
|
317
|
-
|
|
318
|
-
this.logger.info('✅ Cost _analysis completed', {
|
|
319
|
-
profileId,
|
|
320
|
-
totalCost: profile.totalCost,
|
|
321
|
-
optimizationsFound: optimizations.length,
|
|
322
|
-
potentialSavings: savings.projectedAnnualSavings,
|
|
323
|
-
alertsGenerated: alerts.length
|
|
324
|
-
});
|
|
325
|
-
|
|
326
|
-
return {
|
|
327
|
-
success: true,
|
|
328
|
-
profile,
|
|
329
|
-
implementedOptimizations,
|
|
330
|
-
projectedSavings: savings.projectedAnnualSavings,
|
|
331
|
-
recommendations: this.generateRecommendations(profile),
|
|
332
|
-
nextSteps: this.generateNextSteps(profile, implementedOptimizations)
|
|
333
|
-
};
|
|
334
|
-
|
|
335
|
-
} catch (error) {
|
|
336
|
-
this.logger.error('❌ Cost _analysis failed', error);
|
|
337
|
-
throw error;
|
|
338
|
-
}
|
|
339
|
-
}
|
|
340
|
-
|
|
341
|
-
/**
|
|
342
|
-
* Start autonomous cost monitoring and optimization
|
|
343
|
-
*/
|
|
344
|
-
async startAutonomousOptimization(options: {
|
|
345
|
-
targetSavings?: number;
|
|
346
|
-
checkInterval?: number;
|
|
347
|
-
autoImplementThreshold?: number;
|
|
348
|
-
} = {}): Promise<void> {
|
|
349
|
-
this.logger.info('🤖 Starting autonomous cost optimization', options);
|
|
350
|
-
|
|
351
|
-
const interval = options.checkInterval || 3600000; // Default: 1 hour
|
|
352
|
-
const autoThreshold = options.autoImplementThreshold || 100; // $100 savings
|
|
353
|
-
|
|
354
|
-
setInterval(async () => {
|
|
355
|
-
try {
|
|
356
|
-
// Analyze current costs
|
|
357
|
-
const result = await this.analyzeCosts({
|
|
358
|
-
scope: 'all',
|
|
359
|
-
targetReduction: options.targetSavings,
|
|
360
|
-
autoImplement: false
|
|
361
|
-
});
|
|
362
|
-
|
|
363
|
-
// Check for high-value optimizations
|
|
364
|
-
const highValueOpts = result.profile.optimizations.filter(
|
|
365
|
-
o => o.potentialSavings >= autoThreshold &&
|
|
366
|
-
o.automationLevel === 'full' &&
|
|
367
|
-
o.status === 'suggested'
|
|
368
|
-
);
|
|
369
|
-
|
|
370
|
-
if (highValueOpts.length > 0) {
|
|
371
|
-
this.logger.info(`🎯 Found ${highValueOpts.length} high-value optimizations`);
|
|
372
|
-
|
|
373
|
-
// Implement automatically
|
|
374
|
-
const implemented = await this.autoImplementOptimizations(highValueOpts);
|
|
375
|
-
|
|
376
|
-
// Send notification
|
|
377
|
-
await this.notifyOptimizationResults(implemented);
|
|
378
|
-
}
|
|
379
|
-
|
|
380
|
-
// Check alerts
|
|
381
|
-
await this.processAlerts(result.profile.alerts);
|
|
382
|
-
|
|
383
|
-
} catch (error) {
|
|
384
|
-
this.logger.error('Error in autonomous optimization', error);
|
|
385
|
-
}
|
|
386
|
-
}, interval);
|
|
387
|
-
}
|
|
388
|
-
|
|
389
|
-
/**
|
|
390
|
-
* Get real-time cost dashboard
|
|
391
|
-
*/
|
|
392
|
-
async getCostDashboard(): Promise<{
|
|
393
|
-
currentMonthCost: number;
|
|
394
|
-
projectedMonthCost: number;
|
|
395
|
-
savingsThisMonth: number;
|
|
396
|
-
topCostDrivers: ServiceCost[];
|
|
397
|
-
activeOptimizations: CostOptimization[];
|
|
398
|
-
recentAlerts: CostAlert[];
|
|
399
|
-
recommendations: string[];
|
|
400
|
-
}> {
|
|
401
|
-
const latestProfile = this.getLatestCostProfile();
|
|
402
|
-
|
|
403
|
-
if (!latestProfile) {
|
|
404
|
-
// Generate new profile if none exists
|
|
405
|
-
const result = await this.analyzeCosts();
|
|
406
|
-
return this.generateDashboard(result.profile);
|
|
407
|
-
}
|
|
408
|
-
|
|
409
|
-
return this.generateDashboard(latestProfile);
|
|
410
|
-
}
|
|
411
|
-
|
|
412
|
-
/**
|
|
413
|
-
* Implement specific optimization
|
|
414
|
-
*/
|
|
415
|
-
async implementOptimization(
|
|
416
|
-
optimizationId: string,
|
|
417
|
-
options: {
|
|
418
|
-
testFirst?: boolean;
|
|
419
|
-
rollbackOnFailure?: boolean;
|
|
420
|
-
} = {}
|
|
421
|
-
): Promise<{
|
|
422
|
-
success: boolean;
|
|
423
|
-
actualSavings?: number;
|
|
424
|
-
performanceImpact?: number;
|
|
425
|
-
rollbackRequired: boolean;
|
|
426
|
-
}> {
|
|
427
|
-
this.logger.info('🔧 Implementing optimization', { optimizationId, options });
|
|
428
|
-
|
|
429
|
-
const optimization = this.activeOptimizations.get(optimizationId);
|
|
430
|
-
if (!optimization) {
|
|
431
|
-
throw new Error(`Optimization not found: ${optimizationId}`);
|
|
432
|
-
}
|
|
433
|
-
|
|
434
|
-
try {
|
|
435
|
-
// Test if requested
|
|
436
|
-
if (options.testFirst) {
|
|
437
|
-
const testResult = await this.testOptimization(optimization);
|
|
438
|
-
if (!testResult.success) {
|
|
439
|
-
return {
|
|
440
|
-
success: false,
|
|
441
|
-
rollbackRequired: false
|
|
442
|
-
};
|
|
443
|
-
}
|
|
444
|
-
}
|
|
445
|
-
|
|
446
|
-
// Implement optimization
|
|
447
|
-
const result = await this.executeOptimization(optimization);
|
|
448
|
-
|
|
449
|
-
// Monitor impact
|
|
450
|
-
const impact = await this.monitorOptimizationImpact(optimization, result);
|
|
451
|
-
|
|
452
|
-
// Rollback if negative impact
|
|
453
|
-
if (impact.performanceImpact < -10 && options.rollbackOnFailure) {
|
|
454
|
-
await this.rollbackOptimization(optimization);
|
|
455
|
-
return {
|
|
456
|
-
success: false,
|
|
457
|
-
actualSavings: impact.actualSavings,
|
|
458
|
-
performanceImpact: impact.performanceImpact,
|
|
459
|
-
rollbackRequired: true
|
|
460
|
-
};
|
|
461
|
-
}
|
|
462
|
-
|
|
463
|
-
// Update optimization status
|
|
464
|
-
optimization.status = 'implemented';
|
|
465
|
-
await this.memory.store(`optimization_${optimizationId}`, optimization);
|
|
466
|
-
|
|
467
|
-
return {
|
|
468
|
-
success: true,
|
|
469
|
-
actualSavings: impact.actualSavings,
|
|
470
|
-
performanceImpact: impact.performanceImpact,
|
|
471
|
-
rollbackRequired: false
|
|
472
|
-
};
|
|
473
|
-
|
|
474
|
-
} catch (error) {
|
|
475
|
-
this.logger.error('❌ Optimization implementation failed', error);
|
|
476
|
-
|
|
477
|
-
if (options.rollbackOnFailure) {
|
|
478
|
-
await this.rollbackOptimization(optimization);
|
|
479
|
-
}
|
|
480
|
-
|
|
481
|
-
throw error;
|
|
482
|
-
}
|
|
483
|
-
}
|
|
484
|
-
|
|
485
|
-
/**
|
|
486
|
-
* Private helper methods
|
|
487
|
-
*/
|
|
488
|
-
|
|
489
|
-
private async collectCostData(request: CostOptimizationRequest): Promise<any> {
|
|
490
|
-
// Collect cost data from various sources
|
|
491
|
-
const data = {
|
|
492
|
-
tokenUsage: await this.collectTokenUsage(),
|
|
493
|
-
operationCosts: await this.collectOperationCosts(),
|
|
494
|
-
computeUsage: await this.collectComputeUsage(),
|
|
495
|
-
timeframe: {
|
|
496
|
-
start: new Date(Date.now() - 30 * 24 * 60 * 60 * 1000),
|
|
497
|
-
end: new Date()
|
|
498
|
-
}
|
|
499
|
-
};
|
|
500
|
-
|
|
501
|
-
return data;
|
|
502
|
-
}
|
|
503
|
-
|
|
504
|
-
private async analyzeCostBreakdown(costData: any): Promise<CostBreakdown> {
|
|
505
|
-
// Analyze costs by different dimensions
|
|
506
|
-
return {
|
|
507
|
-
byService: await this.analyzeServiceCosts(costData),
|
|
508
|
-
byOperation: await this.analyzeOperationCosts(costData),
|
|
509
|
-
byAgent: await this.analyzeAgentCosts(costData),
|
|
510
|
-
byTimeframe: await this.analyzeTimeframeCosts(costData),
|
|
511
|
-
byModel: await this.analyzeModelCosts(costData)
|
|
512
|
-
};
|
|
513
|
-
}
|
|
514
|
-
|
|
515
|
-
private async analyzeServiceCosts(costData: any): Promise<ServiceCost[]> {
|
|
516
|
-
// Analyze costs by service
|
|
517
|
-
return [
|
|
518
|
-
{
|
|
519
|
-
service: 'Flow Creation',
|
|
520
|
-
cost: 450.00,
|
|
521
|
-
usage: {
|
|
522
|
-
requests: 890,
|
|
523
|
-
tokens: 2500000,
|
|
524
|
-
computeTime: 180
|
|
525
|
-
},
|
|
526
|
-
percentageOfTotal: 35,
|
|
527
|
-
trend: 'increasing'
|
|
528
|
-
},
|
|
529
|
-
{
|
|
530
|
-
service: 'Testing Automation',
|
|
531
|
-
cost: 280.00,
|
|
532
|
-
usage: {
|
|
533
|
-
requests: 1200,
|
|
534
|
-
tokens: 1800000,
|
|
535
|
-
computeTime: 240
|
|
536
|
-
},
|
|
537
|
-
percentageOfTotal: 22,
|
|
538
|
-
trend: 'stable'
|
|
539
|
-
},
|
|
540
|
-
{
|
|
541
|
-
service: 'Documentation',
|
|
542
|
-
cost: 180.00,
|
|
543
|
-
usage: {
|
|
544
|
-
requests: 450,
|
|
545
|
-
tokens: 1200000,
|
|
546
|
-
computeTime: 90
|
|
547
|
-
},
|
|
548
|
-
percentageOfTotal: 14,
|
|
549
|
-
trend: 'decreasing'
|
|
550
|
-
}
|
|
551
|
-
];
|
|
552
|
-
}
|
|
553
|
-
|
|
554
|
-
private async analyzeModelCosts(costData: any): Promise<ModelCost[]> {
|
|
555
|
-
// Analyze costs by AI model
|
|
556
|
-
return [
|
|
557
|
-
{
|
|
558
|
-
model: 'gpt-4',
|
|
559
|
-
cost: 600.00,
|
|
560
|
-
tokens: 20000000,
|
|
561
|
-
requests: 5000,
|
|
562
|
-
costPerToken: 0.00003,
|
|
563
|
-
alternativeModels: [
|
|
564
|
-
{
|
|
565
|
-
model: 'gpt-3.5-turbo',
|
|
566
|
-
potentialSavings: 540.00,
|
|
567
|
-
performanceImpact: 'minimal',
|
|
568
|
-
recommendation: 'Use for non-critical operations'
|
|
569
|
-
},
|
|
570
|
-
{
|
|
571
|
-
model: 'claude-3-sonnet',
|
|
572
|
-
potentialSavings: 480.00,
|
|
573
|
-
performanceImpact: 'minimal',
|
|
574
|
-
recommendation: 'Use for code generation tasks'
|
|
575
|
-
}
|
|
576
|
-
]
|
|
577
|
-
}
|
|
578
|
-
];
|
|
579
|
-
}
|
|
580
|
-
|
|
581
|
-
private async generateOptimizations(
|
|
582
|
-
breakdown: CostBreakdown,
|
|
583
|
-
trends: CostTrend[],
|
|
584
|
-
request: CostOptimizationRequest
|
|
585
|
-
): Promise<CostOptimization[]> {
|
|
586
|
-
const optimizations: CostOptimization[] = [];
|
|
587
|
-
|
|
588
|
-
// Model switching optimization
|
|
589
|
-
if (breakdown.byModel[0].alternativeModels.length > 0) {
|
|
590
|
-
optimizations.push({
|
|
591
|
-
id: `opt_${Date.now()}_1`,
|
|
592
|
-
type: 'model_switching',
|
|
593
|
-
title: 'Intelligent Model Switching',
|
|
594
|
-
description: 'Switch to more cost-effective models for non-critical operations',
|
|
595
|
-
potentialSavings: 480.00,
|
|
596
|
-
implementation: {
|
|
597
|
-
steps: [
|
|
598
|
-
{
|
|
599
|
-
order: 1,
|
|
600
|
-
action: 'Analyze operation criticality',
|
|
601
|
-
automated: true,
|
|
602
|
-
validation: 'Criticality scores generated'
|
|
603
|
-
},
|
|
604
|
-
{
|
|
605
|
-
order: 2,
|
|
606
|
-
action: 'Implement model routing logic',
|
|
607
|
-
automated: true,
|
|
608
|
-
script: 'await this.implementModelRouting()',
|
|
609
|
-
validation: 'Routing logic deployed'
|
|
610
|
-
},
|
|
611
|
-
{
|
|
612
|
-
order: 3,
|
|
613
|
-
action: 'Monitor performance impact',
|
|
614
|
-
automated: true,
|
|
615
|
-
validation: 'Performance within thresholds'
|
|
616
|
-
}
|
|
617
|
-
],
|
|
618
|
-
estimatedTime: 30,
|
|
619
|
-
requirements: ['Model routing capability'],
|
|
620
|
-
risks: ['Slight quality variation'],
|
|
621
|
-
rollbackPlan: 'Revert to original model selection'
|
|
622
|
-
},
|
|
623
|
-
impact: {
|
|
624
|
-
costReduction: 40,
|
|
625
|
-
performanceChange: -5,
|
|
626
|
-
reliabilityChange: 0,
|
|
627
|
-
userExperience: 'unchanged',
|
|
628
|
-
confidence: 0.85
|
|
629
|
-
},
|
|
630
|
-
status: 'suggested',
|
|
631
|
-
automationLevel: 'full'
|
|
632
|
-
});
|
|
633
|
-
}
|
|
634
|
-
|
|
635
|
-
// Caching optimization
|
|
636
|
-
optimizations.push({
|
|
637
|
-
id: `opt_${Date.now()}_2`,
|
|
638
|
-
type: 'caching',
|
|
639
|
-
title: 'Intelligent Response Caching',
|
|
640
|
-
description: 'Cache frequently used AI responses to reduce token usage',
|
|
641
|
-
potentialSavings: 220.00,
|
|
642
|
-
implementation: {
|
|
643
|
-
steps: [
|
|
644
|
-
{
|
|
645
|
-
order: 1,
|
|
646
|
-
action: 'Identify cacheable patterns',
|
|
647
|
-
automated: true,
|
|
648
|
-
validation: 'Patterns identified'
|
|
649
|
-
},
|
|
650
|
-
{
|
|
651
|
-
order: 2,
|
|
652
|
-
action: 'Implement cache layer',
|
|
653
|
-
automated: true,
|
|
654
|
-
validation: 'Cache operational'
|
|
655
|
-
}
|
|
656
|
-
],
|
|
657
|
-
estimatedTime: 45,
|
|
658
|
-
requirements: ['Redis or similar cache'],
|
|
659
|
-
risks: ['Stale data possibility'],
|
|
660
|
-
rollbackPlan: 'Disable caching'
|
|
661
|
-
},
|
|
662
|
-
impact: {
|
|
663
|
-
costReduction: 18,
|
|
664
|
-
performanceChange: 25,
|
|
665
|
-
reliabilityChange: 0,
|
|
666
|
-
userExperience: 'improved',
|
|
667
|
-
confidence: 0.90
|
|
668
|
-
},
|
|
669
|
-
status: 'suggested',
|
|
670
|
-
automationLevel: 'full'
|
|
671
|
-
});
|
|
672
|
-
|
|
673
|
-
// Batch processing optimization
|
|
674
|
-
optimizations.push({
|
|
675
|
-
id: `opt_${Date.now()}_3`,
|
|
676
|
-
type: 'batching',
|
|
677
|
-
title: 'Batch Processing for Bulk Operations',
|
|
678
|
-
description: 'Combine multiple requests into batches for efficiency',
|
|
679
|
-
potentialSavings: 150.00,
|
|
680
|
-
implementation: {
|
|
681
|
-
steps: [
|
|
682
|
-
{
|
|
683
|
-
order: 1,
|
|
684
|
-
action: 'Implement request batching',
|
|
685
|
-
automated: true,
|
|
686
|
-
validation: 'Batching enabled'
|
|
687
|
-
}
|
|
688
|
-
],
|
|
689
|
-
estimatedTime: 20,
|
|
690
|
-
requirements: [],
|
|
691
|
-
risks: ['Slight latency increase'],
|
|
692
|
-
rollbackPlan: 'Disable batching'
|
|
693
|
-
},
|
|
694
|
-
impact: {
|
|
695
|
-
costReduction: 12,
|
|
696
|
-
performanceChange: -2,
|
|
697
|
-
reliabilityChange: 5,
|
|
698
|
-
userExperience: 'unchanged',
|
|
699
|
-
confidence: 0.75
|
|
700
|
-
},
|
|
701
|
-
status: 'suggested',
|
|
702
|
-
automationLevel: 'full'
|
|
703
|
-
});
|
|
704
|
-
|
|
705
|
-
// Sort by potential savings
|
|
706
|
-
return optimizations.sort((a, b) => b.potentialSavings - a.potentialSavings);
|
|
707
|
-
}
|
|
708
|
-
|
|
709
|
-
private async generateCostForecast(
|
|
710
|
-
costData: any,
|
|
711
|
-
optimizations: CostOptimization[]
|
|
712
|
-
): Promise<CostForecast> {
|
|
713
|
-
const currentMonthCost = 1280.00;
|
|
714
|
-
const implementedSavings = optimizations
|
|
715
|
-
.filter(o => o.status === 'implemented')
|
|
716
|
-
.reduce((sum, o) => sum + o.potentialSavings, 0);
|
|
717
|
-
|
|
718
|
-
const projectedCost = currentMonthCost - implementedSavings;
|
|
719
|
-
|
|
720
|
-
return {
|
|
721
|
-
period: 'next_month',
|
|
722
|
-
predictedCost: projectedCost,
|
|
723
|
-
confidenceInterval: {
|
|
724
|
-
low: projectedCost * 0.85,
|
|
725
|
-
high: projectedCost * 1.15
|
|
726
|
-
},
|
|
727
|
-
assumptions: [
|
|
728
|
-
'Similar usage patterns',
|
|
729
|
-
'No major new deployments',
|
|
730
|
-
'Stable AI model pricing'
|
|
731
|
-
],
|
|
732
|
-
risks: [
|
|
733
|
-
{
|
|
734
|
-
risk: 'Increased usage due to new features',
|
|
735
|
-
probability: 'medium',
|
|
736
|
-
impact: projectedCost * 0.20,
|
|
737
|
-
mitigation: 'Implement usage quotas'
|
|
738
|
-
}
|
|
739
|
-
],
|
|
740
|
-
recommendations: [
|
|
741
|
-
'Review and adjust model selection monthly',
|
|
742
|
-
'Consider annual commitment for discounts',
|
|
743
|
-
'Implement usage monitoring alerts'
|
|
744
|
-
]
|
|
745
|
-
};
|
|
746
|
-
}
|
|
747
|
-
|
|
748
|
-
private async autoImplementOptimizations(
|
|
749
|
-
optimizations: CostOptimization[],
|
|
750
|
-
constraints?: OptimizationConstraints
|
|
751
|
-
): Promise<CostOptimization[]> {
|
|
752
|
-
const implemented: CostOptimization[] = [];
|
|
753
|
-
|
|
754
|
-
for (const optimization of optimizations) {
|
|
755
|
-
try {
|
|
756
|
-
// Check constraints
|
|
757
|
-
if (constraints) {
|
|
758
|
-
if (!this.meetsConstraints(optimization, constraints)) {
|
|
759
|
-
continue;
|
|
760
|
-
}
|
|
761
|
-
}
|
|
762
|
-
|
|
763
|
-
// Implement optimization
|
|
764
|
-
const result = await this.executeOptimization(optimization);
|
|
765
|
-
|
|
766
|
-
if (result.success) {
|
|
767
|
-
optimization.status = 'implemented';
|
|
768
|
-
implemented.push(optimization);
|
|
769
|
-
this.activeOptimizations.set(optimization.id, optimization);
|
|
770
|
-
}
|
|
771
|
-
} catch (error) {
|
|
772
|
-
this.logger.error(`Failed to implement optimization ${optimization.id}`, error);
|
|
773
|
-
}
|
|
774
|
-
}
|
|
775
|
-
|
|
776
|
-
return implemented;
|
|
777
|
-
}
|
|
778
|
-
|
|
779
|
-
private meetsConstraints(
|
|
780
|
-
optimization: CostOptimization,
|
|
781
|
-
constraints: OptimizationConstraints
|
|
782
|
-
): boolean {
|
|
783
|
-
if (constraints.maintainPerformance && optimization.impact.performanceChange < 0) {
|
|
784
|
-
return false;
|
|
785
|
-
}
|
|
786
|
-
|
|
787
|
-
if (constraints.maxPerformanceDegradation !== undefined) {
|
|
788
|
-
if (Math.abs(optimization.impact.performanceChange) > constraints.maxPerformanceDegradation) {
|
|
789
|
-
return false;
|
|
790
|
-
}
|
|
791
|
-
}
|
|
792
|
-
|
|
793
|
-
return true;
|
|
794
|
-
}
|
|
795
|
-
|
|
796
|
-
private async executeOptimization(optimization: CostOptimization): Promise<any> {
|
|
797
|
-
this.logger.info(`Executing optimization: ${optimization.title}`);
|
|
798
|
-
|
|
799
|
-
// Simulate optimization execution
|
|
800
|
-
for (const step of optimization.implementation.steps) {
|
|
801
|
-
if (step.automated && step.script) {
|
|
802
|
-
// Execute automated step
|
|
803
|
-
await new Promise(resolve => setTimeout(resolve, 1000));
|
|
804
|
-
}
|
|
805
|
-
}
|
|
806
|
-
|
|
807
|
-
return { success: true };
|
|
808
|
-
}
|
|
809
|
-
|
|
810
|
-
private async testOptimization(optimization: CostOptimization): Promise<any> {
|
|
811
|
-
// Test optimization in sandbox
|
|
812
|
-
return { success: true, impact: optimization.impact };
|
|
813
|
-
}
|
|
814
|
-
|
|
815
|
-
private async monitorOptimizationImpact(
|
|
816
|
-
optimization: CostOptimization,
|
|
817
|
-
result: any
|
|
818
|
-
): Promise<any> {
|
|
819
|
-
// Monitor actual impact of optimization
|
|
820
|
-
return {
|
|
821
|
-
actualSavings: optimization.potentialSavings * 0.85, // 85% of projected
|
|
822
|
-
performanceImpact: optimization.impact.performanceChange
|
|
823
|
-
};
|
|
824
|
-
}
|
|
825
|
-
|
|
826
|
-
private async rollbackOptimization(optimization: CostOptimization): Promise<void> {
|
|
827
|
-
this.logger.warn(`Rolling back optimization: ${optimization.title}`);
|
|
828
|
-
// Implement rollback logic
|
|
829
|
-
}
|
|
830
|
-
|
|
831
|
-
private generateRecommendations(profile: CostProfile): string[] {
|
|
832
|
-
const recommendations: string[] = [];
|
|
833
|
-
|
|
834
|
-
// High cost alerts
|
|
835
|
-
if (profile.totalCost > 1500) {
|
|
836
|
-
recommendations.push('Consider implementing strict cost controls');
|
|
837
|
-
}
|
|
838
|
-
|
|
839
|
-
// Model usage
|
|
840
|
-
const highCostModels = profile.breakdown.byModel.filter(m => m.cost > 500);
|
|
841
|
-
if (highCostModels.length > 0) {
|
|
842
|
-
recommendations.push('Review AI model selection for cost optimization');
|
|
843
|
-
}
|
|
844
|
-
|
|
845
|
-
// Time-based optimization
|
|
846
|
-
if (profile.breakdown.byTimeframe.some(t => t.peakHours.length > 0)) {
|
|
847
|
-
recommendations.push('Schedule non-critical operations during off-peak hours');
|
|
848
|
-
}
|
|
849
|
-
|
|
850
|
-
return recommendations;
|
|
851
|
-
}
|
|
852
|
-
|
|
853
|
-
private generateNextSteps(
|
|
854
|
-
profile: CostProfile,
|
|
855
|
-
implemented: CostOptimization[]
|
|
856
|
-
): string[] {
|
|
857
|
-
return [
|
|
858
|
-
`Monitor ${implemented.length} implemented optimizations for impact`,
|
|
859
|
-
'Review cost trends weekly',
|
|
860
|
-
'Consider additional optimizations with ROI > 20%',
|
|
861
|
-
'Set up automated alerts for cost anomalies'
|
|
862
|
-
];
|
|
863
|
-
}
|
|
864
|
-
|
|
865
|
-
private getLatestCostProfile(): CostProfile | null {
|
|
866
|
-
const profiles = Array.from(this.costProfiles.values());
|
|
867
|
-
if (profiles.length === 0) return null;
|
|
868
|
-
|
|
869
|
-
return profiles.sort((a, b) =>
|
|
870
|
-
new Date(b.metadata.lastUpdated).getTime() -
|
|
871
|
-
new Date(a.metadata.lastUpdated).getTime()
|
|
872
|
-
)[0];
|
|
873
|
-
}
|
|
874
|
-
|
|
875
|
-
private async generateDashboard(profile: CostProfile): Promise<any> {
|
|
876
|
-
return {
|
|
877
|
-
currentMonthCost: profile.totalCost,
|
|
878
|
-
projectedMonthCost: profile.forecast.predictedCost,
|
|
879
|
-
savingsThisMonth: profile.savings.totalSaved,
|
|
880
|
-
topCostDrivers: profile.breakdown.byService.slice(0, 3),
|
|
881
|
-
activeOptimizations: profile.optimizations.filter(o => o.status === 'implemented'),
|
|
882
|
-
recentAlerts: profile.alerts.slice(0, 5),
|
|
883
|
-
recommendations: this.generateRecommendations(profile)
|
|
884
|
-
};
|
|
885
|
-
}
|
|
886
|
-
|
|
887
|
-
private async notifyOptimizationResults(optimizations: CostOptimization[]): Promise<void> {
|
|
888
|
-
const totalSavings = optimizations.reduce((sum, o) => sum + o.potentialSavings, 0);
|
|
889
|
-
this.logger.info(`💰 Automatically implemented ${optimizations.length} optimizations, saving $${totalSavings.toFixed(2)}`);
|
|
890
|
-
}
|
|
891
|
-
|
|
892
|
-
private async processAlerts(alerts: CostAlert[]): Promise<void> {
|
|
893
|
-
for (const alert of alerts) {
|
|
894
|
-
if (alert.severity === 'critical' && !alert.autoResolved) {
|
|
895
|
-
this.logger.error(`🚨 Critical cost alert: ${alert.message}`);
|
|
896
|
-
// Implement alert actions
|
|
897
|
-
}
|
|
898
|
-
}
|
|
899
|
-
}
|
|
900
|
-
|
|
901
|
-
private initializeCostTracking(): void {
|
|
902
|
-
// Initialize cost tracking
|
|
903
|
-
this.costThresholds.set('daily', 50);
|
|
904
|
-
this.costThresholds.set('weekly', 300);
|
|
905
|
-
this.costThresholds.set('monthly', 1000);
|
|
906
|
-
}
|
|
907
|
-
|
|
908
|
-
private startContinuousMonitoring(): void {
|
|
909
|
-
if (!this.monitoringEnabled) return;
|
|
910
|
-
|
|
911
|
-
// Monitor costs every hour
|
|
912
|
-
setInterval(async () => {
|
|
913
|
-
try {
|
|
914
|
-
await this.checkCostThresholds();
|
|
915
|
-
} catch (error) {
|
|
916
|
-
this.logger.error('Error in cost monitoring', error);
|
|
917
|
-
}
|
|
918
|
-
}, 3600000);
|
|
919
|
-
}
|
|
920
|
-
|
|
921
|
-
private async checkCostThresholds(): Promise<void> {
|
|
922
|
-
// Check current costs against thresholds
|
|
923
|
-
const currentCosts = await this.getCurrentCosts();
|
|
924
|
-
|
|
925
|
-
for (const [period, threshold] of this.costThresholds.entries()) {
|
|
926
|
-
if (currentCosts[period] > threshold) {
|
|
927
|
-
await this.createCostAlert({
|
|
928
|
-
type: 'threshold',
|
|
929
|
-
severity: 'warning',
|
|
930
|
-
message: `${period} cost threshold exceeded: $${currentCosts[period].toFixed(2)} > $${threshold}`,
|
|
931
|
-
value: currentCosts[period],
|
|
932
|
-
threshold
|
|
933
|
-
});
|
|
934
|
-
}
|
|
935
|
-
}
|
|
936
|
-
}
|
|
937
|
-
|
|
938
|
-
private async getCurrentCosts(): Promise<Record<string, number>> {
|
|
939
|
-
// Get current cost totals
|
|
940
|
-
return {
|
|
941
|
-
daily: 45.00,
|
|
942
|
-
weekly: 280.00,
|
|
943
|
-
monthly: 980.00
|
|
944
|
-
};
|
|
945
|
-
}
|
|
946
|
-
|
|
947
|
-
private async createCostAlert(alert: Partial<CostAlert>): Promise<void> {
|
|
948
|
-
const fullAlert: CostAlert = {
|
|
949
|
-
id: `alert_${Date.now()}`,
|
|
950
|
-
timestamp: new Date().toISOString(),
|
|
951
|
-
action: 'Review and optimize',
|
|
952
|
-
autoResolved: false,
|
|
953
|
-
...alert
|
|
954
|
-
} as CostAlert;
|
|
955
|
-
|
|
956
|
-
// Store alert
|
|
957
|
-
await this.memory.store(`cost_alert_${fullAlert.id}`, fullAlert, 604800000); // 7 days
|
|
958
|
-
}
|
|
959
|
-
|
|
960
|
-
private async collectTokenUsage(): Promise<any> {
|
|
961
|
-
// Collect token usage data
|
|
962
|
-
return {
|
|
963
|
-
total: 45000000,
|
|
964
|
-
byModel: {
|
|
965
|
-
'gpt-4': 20000000,
|
|
966
|
-
'gpt-3.5-turbo': 15000000,
|
|
967
|
-
'claude-3-opus': 10000000
|
|
968
|
-
}
|
|
969
|
-
};
|
|
970
|
-
}
|
|
971
|
-
|
|
972
|
-
private async collectOperationCosts(): Promise<any> {
|
|
973
|
-
// Collect operation cost data
|
|
974
|
-
return {
|
|
975
|
-
flowCreation: { count: 890, cost: 445.00 },
|
|
976
|
-
deployment: { count: 450, cost: 135.00 },
|
|
977
|
-
testing: { count: 1200, cost: 240.00 }
|
|
978
|
-
};
|
|
979
|
-
}
|
|
980
|
-
|
|
981
|
-
private async collectComputeUsage(): Promise<any> {
|
|
982
|
-
// Collect compute usage data
|
|
983
|
-
return {
|
|
984
|
-
totalMinutes: 5400,
|
|
985
|
-
totalGB: 850,
|
|
986
|
-
cost: 270.00
|
|
987
|
-
};
|
|
988
|
-
}
|
|
989
|
-
|
|
990
|
-
private async analyzeOperationCosts(costData: any): Promise<OperationCost[]> {
|
|
991
|
-
return Object.entries(costData.operationCosts).map(([op, data]: [string, any]) => ({
|
|
992
|
-
operation: op,
|
|
993
|
-
cost: data.cost,
|
|
994
|
-
frequency: data.count,
|
|
995
|
-
averageCostPerOperation: data.cost / data.count,
|
|
996
|
-
optimization: 'Consider batching similar operations'
|
|
997
|
-
}));
|
|
998
|
-
}
|
|
999
|
-
|
|
1000
|
-
private async analyzeAgentCosts(costData: any): Promise<AgentCost[]> {
|
|
1001
|
-
return [
|
|
1002
|
-
{
|
|
1003
|
-
agentId: 'queen_agent',
|
|
1004
|
-
agentType: 'orchestrator',
|
|
1005
|
-
cost: 380.00,
|
|
1006
|
-
efficiency: 0.42,
|
|
1007
|
-
recommendations: ['Optimize prompt templates', 'Enable response caching']
|
|
1008
|
-
},
|
|
1009
|
-
{
|
|
1010
|
-
agentId: 'coder_agent',
|
|
1011
|
-
agentType: 'developer',
|
|
1012
|
-
cost: 290.00,
|
|
1013
|
-
efficiency: 0.32,
|
|
1014
|
-
recommendations: ['Use lighter models for simple tasks']
|
|
1015
|
-
}
|
|
1016
|
-
];
|
|
1017
|
-
}
|
|
1018
|
-
|
|
1019
|
-
private async analyzeTimeframeCosts(costData: any): Promise<TimeframeCost[]> {
|
|
1020
|
-
return [
|
|
1021
|
-
{
|
|
1022
|
-
timeframe: 'business_hours',
|
|
1023
|
-
cost: 780.00,
|
|
1024
|
-
peakHours: ['9AM-11AM', '2PM-4PM'],
|
|
1025
|
-
lowUsageHours: ['6AM-8AM', '6PM-8PM']
|
|
1026
|
-
},
|
|
1027
|
-
{
|
|
1028
|
-
timeframe: 'after_hours',
|
|
1029
|
-
cost: 200.00,
|
|
1030
|
-
peakHours: [],
|
|
1031
|
-
lowUsageHours: ['8PM-6AM']
|
|
1032
|
-
}
|
|
1033
|
-
];
|
|
1034
|
-
}
|
|
1035
|
-
|
|
1036
|
-
private async analyzeCostTrends(costData: any): Promise<CostTrend[]> {
|
|
1037
|
-
const trends: CostTrend[] = [];
|
|
1038
|
-
const dailyCosts = [42, 45, 48, 43, 52, 47, 49]; // Last 7 days
|
|
1039
|
-
|
|
1040
|
-
for (let i = 0; i < dailyCosts.length; i++) {
|
|
1041
|
-
const previousCost = i > 0 ? dailyCosts[i - 1] : dailyCosts[i];
|
|
1042
|
-
const change = dailyCosts[i] - previousCost;
|
|
1043
|
-
const changePercentage = (change / previousCost) * 100;
|
|
1044
|
-
|
|
1045
|
-
trends.push({
|
|
1046
|
-
date: new Date(Date.now() - (6 - i) * 24 * 60 * 60 * 1000).toISOString(),
|
|
1047
|
-
cost: dailyCosts[i],
|
|
1048
|
-
change,
|
|
1049
|
-
changePercentage,
|
|
1050
|
-
anomaly: Math.abs(changePercentage) > 15,
|
|
1051
|
-
reason: Math.abs(changePercentage) > 15 ? 'Unusual activity spike' : undefined
|
|
1052
|
-
});
|
|
1053
|
-
}
|
|
1054
|
-
|
|
1055
|
-
return trends;
|
|
1056
|
-
}
|
|
1057
|
-
|
|
1058
|
-
private async generateCostAlerts(
|
|
1059
|
-
breakdown: CostBreakdown,
|
|
1060
|
-
trends: CostTrend[],
|
|
1061
|
-
forecast: CostForecast
|
|
1062
|
-
): Promise<CostAlert[]> {
|
|
1063
|
-
const alerts: CostAlert[] = [];
|
|
1064
|
-
|
|
1065
|
-
// Check for anomalies
|
|
1066
|
-
const anomalies = trends.filter(t => t.anomaly);
|
|
1067
|
-
for (const anomaly of anomalies) {
|
|
1068
|
-
alerts.push({
|
|
1069
|
-
id: `alert_${Date.now()}_${Math.random().toString(36).substr(2, 4)}`,
|
|
1070
|
-
type: 'anomaly',
|
|
1071
|
-
severity: 'warning',
|
|
1072
|
-
message: `Cost anomaly detected: ${anomaly.changePercentage.toFixed(1)}% change`,
|
|
1073
|
-
timestamp: anomaly.date,
|
|
1074
|
-
value: anomaly.cost,
|
|
1075
|
-
action: 'Investigate unusual activity',
|
|
1076
|
-
autoResolved: false
|
|
1077
|
-
});
|
|
1078
|
-
}
|
|
1079
|
-
|
|
1080
|
-
// Forecast alerts
|
|
1081
|
-
if (forecast.predictedCost > 1500) {
|
|
1082
|
-
alerts.push({
|
|
1083
|
-
id: `alert_${Date.now()}_forecast`,
|
|
1084
|
-
type: 'forecast',
|
|
1085
|
-
severity: 'warning',
|
|
1086
|
-
message: `Projected monthly cost exceeds budget: $${forecast.predictedCost.toFixed(2)}`,
|
|
1087
|
-
timestamp: new Date().toISOString(),
|
|
1088
|
-
value: forecast.predictedCost,
|
|
1089
|
-
threshold: 1500,
|
|
1090
|
-
action: 'Implement cost controls',
|
|
1091
|
-
autoResolved: false
|
|
1092
|
-
});
|
|
1093
|
-
}
|
|
1094
|
-
|
|
1095
|
-
return alerts;
|
|
1096
|
-
}
|
|
1097
|
-
|
|
1098
|
-
private async calculateSavings(optimizations: CostOptimization[]): Promise<SavingsReport> {
|
|
1099
|
-
const implementedOpts = optimizations.filter(o => o.status === 'implemented');
|
|
1100
|
-
const totalSaved = implementedOpts.reduce((sum, o) => sum + o.potentialSavings, 0);
|
|
1101
|
-
|
|
1102
|
-
return {
|
|
1103
|
-
totalSaved,
|
|
1104
|
-
savingsByOptimization: [
|
|
1105
|
-
{
|
|
1106
|
-
type: 'Model Optimization',
|
|
1107
|
-
amount: 480.00,
|
|
1108
|
-
percentage: 37.5,
|
|
1109
|
-
examples: ['Switched to GPT-3.5 for routine tasks']
|
|
1110
|
-
},
|
|
1111
|
-
{
|
|
1112
|
-
type: 'Caching',
|
|
1113
|
-
amount: 220.00,
|
|
1114
|
-
percentage: 17.2,
|
|
1115
|
-
examples: ['Cached frequent documentation queries']
|
|
1116
|
-
}
|
|
1117
|
-
],
|
|
1118
|
-
comparisonToPrevious: 15.8,
|
|
1119
|
-
projectedAnnualSavings: totalSaved * 12,
|
|
1120
|
-
implementedOptimizations: implementedOpts.length
|
|
1121
|
-
};
|
|
1122
|
-
}
|
|
1123
|
-
}
|
|
1124
|
-
|
|
1125
|
-
export default CostOptimizationEngine;
|