agentic-qe 2.5.7 → 2.5.9
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/CHANGELOG.md +133 -0
- package/README.md +1 -1
- package/dist/agents/BaseAgent.d.ts +231 -4
- package/dist/agents/BaseAgent.d.ts.map +1 -1
- package/dist/agents/BaseAgent.js +535 -5
- package/dist/agents/BaseAgent.js.map +1 -1
- package/dist/agents/CoverageAnalyzerAgent.d.ts +20 -23
- package/dist/agents/CoverageAnalyzerAgent.d.ts.map +1 -1
- package/dist/agents/CoverageAnalyzerAgent.js +95 -145
- package/dist/agents/CoverageAnalyzerAgent.js.map +1 -1
- package/dist/agents/QualityAnalyzerAgent.d.ts +2 -2
- package/dist/agents/QualityAnalyzerAgent.d.ts.map +1 -1
- package/dist/agents/QualityAnalyzerAgent.js.map +1 -1
- package/dist/agents/QualityGateAgent.d.ts +35 -18
- package/dist/agents/QualityGateAgent.d.ts.map +1 -1
- package/dist/agents/QualityGateAgent.js +72 -97
- package/dist/agents/QualityGateAgent.js.map +1 -1
- package/dist/agents/TestGeneratorAgent.d.ts +5 -0
- package/dist/agents/TestGeneratorAgent.d.ts.map +1 -1
- package/dist/agents/TestGeneratorAgent.js +38 -0
- package/dist/agents/TestGeneratorAgent.js.map +1 -1
- package/dist/agents/index.d.ts +1 -1
- package/dist/agents/index.d.ts.map +1 -1
- package/dist/agents/index.js +17 -4
- package/dist/agents/index.js.map +1 -1
- package/dist/core/memory/HNSWVectorMemory.js +1 -1
- package/dist/core/memory/RuVectorPatternStore.d.ts +90 -0
- package/dist/core/memory/RuVectorPatternStore.d.ts.map +1 -1
- package/dist/core/memory/RuVectorPatternStore.js +209 -0
- package/dist/core/memory/RuVectorPatternStore.js.map +1 -1
- package/dist/learning/FederatedManager.d.ts +232 -0
- package/dist/learning/FederatedManager.d.ts.map +1 -0
- package/dist/learning/FederatedManager.js +489 -0
- package/dist/learning/FederatedManager.js.map +1 -0
- package/dist/learning/HNSWPatternAdapter.d.ts +117 -0
- package/dist/learning/HNSWPatternAdapter.d.ts.map +1 -0
- package/dist/learning/HNSWPatternAdapter.js +262 -0
- package/dist/learning/HNSWPatternAdapter.js.map +1 -0
- package/dist/learning/LearningEngine.d.ts +27 -0
- package/dist/learning/LearningEngine.d.ts.map +1 -1
- package/dist/learning/LearningEngine.js +75 -1
- package/dist/learning/LearningEngine.js.map +1 -1
- package/dist/learning/PatternCurator.d.ts +217 -0
- package/dist/learning/PatternCurator.d.ts.map +1 -0
- package/dist/learning/PatternCurator.js +393 -0
- package/dist/learning/PatternCurator.js.map +1 -0
- package/dist/learning/index.d.ts +6 -0
- package/dist/learning/index.d.ts.map +1 -1
- package/dist/learning/index.js +16 -1
- package/dist/learning/index.js.map +1 -1
- package/dist/learning/types.d.ts +4 -0
- package/dist/learning/types.d.ts.map +1 -1
- package/dist/mcp/server-instructions.d.ts +1 -1
- package/dist/mcp/server-instructions.js +1 -1
- package/dist/mcp/tools.d.ts +6 -0
- package/dist/mcp/tools.d.ts.map +1 -1
- package/dist/mcp/tools.js +121 -0
- package/dist/mcp/tools.js.map +1 -1
- package/dist/memory/HNSWPatternStore.d.ts +176 -0
- package/dist/memory/HNSWPatternStore.d.ts.map +1 -0
- package/dist/memory/HNSWPatternStore.js +392 -0
- package/dist/memory/HNSWPatternStore.js.map +1 -0
- package/dist/memory/index.d.ts +8 -0
- package/dist/memory/index.d.ts.map +1 -0
- package/dist/memory/index.js +13 -0
- package/dist/memory/index.js.map +1 -0
- package/dist/providers/HybridRouter.d.ts +85 -4
- package/dist/providers/HybridRouter.d.ts.map +1 -1
- package/dist/providers/HybridRouter.js +332 -10
- package/dist/providers/HybridRouter.js.map +1 -1
- package/dist/providers/LLMBaselineTracker.d.ts +120 -0
- package/dist/providers/LLMBaselineTracker.d.ts.map +1 -0
- package/dist/providers/LLMBaselineTracker.js +305 -0
- package/dist/providers/LLMBaselineTracker.js.map +1 -0
- package/dist/providers/OpenRouterProvider.d.ts +26 -0
- package/dist/providers/OpenRouterProvider.d.ts.map +1 -1
- package/dist/providers/OpenRouterProvider.js +75 -6
- package/dist/providers/OpenRouterProvider.js.map +1 -1
- package/dist/providers/RuVectorClient.d.ts +259 -0
- package/dist/providers/RuVectorClient.d.ts.map +1 -0
- package/dist/providers/RuVectorClient.js +416 -0
- package/dist/providers/RuVectorClient.js.map +1 -0
- package/dist/providers/RuvllmPatternCurator.d.ts +116 -0
- package/dist/providers/RuvllmPatternCurator.d.ts.map +1 -0
- package/dist/providers/RuvllmPatternCurator.js +323 -0
- package/dist/providers/RuvllmPatternCurator.js.map +1 -0
- package/dist/providers/RuvllmProvider.d.ts +233 -1
- package/dist/providers/RuvllmProvider.d.ts.map +1 -1
- package/dist/providers/RuvllmProvider.js +781 -11
- package/dist/providers/RuvllmProvider.js.map +1 -1
- package/dist/providers/index.d.ts +5 -1
- package/dist/providers/index.d.ts.map +1 -1
- package/dist/providers/index.js +12 -2
- package/dist/providers/index.js.map +1 -1
- package/dist/utils/ruvllm-loader.d.ts +98 -1
- package/dist/utils/ruvllm-loader.d.ts.map +1 -1
- package/dist/utils/ruvllm-loader.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* LLMBaselineTracker - Track LLM provider performance baselines over time
|
|
3
|
+
*
|
|
4
|
+
* Phase 0 integration: Establishes real performance baselines for LLM providers
|
|
5
|
+
* to replace unverified claims with measured data.
|
|
6
|
+
*
|
|
7
|
+
* Integrates with existing observability infrastructure:
|
|
8
|
+
* - Uses BaselineCollector patterns
|
|
9
|
+
* - Stores data in SQLite for historical tracking
|
|
10
|
+
* - Provides improvement target calculations
|
|
11
|
+
*
|
|
12
|
+
* @version 1.0.0
|
|
13
|
+
* @module providers/LLMBaselineTracker
|
|
14
|
+
*/
|
|
15
|
+
/**
|
|
16
|
+
* LLM performance measurement
|
|
17
|
+
*/
|
|
18
|
+
export interface LLMPerformanceMeasurement {
|
|
19
|
+
id?: string;
|
|
20
|
+
provider: string;
|
|
21
|
+
model: string;
|
|
22
|
+
operation: string;
|
|
23
|
+
metrics: {
|
|
24
|
+
latencyP50: number;
|
|
25
|
+
latencyP95: number;
|
|
26
|
+
latencyP99: number;
|
|
27
|
+
tokensPerSecond: number;
|
|
28
|
+
inputTokens: number;
|
|
29
|
+
outputTokens: number;
|
|
30
|
+
cost: number;
|
|
31
|
+
errorRate: number;
|
|
32
|
+
};
|
|
33
|
+
sampleSize: number;
|
|
34
|
+
timestamp: Date;
|
|
35
|
+
environment?: {
|
|
36
|
+
node?: string;
|
|
37
|
+
platform?: string;
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Baseline comparison result
|
|
42
|
+
*/
|
|
43
|
+
export interface BaselineComparison {
|
|
44
|
+
provider: string;
|
|
45
|
+
model: string;
|
|
46
|
+
operation: string;
|
|
47
|
+
current: LLMPerformanceMeasurement;
|
|
48
|
+
baseline: LLMPerformanceMeasurement | null;
|
|
49
|
+
improvement: {
|
|
50
|
+
latencyP50Change: number;
|
|
51
|
+
throughputChange: number;
|
|
52
|
+
costChange: number;
|
|
53
|
+
} | null;
|
|
54
|
+
meetsTarget: boolean;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* LLMBaselineTracker configuration
|
|
58
|
+
*/
|
|
59
|
+
export interface LLMBaselineTrackerConfig {
|
|
60
|
+
/** Database path. Default: .agentic-qe/llm-baselines.db */
|
|
61
|
+
dbPath?: string;
|
|
62
|
+
/** Minimum improvement target (%). Default: 10 */
|
|
63
|
+
minImprovementTarget?: number;
|
|
64
|
+
/** Enable debug logging */
|
|
65
|
+
debug?: boolean;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Tracks LLM provider performance baselines over time
|
|
69
|
+
*/
|
|
70
|
+
export declare class LLMBaselineTracker {
|
|
71
|
+
private db;
|
|
72
|
+
private readonly config;
|
|
73
|
+
private readonly logger;
|
|
74
|
+
private initialized;
|
|
75
|
+
constructor(config?: LLMBaselineTrackerConfig);
|
|
76
|
+
/**
|
|
77
|
+
* Initialize the tracker and create database schema
|
|
78
|
+
*/
|
|
79
|
+
initialize(): Promise<void>;
|
|
80
|
+
/**
|
|
81
|
+
* Record a new performance measurement
|
|
82
|
+
*/
|
|
83
|
+
recordMeasurement(measurement: Omit<LLMPerformanceMeasurement, 'id'>): LLMPerformanceMeasurement;
|
|
84
|
+
/**
|
|
85
|
+
* Set a measurement as the baseline for a provider/model/operation
|
|
86
|
+
*/
|
|
87
|
+
setBaseline(provider: string, model: string, operation: string, measurementId: string): void;
|
|
88
|
+
/**
|
|
89
|
+
* Get the current baseline for a provider/model/operation
|
|
90
|
+
*/
|
|
91
|
+
getBaseline(provider: string, model: string, operation: string): LLMPerformanceMeasurement | null;
|
|
92
|
+
/**
|
|
93
|
+
* Compare current measurement against baseline
|
|
94
|
+
*/
|
|
95
|
+
compareToBaseline(current: LLMPerformanceMeasurement): BaselineComparison;
|
|
96
|
+
/**
|
|
97
|
+
* Get all measurements for a provider/model
|
|
98
|
+
*/
|
|
99
|
+
getMeasurements(provider: string, model: string, operation?: string, limit?: number): LLMPerformanceMeasurement[];
|
|
100
|
+
/**
|
|
101
|
+
* Get summary statistics for a provider/model
|
|
102
|
+
*/
|
|
103
|
+
getSummary(provider: string, model: string): {
|
|
104
|
+
totalMeasurements: number;
|
|
105
|
+
avgLatencyP50: number;
|
|
106
|
+
avgThroughput: number;
|
|
107
|
+
totalCost: number;
|
|
108
|
+
lastMeasurement: Date | null;
|
|
109
|
+
};
|
|
110
|
+
/**
|
|
111
|
+
* Close the database connection
|
|
112
|
+
*/
|
|
113
|
+
close(): void;
|
|
114
|
+
private rowToMeasurement;
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Create a tracker instance (convenience function)
|
|
118
|
+
*/
|
|
119
|
+
export declare function createLLMBaselineTracker(config?: LLMBaselineTrackerConfig): LLMBaselineTracker;
|
|
120
|
+
//# sourceMappingURL=LLMBaselineTracker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LLMBaselineTracker.d.ts","sourceRoot":"","sources":["../../src/providers/LLMBaselineTracker.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,305 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* LLMBaselineTracker - Track LLM provider performance baselines over time
|
|
4
|
+
*
|
|
5
|
+
* Phase 0 integration: Establishes real performance baselines for LLM providers
|
|
6
|
+
* to replace unverified claims with measured data.
|
|
7
|
+
*
|
|
8
|
+
* Integrates with existing observability infrastructure:
|
|
9
|
+
* - Uses BaselineCollector patterns
|
|
10
|
+
* - Stores data in SQLite for historical tracking
|
|
11
|
+
* - Provides improvement target calculations
|
|
12
|
+
*
|
|
13
|
+
* @version 1.0.0
|
|
14
|
+
* @module providers/LLMBaselineTracker
|
|
15
|
+
*/
|
|
16
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
17
|
+
if (k2 === undefined) k2 = k;
|
|
18
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
19
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
20
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
21
|
+
}
|
|
22
|
+
Object.defineProperty(o, k2, desc);
|
|
23
|
+
}) : (function(o, m, k, k2) {
|
|
24
|
+
if (k2 === undefined) k2 = k;
|
|
25
|
+
o[k2] = m[k];
|
|
26
|
+
}));
|
|
27
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
28
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
29
|
+
}) : function(o, v) {
|
|
30
|
+
o["default"] = v;
|
|
31
|
+
});
|
|
32
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
33
|
+
var ownKeys = function(o) {
|
|
34
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
35
|
+
var ar = [];
|
|
36
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
37
|
+
return ar;
|
|
38
|
+
};
|
|
39
|
+
return ownKeys(o);
|
|
40
|
+
};
|
|
41
|
+
return function (mod) {
|
|
42
|
+
if (mod && mod.__esModule) return mod;
|
|
43
|
+
var result = {};
|
|
44
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
45
|
+
__setModuleDefault(result, mod);
|
|
46
|
+
return result;
|
|
47
|
+
};
|
|
48
|
+
})();
|
|
49
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
50
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
51
|
+
};
|
|
52
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
53
|
+
exports.LLMBaselineTracker = void 0;
|
|
54
|
+
exports.createLLMBaselineTracker = createLLMBaselineTracker;
|
|
55
|
+
const better_sqlite3_1 = __importDefault(require("better-sqlite3"));
|
|
56
|
+
const path = __importStar(require("path"));
|
|
57
|
+
const fs = __importStar(require("fs"));
|
|
58
|
+
const Logger_1 = require("../utils/Logger");
|
|
59
|
+
const SecureRandom_1 = require("../utils/SecureRandom");
|
|
60
|
+
/**
|
|
61
|
+
* Tracks LLM provider performance baselines over time
|
|
62
|
+
*/
|
|
63
|
+
class LLMBaselineTracker {
|
|
64
|
+
constructor(config = {}) {
|
|
65
|
+
this.db = null;
|
|
66
|
+
this.initialized = false;
|
|
67
|
+
this.logger = Logger_1.Logger.getInstance();
|
|
68
|
+
this.config = {
|
|
69
|
+
dbPath: config.dbPath || path.join(process.cwd(), '.agentic-qe', 'llm-baselines.db'),
|
|
70
|
+
minImprovementTarget: config.minImprovementTarget ?? 10,
|
|
71
|
+
debug: config.debug ?? false,
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Initialize the tracker and create database schema
|
|
76
|
+
*/
|
|
77
|
+
async initialize() {
|
|
78
|
+
if (this.initialized)
|
|
79
|
+
return;
|
|
80
|
+
// Ensure directory exists
|
|
81
|
+
const dir = path.dirname(this.config.dbPath);
|
|
82
|
+
if (!fs.existsSync(dir)) {
|
|
83
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
84
|
+
}
|
|
85
|
+
this.db = new better_sqlite3_1.default(this.config.dbPath);
|
|
86
|
+
// Create tables
|
|
87
|
+
this.db.exec(`
|
|
88
|
+
CREATE TABLE IF NOT EXISTS llm_measurements (
|
|
89
|
+
id TEXT PRIMARY KEY,
|
|
90
|
+
provider TEXT NOT NULL,
|
|
91
|
+
model TEXT NOT NULL,
|
|
92
|
+
operation TEXT NOT NULL,
|
|
93
|
+
latency_p50 REAL NOT NULL,
|
|
94
|
+
latency_p95 REAL NOT NULL,
|
|
95
|
+
latency_p99 REAL NOT NULL,
|
|
96
|
+
tokens_per_second REAL NOT NULL,
|
|
97
|
+
input_tokens INTEGER NOT NULL,
|
|
98
|
+
output_tokens INTEGER NOT NULL,
|
|
99
|
+
cost REAL NOT NULL,
|
|
100
|
+
error_rate REAL NOT NULL,
|
|
101
|
+
sample_size INTEGER NOT NULL,
|
|
102
|
+
timestamp TEXT NOT NULL,
|
|
103
|
+
environment TEXT,
|
|
104
|
+
created_at TEXT DEFAULT CURRENT_TIMESTAMP
|
|
105
|
+
);
|
|
106
|
+
|
|
107
|
+
CREATE INDEX IF NOT EXISTS idx_measurements_provider_model
|
|
108
|
+
ON llm_measurements(provider, model, operation);
|
|
109
|
+
CREATE INDEX IF NOT EXISTS idx_measurements_timestamp
|
|
110
|
+
ON llm_measurements(timestamp);
|
|
111
|
+
|
|
112
|
+
CREATE TABLE IF NOT EXISTS llm_baselines (
|
|
113
|
+
id TEXT PRIMARY KEY,
|
|
114
|
+
provider TEXT NOT NULL,
|
|
115
|
+
model TEXT NOT NULL,
|
|
116
|
+
operation TEXT NOT NULL,
|
|
117
|
+
measurement_id TEXT NOT NULL,
|
|
118
|
+
set_at TEXT NOT NULL,
|
|
119
|
+
UNIQUE(provider, model, operation),
|
|
120
|
+
FOREIGN KEY(measurement_id) REFERENCES llm_measurements(id)
|
|
121
|
+
);
|
|
122
|
+
`);
|
|
123
|
+
this.initialized = true;
|
|
124
|
+
if (this.config.debug) {
|
|
125
|
+
this.logger.debug('LLMBaselineTracker initialized', { dbPath: this.config.dbPath });
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Record a new performance measurement
|
|
130
|
+
*/
|
|
131
|
+
recordMeasurement(measurement) {
|
|
132
|
+
if (!this.db)
|
|
133
|
+
throw new Error('Tracker not initialized');
|
|
134
|
+
const id = `llm-${SecureRandom_1.SecureRandom.uuid().slice(0, 8)}`;
|
|
135
|
+
const record = { ...measurement, id };
|
|
136
|
+
const stmt = this.db.prepare(`
|
|
137
|
+
INSERT INTO llm_measurements (
|
|
138
|
+
id, provider, model, operation,
|
|
139
|
+
latency_p50, latency_p95, latency_p99,
|
|
140
|
+
tokens_per_second, input_tokens, output_tokens,
|
|
141
|
+
cost, error_rate, sample_size, timestamp, environment
|
|
142
|
+
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
143
|
+
`);
|
|
144
|
+
stmt.run(id, record.provider, record.model, record.operation, record.metrics.latencyP50, record.metrics.latencyP95, record.metrics.latencyP99, record.metrics.tokensPerSecond, record.metrics.inputTokens, record.metrics.outputTokens, record.metrics.cost, record.metrics.errorRate, record.sampleSize, record.timestamp.toISOString(), record.environment ? JSON.stringify(record.environment) : null);
|
|
145
|
+
if (this.config.debug) {
|
|
146
|
+
this.logger.debug('Recorded LLM measurement', {
|
|
147
|
+
id,
|
|
148
|
+
provider: record.provider,
|
|
149
|
+
model: record.model,
|
|
150
|
+
latencyP50: record.metrics.latencyP50,
|
|
151
|
+
});
|
|
152
|
+
}
|
|
153
|
+
return record;
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* Set a measurement as the baseline for a provider/model/operation
|
|
157
|
+
*/
|
|
158
|
+
setBaseline(provider, model, operation, measurementId) {
|
|
159
|
+
if (!this.db)
|
|
160
|
+
throw new Error('Tracker not initialized');
|
|
161
|
+
const id = `baseline-${provider}-${model}-${operation}`.replace(/[^a-zA-Z0-9-]/g, '-');
|
|
162
|
+
const stmt = this.db.prepare(`
|
|
163
|
+
INSERT OR REPLACE INTO llm_baselines (id, provider, model, operation, measurement_id, set_at)
|
|
164
|
+
VALUES (?, ?, ?, ?, ?, ?)
|
|
165
|
+
`);
|
|
166
|
+
stmt.run(id, provider, model, operation, measurementId, new Date().toISOString());
|
|
167
|
+
this.logger.info('Set LLM baseline', { provider, model, operation, measurementId });
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* Get the current baseline for a provider/model/operation
|
|
171
|
+
*/
|
|
172
|
+
getBaseline(provider, model, operation) {
|
|
173
|
+
if (!this.db)
|
|
174
|
+
throw new Error('Tracker not initialized');
|
|
175
|
+
const row = this.db.prepare(`
|
|
176
|
+
SELECT m.* FROM llm_measurements m
|
|
177
|
+
JOIN llm_baselines b ON m.id = b.measurement_id
|
|
178
|
+
WHERE b.provider = ? AND b.model = ? AND b.operation = ?
|
|
179
|
+
`).get(provider, model, operation);
|
|
180
|
+
if (!row)
|
|
181
|
+
return null;
|
|
182
|
+
return this.rowToMeasurement(row);
|
|
183
|
+
}
|
|
184
|
+
/**
|
|
185
|
+
* Compare current measurement against baseline
|
|
186
|
+
*/
|
|
187
|
+
compareToBaseline(current) {
|
|
188
|
+
const baseline = this.getBaseline(current.provider, current.model, current.operation);
|
|
189
|
+
let improvement = null;
|
|
190
|
+
let meetsTarget = false;
|
|
191
|
+
if (baseline) {
|
|
192
|
+
const latencyChange = ((current.metrics.latencyP50 - baseline.metrics.latencyP50) / baseline.metrics.latencyP50) * 100;
|
|
193
|
+
const throughputChange = ((current.metrics.tokensPerSecond - baseline.metrics.tokensPerSecond) /
|
|
194
|
+
baseline.metrics.tokensPerSecond) *
|
|
195
|
+
100;
|
|
196
|
+
const costChange = baseline.metrics.cost > 0
|
|
197
|
+
? ((current.metrics.cost - baseline.metrics.cost) / baseline.metrics.cost) * 100
|
|
198
|
+
: 0;
|
|
199
|
+
improvement = {
|
|
200
|
+
latencyP50Change: latencyChange,
|
|
201
|
+
throughputChange,
|
|
202
|
+
costChange,
|
|
203
|
+
};
|
|
204
|
+
// Meets target if latency improved by at least minImprovementTarget%
|
|
205
|
+
// OR throughput improved by at least minImprovementTarget%
|
|
206
|
+
meetsTarget =
|
|
207
|
+
latencyChange <= -this.config.minImprovementTarget ||
|
|
208
|
+
throughputChange >= this.config.minImprovementTarget;
|
|
209
|
+
}
|
|
210
|
+
return {
|
|
211
|
+
provider: current.provider,
|
|
212
|
+
model: current.model,
|
|
213
|
+
operation: current.operation,
|
|
214
|
+
current,
|
|
215
|
+
baseline,
|
|
216
|
+
improvement,
|
|
217
|
+
meetsTarget,
|
|
218
|
+
};
|
|
219
|
+
}
|
|
220
|
+
/**
|
|
221
|
+
* Get all measurements for a provider/model
|
|
222
|
+
*/
|
|
223
|
+
getMeasurements(provider, model, operation, limit = 100) {
|
|
224
|
+
if (!this.db)
|
|
225
|
+
throw new Error('Tracker not initialized');
|
|
226
|
+
let query = `
|
|
227
|
+
SELECT * FROM llm_measurements
|
|
228
|
+
WHERE provider = ? AND model = ?
|
|
229
|
+
`;
|
|
230
|
+
const params = [provider, model];
|
|
231
|
+
if (operation) {
|
|
232
|
+
query += ' AND operation = ?';
|
|
233
|
+
params.push(operation);
|
|
234
|
+
}
|
|
235
|
+
query += ' ORDER BY timestamp DESC LIMIT ?';
|
|
236
|
+
params.push(limit);
|
|
237
|
+
const rows = this.db.prepare(query).all(...params);
|
|
238
|
+
return rows.map((row) => this.rowToMeasurement(row));
|
|
239
|
+
}
|
|
240
|
+
/**
|
|
241
|
+
* Get summary statistics for a provider/model
|
|
242
|
+
*/
|
|
243
|
+
getSummary(provider, model) {
|
|
244
|
+
if (!this.db)
|
|
245
|
+
throw new Error('Tracker not initialized');
|
|
246
|
+
const row = this.db
|
|
247
|
+
.prepare(`
|
|
248
|
+
SELECT
|
|
249
|
+
COUNT(*) as total,
|
|
250
|
+
AVG(latency_p50) as avg_latency,
|
|
251
|
+
AVG(tokens_per_second) as avg_throughput,
|
|
252
|
+
SUM(cost) as total_cost,
|
|
253
|
+
MAX(timestamp) as last_timestamp
|
|
254
|
+
FROM llm_measurements
|
|
255
|
+
WHERE provider = ? AND model = ?
|
|
256
|
+
`)
|
|
257
|
+
.get(provider, model);
|
|
258
|
+
return {
|
|
259
|
+
totalMeasurements: row.total || 0,
|
|
260
|
+
avgLatencyP50: row.avg_latency || 0,
|
|
261
|
+
avgThroughput: row.avg_throughput || 0,
|
|
262
|
+
totalCost: row.total_cost || 0,
|
|
263
|
+
lastMeasurement: row.last_timestamp ? new Date(row.last_timestamp) : null,
|
|
264
|
+
};
|
|
265
|
+
}
|
|
266
|
+
/**
|
|
267
|
+
* Close the database connection
|
|
268
|
+
*/
|
|
269
|
+
close() {
|
|
270
|
+
if (this.db) {
|
|
271
|
+
this.db.close();
|
|
272
|
+
this.db = null;
|
|
273
|
+
this.initialized = false;
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
rowToMeasurement(row) {
|
|
277
|
+
return {
|
|
278
|
+
id: row.id,
|
|
279
|
+
provider: row.provider,
|
|
280
|
+
model: row.model,
|
|
281
|
+
operation: row.operation,
|
|
282
|
+
metrics: {
|
|
283
|
+
latencyP50: row.latency_p50,
|
|
284
|
+
latencyP95: row.latency_p95,
|
|
285
|
+
latencyP99: row.latency_p99,
|
|
286
|
+
tokensPerSecond: row.tokens_per_second,
|
|
287
|
+
inputTokens: row.input_tokens,
|
|
288
|
+
outputTokens: row.output_tokens,
|
|
289
|
+
cost: row.cost,
|
|
290
|
+
errorRate: row.error_rate,
|
|
291
|
+
},
|
|
292
|
+
sampleSize: row.sample_size,
|
|
293
|
+
timestamp: new Date(row.timestamp),
|
|
294
|
+
environment: row.environment ? JSON.parse(row.environment) : undefined,
|
|
295
|
+
};
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
exports.LLMBaselineTracker = LLMBaselineTracker;
|
|
299
|
+
/**
|
|
300
|
+
* Create a tracker instance (convenience function)
|
|
301
|
+
*/
|
|
302
|
+
function createLLMBaselineTracker(config) {
|
|
303
|
+
return new LLMBaselineTracker(config);
|
|
304
|
+
}
|
|
305
|
+
//# sourceMappingURL=LLMBaselineTracker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LLMBaselineTracker.js","sourceRoot":"","sources":["../../src/providers/LLMBaselineTracker.ts"],"names":[],"mappings":"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"}
|
|
@@ -55,6 +55,32 @@ export interface OpenRouterConfig extends LLMProviderConfig {
|
|
|
55
55
|
/** Enable auto-routing to cheapest model */
|
|
56
56
|
enableAutoRoute?: boolean;
|
|
57
57
|
}
|
|
58
|
+
/**
|
|
59
|
+
* Recommended models for different use cases
|
|
60
|
+
* Aligned with issue #142 LLM Independence roadmap
|
|
61
|
+
*
|
|
62
|
+
* @see https://github.com/proffesor-for-testing/agentic-qe/issues/142
|
|
63
|
+
*/
|
|
64
|
+
export declare const RECOMMENDED_MODELS: {
|
|
65
|
+
/** Devstral 2 2512 FREE - 123B, 256K context, FREE, best agentic coding */
|
|
66
|
+
readonly AGENTIC_CODING_FREE: "mistralai/devstral-2512:free";
|
|
67
|
+
/** Devstral Small 2505 - CHEAPEST ($0.06/$0.12 per M) */
|
|
68
|
+
readonly CHEAPEST_PAID: "mistralai/devstral-small-2505";
|
|
69
|
+
/** Devstral Small - 24B, 128K, good balance */
|
|
70
|
+
readonly LIGHTWEIGHT_CODING: "mistralai/devstral-small";
|
|
71
|
+
/** Devstral Medium - complex reasoning ($0.40/$2.00 per M) */
|
|
72
|
+
readonly COMPLEX_REASONING: "mistralai/devstral-medium";
|
|
73
|
+
/** Qwen 2.5 Coder 32B - well-tested, complex tasks */
|
|
74
|
+
readonly QWEN_CODER: "qwen/qwen-2.5-coder-32b-instruct";
|
|
75
|
+
/** Claude 3.5 Sonnet - highest quality */
|
|
76
|
+
readonly HIGH_QUALITY: "anthropic/claude-3.5-sonnet";
|
|
77
|
+
/** GPT-4o Mini - cost-effective vendor */
|
|
78
|
+
readonly COST_EFFECTIVE: "openai/gpt-4o-mini";
|
|
79
|
+
/** Primary FREE model for development */
|
|
80
|
+
readonly FREE: "mistralai/devstral-2512:free";
|
|
81
|
+
/** Alias for agentic coding */
|
|
82
|
+
readonly AGENTIC_CODING: "mistralai/devstral-2512:free";
|
|
83
|
+
};
|
|
58
84
|
/**
|
|
59
85
|
* OpenRouterProvider - OpenRouter API implementation of ILLMProvider
|
|
60
86
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"OpenRouterProvider.d.ts","sourceRoot":"","sources":["../../src/providers/OpenRouterProvider.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EACL,YAAY,EACZ,iBAAiB,EACjB,oBAAoB,EACpB,qBAAqB,EACrB,cAAc,EACd,mBAAmB,EACnB,oBAAoB,EACpB,oBAAoB,EACpB,eAAe,EACf,mBAAmB,EAEpB,MAAM,gBAAgB,CAAC;AAGxB;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,qDAAqD;IACrD,EAAE,EAAE,MAAM,CAAC;IACX,mBAAmB;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,6CAA6C;IAC7C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,qBAAqB;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,iCAAiC;IACjC,OAAO,EAAE;QACP,MAAM,EAAE,MAAM,CAAC;QACf,UAAU,EAAE,MAAM,CAAC;KACpB,CAAC;IACF,2BAA2B;IAC3B,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,sCAAsC;IACtC,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED;;GAEG;AACH,MAAM,WAAW,gBAAiB,SAAQ,iBAAiB;IACzD,2EAA2E;IAC3E,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,oEAAoE;IACpE,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,4CAA4C;IAC5C,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,qBAAqB;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,6CAA6C;IAC7C,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,8DAA8D;IAC9D,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,+DAA+D;IAC/D,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,4CAA4C;IAC5C,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;
|
|
1
|
+
{"version":3,"file":"OpenRouterProvider.d.ts","sourceRoot":"","sources":["../../src/providers/OpenRouterProvider.ts"],"names":[],"mappings":"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"}
|
|
@@ -13,22 +13,88 @@
|
|
|
13
13
|
* @version 1.0.0
|
|
14
14
|
*/
|
|
15
15
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
16
|
-
exports.OpenRouterProvider = void 0;
|
|
16
|
+
exports.OpenRouterProvider = exports.RECOMMENDED_MODELS = void 0;
|
|
17
17
|
exports.createOpenRouterProvider = createOpenRouterProvider;
|
|
18
18
|
const ILLMProvider_1 = require("./ILLMProvider");
|
|
19
19
|
const Logger_1 = require("../utils/Logger");
|
|
20
20
|
/**
|
|
21
21
|
* Default OpenRouter pricing (per million tokens)
|
|
22
22
|
* These are fallback values; actual prices come from the API
|
|
23
|
+
*
|
|
24
|
+
* Model selection aligned with issue #142 roadmap:
|
|
25
|
+
* - Local Dev: devstral-small (24B), qwen2.5-coder (32B)
|
|
26
|
+
* - Production: Devstral-2 (123B), Qwen3-Coder
|
|
23
27
|
*/
|
|
24
28
|
const DEFAULT_PRICING = {
|
|
29
|
+
// ===========================================
|
|
30
|
+
// FREE TIER - Best for development/testing
|
|
31
|
+
// ===========================================
|
|
32
|
+
// Devstral 2 2512 FREE - 123B dense, 256K context, best for agentic coding
|
|
33
|
+
'mistralai/devstral-2512:free': { input: 0, output: 0 },
|
|
34
|
+
// ===========================================
|
|
35
|
+
// PAID TIER - Devstral Models (cheapest to most expensive)
|
|
36
|
+
// ===========================================
|
|
37
|
+
// Devstral Small 2505 - CHEAPEST paid option ($0.06/$0.12 per M)
|
|
38
|
+
'mistralai/devstral-small-2505': { input: 0.06, output: 0.12 },
|
|
39
|
+
// Devstral Small - 24B, 128K context ($0.07/$0.28 per M)
|
|
40
|
+
'mistralai/devstral-small': { input: 0.07, output: 0.28 },
|
|
41
|
+
// Devstral 2512 paid - same model, paid tier ($0.15/$0.60 per M)
|
|
42
|
+
'mistralai/devstral-2512': { input: 0.15, output: 0.60 },
|
|
43
|
+
// Devstral Medium - high-performance ($0.40/$2.00 per M)
|
|
44
|
+
'mistralai/devstral-medium': { input: 0.40, output: 2.00 },
|
|
45
|
+
// ===========================================
|
|
46
|
+
// Qwen Coder Models (per issue #142 roadmap)
|
|
47
|
+
// ===========================================
|
|
48
|
+
'qwen/qwen-2.5-coder-32b-instruct': { input: 0.18, output: 0.18 },
|
|
49
|
+
'qwen/qwen3-coder-30b-a3b': { input: 0.10, output: 0.30 }, // MoE efficient
|
|
50
|
+
// ===========================================
|
|
51
|
+
// Vendor Models (fallback)
|
|
52
|
+
// ===========================================
|
|
25
53
|
'anthropic/claude-3.5-sonnet': { input: 3.0, output: 15.0 },
|
|
26
54
|
'anthropic/claude-3-haiku': { input: 0.25, output: 1.25 },
|
|
27
55
|
'openai/gpt-4o': { input: 2.5, output: 10.0 },
|
|
28
56
|
'openai/gpt-4o-mini': { input: 0.15, output: 0.6 },
|
|
29
57
|
'google/gemini-pro-1.5': { input: 1.25, output: 5.0 },
|
|
30
58
|
'meta-llama/llama-3.1-70b-instruct': { input: 0.52, output: 0.75 },
|
|
31
|
-
'auto': { input: 0.5, output: 2.0 },
|
|
59
|
+
'auto': { input: 0.5, output: 2.0 },
|
|
60
|
+
};
|
|
61
|
+
/**
|
|
62
|
+
* Recommended models for different use cases
|
|
63
|
+
* Aligned with issue #142 LLM Independence roadmap
|
|
64
|
+
*
|
|
65
|
+
* @see https://github.com/proffesor-for-testing/agentic-qe/issues/142
|
|
66
|
+
*/
|
|
67
|
+
exports.RECOMMENDED_MODELS = {
|
|
68
|
+
// ===========================================
|
|
69
|
+
// FREE TIER - Development & Testing
|
|
70
|
+
// ===========================================
|
|
71
|
+
/** Devstral 2 2512 FREE - 123B, 256K context, FREE, best agentic coding */
|
|
72
|
+
AGENTIC_CODING_FREE: 'mistralai/devstral-2512:free',
|
|
73
|
+
// ===========================================
|
|
74
|
+
// PAID TIER - Cost-effective options
|
|
75
|
+
// ===========================================
|
|
76
|
+
/** Devstral Small 2505 - CHEAPEST ($0.06/$0.12 per M) */
|
|
77
|
+
CHEAPEST_PAID: 'mistralai/devstral-small-2505',
|
|
78
|
+
/** Devstral Small - 24B, 128K, good balance */
|
|
79
|
+
LIGHTWEIGHT_CODING: 'mistralai/devstral-small',
|
|
80
|
+
/** Devstral Medium - complex reasoning ($0.40/$2.00 per M) */
|
|
81
|
+
COMPLEX_REASONING: 'mistralai/devstral-medium',
|
|
82
|
+
/** Qwen 2.5 Coder 32B - well-tested, complex tasks */
|
|
83
|
+
QWEN_CODER: 'qwen/qwen-2.5-coder-32b-instruct',
|
|
84
|
+
// ===========================================
|
|
85
|
+
// Vendor Models (highest quality fallback)
|
|
86
|
+
// ===========================================
|
|
87
|
+
/** Claude 3.5 Sonnet - highest quality */
|
|
88
|
+
HIGH_QUALITY: 'anthropic/claude-3.5-sonnet',
|
|
89
|
+
/** GPT-4o Mini - cost-effective vendor */
|
|
90
|
+
COST_EFFECTIVE: 'openai/gpt-4o-mini',
|
|
91
|
+
// ===========================================
|
|
92
|
+
// Aliases for convenience
|
|
93
|
+
// ===========================================
|
|
94
|
+
/** Primary FREE model for development */
|
|
95
|
+
FREE: 'mistralai/devstral-2512:free',
|
|
96
|
+
/** Alias for agentic coding */
|
|
97
|
+
AGENTIC_CODING: 'mistralai/devstral-2512:free',
|
|
32
98
|
};
|
|
33
99
|
/**
|
|
34
100
|
* OpenRouterProvider - OpenRouter API implementation of ILLMProvider
|
|
@@ -45,13 +111,16 @@ class OpenRouterProvider {
|
|
|
45
111
|
debug: config.debug ?? false,
|
|
46
112
|
timeout: config.timeout ?? 60000,
|
|
47
113
|
maxRetries: config.maxRetries ?? 3,
|
|
48
|
-
|
|
114
|
+
// Default to FREE Devstral 2 (123B, 256K context, best agentic coding)
|
|
115
|
+
defaultModel: config.defaultModel || exports.RECOMMENDED_MODELS.AGENTIC_CODING,
|
|
49
116
|
siteUrl: config.siteUrl || process.env.OPENROUTER_SITE_URL,
|
|
50
117
|
siteName: config.siteName || process.env.OPENROUTER_SITE_NAME || 'Agentic-QE-Fleet',
|
|
118
|
+
// Fallback chain: FREE → cheapest paid → complex → vendor
|
|
51
119
|
fallbackModels: config.fallbackModels || [
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
120
|
+
exports.RECOMMENDED_MODELS.CHEAPEST_PAID, // Devstral Small 2505 ($0.06/$0.12)
|
|
121
|
+
exports.RECOMMENDED_MODELS.LIGHTWEIGHT_CODING, // Devstral Small ($0.07/$0.28)
|
|
122
|
+
exports.RECOMMENDED_MODELS.COMPLEX_REASONING, // Devstral Medium ($0.40/$2.00)
|
|
123
|
+
exports.RECOMMENDED_MODELS.COST_EFFECTIVE, // GPT-4o Mini fallback
|
|
55
124
|
],
|
|
56
125
|
enableModelDiscovery: config.enableModelDiscovery ?? true,
|
|
57
126
|
baseUrl: config.baseUrl || 'https://openrouter.ai/api/v1',
|