adaptive-memory-multi-model-router 2.14.40 → 2.14.41
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/ensemble/multiRoundDialog.d.ts +113 -0
- package/dist/ensemble/multiRoundDialog.js +284 -0
- package/dist/ensemble/multiRoundDialog.js.map +1 -0
- package/dist/ensemble/shapleyValue.d.ts +119 -0
- package/dist/ensemble/shapleyValue.js +280 -0
- package/dist/ensemble/shapleyValue.js.map +1 -0
- package/dist/ensemble.d.ts +18 -3
- package/dist/ensemble.js +90 -16
- package/dist/index.d.ts +3 -0
- package/dist/index.js +28 -1
- package/dist/integrations/scienceAdapter.d.ts +77 -0
- package/dist/integrations/scienceAdapter.js +8 -7
- package/dist/integrations/scienceAdapter.js.map +1 -0
- package/dist/tui/dashboard.js +1 -0
- package/dist/tui/dashboard.js.map +1 -1
- package/package.json +1 -1
- package/src/ensemble/multiRoundDialog.ts +374 -0
- package/src/ensemble/shapleyValue.ts +353 -0
- package/src/ensemble.ts +117 -26
- package/src/index.ts +24 -0
- package/src/integrations/scienceAdapter.ts +2 -2
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Multi-Round Dialog Optimization
|
|
3
|
+
*
|
|
4
|
+
* Tracks conversation context over multiple turns and optimizes routing
|
|
5
|
+
* decisions based on accumulated dialogue history.
|
|
6
|
+
*
|
|
7
|
+
* Key features:
|
|
8
|
+
* - Conversation state management
|
|
9
|
+
* - Topic tracking across turns
|
|
10
|
+
* - Model performance history per topic
|
|
11
|
+
* - Adaptive routing based on dialog state
|
|
12
|
+
*/
|
|
13
|
+
import { RouteDecision } from '../routing/advancedRouter';
|
|
14
|
+
export interface DialogTurn {
|
|
15
|
+
turn: number;
|
|
16
|
+
role: 'user' | 'assistant' | 'system';
|
|
17
|
+
content: string;
|
|
18
|
+
model?: string;
|
|
19
|
+
timestamp: number;
|
|
20
|
+
routingDecision?: RouteDecision;
|
|
21
|
+
}
|
|
22
|
+
export interface DialogState {
|
|
23
|
+
conversationId: string;
|
|
24
|
+
turns: DialogTurn[];
|
|
25
|
+
topics: Set<string>;
|
|
26
|
+
topicHistory: Map<string, number>;
|
|
27
|
+
modelPerformance: Map<string, Map<string, number>>;
|
|
28
|
+
currentTopic: string;
|
|
29
|
+
sentiment: 'positive' | 'negative' | 'neutral';
|
|
30
|
+
complexity: number;
|
|
31
|
+
startedAt: number;
|
|
32
|
+
lastTurnAt: number;
|
|
33
|
+
}
|
|
34
|
+
export interface MultiRoundConfig {
|
|
35
|
+
/** Max turns to keep in conversation context */
|
|
36
|
+
maxContextTurns: number;
|
|
37
|
+
/** Topic similarity threshold */
|
|
38
|
+
topicThreshold: number;
|
|
39
|
+
/** Performance window size */
|
|
40
|
+
performanceWindow: number;
|
|
41
|
+
/** Enable adaptive complexity tracking */
|
|
42
|
+
trackComplexity: boolean;
|
|
43
|
+
}
|
|
44
|
+
export declare class MultiRoundDialogOptimizer {
|
|
45
|
+
private config;
|
|
46
|
+
private dialogStates;
|
|
47
|
+
constructor(config?: Partial<MultiRoundConfig>);
|
|
48
|
+
/**
|
|
49
|
+
* Create or get existing dialog state
|
|
50
|
+
*/
|
|
51
|
+
getDialogState(conversationId: string): DialogState;
|
|
52
|
+
/**
|
|
53
|
+
* Create a fresh dialog state
|
|
54
|
+
*/
|
|
55
|
+
private createNewState;
|
|
56
|
+
/**
|
|
57
|
+
* Add a turn to the conversation
|
|
58
|
+
*/
|
|
59
|
+
addTurn(conversationId: string, role: 'user' | 'assistant' | 'system', content: string, model?: string, routingDecision?: RouteDecision): DialogState;
|
|
60
|
+
/**
|
|
61
|
+
* Extract topics from content using keyword analysis
|
|
62
|
+
*/
|
|
63
|
+
private extractTopics;
|
|
64
|
+
/**
|
|
65
|
+
* Get most frequently mentioned topic
|
|
66
|
+
*/
|
|
67
|
+
private getMostFrequentTopic;
|
|
68
|
+
/**
|
|
69
|
+
* Calculate complexity based on content and history
|
|
70
|
+
*/
|
|
71
|
+
private calculateComplexity;
|
|
72
|
+
/**
|
|
73
|
+
* Update model performance tracking for a topic
|
|
74
|
+
*/
|
|
75
|
+
private updateModelPerformance;
|
|
76
|
+
/**
|
|
77
|
+
* Score response quality (simple heuristic)
|
|
78
|
+
*/
|
|
79
|
+
private scoreResponseQuality;
|
|
80
|
+
/**
|
|
81
|
+
* Get best model for current topic based on history
|
|
82
|
+
*/
|
|
83
|
+
getBestModelForTopic(conversationId: string, availableModels: string[]): string | null;
|
|
84
|
+
/**
|
|
85
|
+
* Build optimized context for next query
|
|
86
|
+
*/
|
|
87
|
+
buildOptimizedContext(conversationId: string, newQuery: string): string;
|
|
88
|
+
/**
|
|
89
|
+
* Get routing hints based on dialog state
|
|
90
|
+
*/
|
|
91
|
+
getRoutingHints(conversationId: string): Record<string, number>;
|
|
92
|
+
/**
|
|
93
|
+
* Calculate topic affinity for routing
|
|
94
|
+
*/
|
|
95
|
+
private topicAffinityScore;
|
|
96
|
+
/**
|
|
97
|
+
* Clear dialog state
|
|
98
|
+
*/
|
|
99
|
+
clearState(conversationId: string): void;
|
|
100
|
+
/**
|
|
101
|
+
* Get dialog summary
|
|
102
|
+
*/
|
|
103
|
+
getSummary(conversationId: string): {
|
|
104
|
+
turns: number;
|
|
105
|
+
topics: string[];
|
|
106
|
+
currentTopic: string;
|
|
107
|
+
complexity: number;
|
|
108
|
+
duration: number;
|
|
109
|
+
modelsUsed: string[];
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
export declare const dialogOptimizer: MultiRoundDialogOptimizer;
|
|
113
|
+
export default dialogOptimizer;
|
|
@@ -0,0 +1,284 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Multi-Round Dialog Optimization
|
|
4
|
+
*
|
|
5
|
+
* Tracks conversation context over multiple turns and optimizes routing
|
|
6
|
+
* decisions based on accumulated dialogue history.
|
|
7
|
+
*
|
|
8
|
+
* Key features:
|
|
9
|
+
* - Conversation state management
|
|
10
|
+
* - Topic tracking across turns
|
|
11
|
+
* - Model performance history per topic
|
|
12
|
+
* - Adaptive routing based on dialog state
|
|
13
|
+
*/
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
exports.dialogOptimizer = exports.MultiRoundDialogOptimizer = void 0;
|
|
16
|
+
const DEFAULT_CONFIG = {
|
|
17
|
+
maxContextTurns: 20,
|
|
18
|
+
topicThreshold: 0.7,
|
|
19
|
+
performanceWindow: 10,
|
|
20
|
+
trackComplexity: true,
|
|
21
|
+
};
|
|
22
|
+
class MultiRoundDialogOptimizer {
|
|
23
|
+
config;
|
|
24
|
+
dialogStates = new Map();
|
|
25
|
+
constructor(config = {}) {
|
|
26
|
+
this.config = { ...DEFAULT_CONFIG, ...config };
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Create or get existing dialog state
|
|
30
|
+
*/
|
|
31
|
+
getDialogState(conversationId) {
|
|
32
|
+
if (!this.dialogStates.has(conversationId)) {
|
|
33
|
+
this.dialogStates.set(conversationId, this.createNewState(conversationId));
|
|
34
|
+
}
|
|
35
|
+
return this.dialogStates.get(conversationId);
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Create a fresh dialog state
|
|
39
|
+
*/
|
|
40
|
+
createNewState(conversationId) {
|
|
41
|
+
return {
|
|
42
|
+
conversationId,
|
|
43
|
+
turns: [],
|
|
44
|
+
topics: new Set(),
|
|
45
|
+
topicHistory: new Map(),
|
|
46
|
+
modelPerformance: new Map(),
|
|
47
|
+
currentTopic: 'general',
|
|
48
|
+
sentiment: 'neutral',
|
|
49
|
+
complexity: 0,
|
|
50
|
+
startedAt: Date.now(),
|
|
51
|
+
lastTurnAt: Date.now(),
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Add a turn to the conversation
|
|
56
|
+
*/
|
|
57
|
+
addTurn(conversationId, role, content, model, routingDecision) {
|
|
58
|
+
const state = this.getDialogState(conversationId);
|
|
59
|
+
const turn = {
|
|
60
|
+
turn: state.turns.length,
|
|
61
|
+
role,
|
|
62
|
+
content,
|
|
63
|
+
model,
|
|
64
|
+
timestamp: Date.now(),
|
|
65
|
+
routingDecision,
|
|
66
|
+
};
|
|
67
|
+
state.turns.push(turn);
|
|
68
|
+
state.lastTurnAt = Date.now();
|
|
69
|
+
// Update topic tracking
|
|
70
|
+
const topics = this.extractTopics(content);
|
|
71
|
+
topics.forEach(topic => {
|
|
72
|
+
state.topics.add(topic);
|
|
73
|
+
const count = state.topicHistory.get(topic) || 0;
|
|
74
|
+
state.topicHistory.set(topic, count + 1);
|
|
75
|
+
});
|
|
76
|
+
// Update current topic to most mentioned
|
|
77
|
+
if (topics.length > 0) {
|
|
78
|
+
state.currentTopic = this.getMostFrequentTopic(state.topicHistory);
|
|
79
|
+
}
|
|
80
|
+
// Update complexity
|
|
81
|
+
if (this.config.trackComplexity) {
|
|
82
|
+
state.complexity = this.calculateComplexity(content, state.turns);
|
|
83
|
+
}
|
|
84
|
+
// Update model performance if assistant turn with routing decision
|
|
85
|
+
if (role === 'assistant' && model && routingDecision) {
|
|
86
|
+
this.updateModelPerformance(state, model, content);
|
|
87
|
+
}
|
|
88
|
+
// Trim old turns if exceeding max
|
|
89
|
+
if (state.turns.length > this.config.maxContextTurns) {
|
|
90
|
+
state.turns = state.turns.slice(-this.config.maxContextTurns);
|
|
91
|
+
}
|
|
92
|
+
return state;
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Extract topics from content using keyword analysis
|
|
96
|
+
*/
|
|
97
|
+
extractTopics(content) {
|
|
98
|
+
const topics = [];
|
|
99
|
+
const lower = content.toLowerCase();
|
|
100
|
+
// Topic keywords
|
|
101
|
+
const topicPatterns = {
|
|
102
|
+
'coding': ['code', 'programming', 'function', 'debug', 'syntax', 'api', 'software'],
|
|
103
|
+
'data-science': ['data', 'analysis', 'ml', 'machine learning', 'model', 'training', 'dataset'],
|
|
104
|
+
'math': ['equation', 'calculation', 'math', 'number', 'formula', 'algebra'],
|
|
105
|
+
'science': ['experiment', 'hypothesis', 'research', 'physics', 'chemistry', 'biology'],
|
|
106
|
+
'business': ['revenue', 'market', 'customer', 'sales', 'strategy', 'business'],
|
|
107
|
+
'creative': ['story', 'creative', 'writing', 'art', 'design', 'poem'],
|
|
108
|
+
'security': ['security', 'authentication', 'encryption', 'vulnerability', 'auth'],
|
|
109
|
+
'devops': ['deploy', 'docker', 'kubernetes', 'ci/cd', 'infrastructure', 'cloud'],
|
|
110
|
+
};
|
|
111
|
+
for (const [topic, keywords] of Object.entries(topicPatterns)) {
|
|
112
|
+
for (const keyword of keywords) {
|
|
113
|
+
if (lower.includes(keyword)) {
|
|
114
|
+
topics.push(topic);
|
|
115
|
+
break;
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
return topics.length > 0 ? topics : ['general'];
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Get most frequently mentioned topic
|
|
123
|
+
*/
|
|
124
|
+
getMostFrequentTopic(topicHistory) {
|
|
125
|
+
let maxCount = 0;
|
|
126
|
+
let mostFrequent = 'general';
|
|
127
|
+
for (const [topic, count] of topicHistory) {
|
|
128
|
+
if (count > maxCount) {
|
|
129
|
+
maxCount = count;
|
|
130
|
+
mostFrequent = topic;
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
return mostFrequent;
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Calculate complexity based on content and history
|
|
137
|
+
*/
|
|
138
|
+
calculateComplexity(content, turns) {
|
|
139
|
+
// Base complexity from content length
|
|
140
|
+
let complexity = Math.min(1, content.length / 1000);
|
|
141
|
+
// Increase for technical terms
|
|
142
|
+
const technicalTerms = ['algorithm', 'architecture', 'optimization', 'performance', 'concurrent', 'distributed'];
|
|
143
|
+
for (const term of technicalTerms) {
|
|
144
|
+
if (content.toLowerCase().includes(term)) {
|
|
145
|
+
complexity += 0.1;
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
// Increase with conversation depth
|
|
149
|
+
complexity += Math.min(0.3, turns.length * 0.02);
|
|
150
|
+
return Math.min(1, complexity);
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Update model performance tracking for a topic
|
|
154
|
+
*/
|
|
155
|
+
updateModelPerformance(state, model, response) {
|
|
156
|
+
if (!state.modelPerformance.has(model)) {
|
|
157
|
+
state.modelPerformance.set(model, new Map());
|
|
158
|
+
}
|
|
159
|
+
const modelScores = state.modelPerformance.get(model);
|
|
160
|
+
const currentTopic = state.currentTopic;
|
|
161
|
+
// Simple success scoring based on response length and quality indicators
|
|
162
|
+
const qualityScore = this.scoreResponseQuality(response);
|
|
163
|
+
const currentScore = modelScores.get(currentTopic) || 0;
|
|
164
|
+
// Rolling average
|
|
165
|
+
const newScore = (currentScore * (this.config.performanceWindow - 1) + qualityScore) / this.config.performanceWindow;
|
|
166
|
+
modelScores.set(currentTopic, newScore);
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* Score response quality (simple heuristic)
|
|
170
|
+
*/
|
|
171
|
+
scoreResponseQuality(response) {
|
|
172
|
+
let score = 0.5; // Base score
|
|
173
|
+
// Longer responses often indicate more thorough answers
|
|
174
|
+
if (response.length > 200)
|
|
175
|
+
score += 0.1;
|
|
176
|
+
if (response.length > 500)
|
|
177
|
+
score += 0.1;
|
|
178
|
+
// Code blocks indicate technical content
|
|
179
|
+
if (response.includes('```'))
|
|
180
|
+
score += 0.1;
|
|
181
|
+
// Lists and structured content
|
|
182
|
+
if (response.includes('\n-'))
|
|
183
|
+
score += 0.05;
|
|
184
|
+
if (response.includes('\n1.'))
|
|
185
|
+
score += 0.05;
|
|
186
|
+
return Math.min(1, score);
|
|
187
|
+
}
|
|
188
|
+
/**
|
|
189
|
+
* Get best model for current topic based on history
|
|
190
|
+
*/
|
|
191
|
+
getBestModelForTopic(conversationId, availableModels) {
|
|
192
|
+
const state = this.getDialogState(conversationId);
|
|
193
|
+
const currentTopic = state.currentTopic;
|
|
194
|
+
let bestModel = null;
|
|
195
|
+
let bestScore = -1;
|
|
196
|
+
for (const model of availableModels) {
|
|
197
|
+
const modelScores = state.modelPerformance.get(model);
|
|
198
|
+
if (modelScores) {
|
|
199
|
+
const topicScore = modelScores.get(currentTopic) || 0.5;
|
|
200
|
+
if (topicScore > bestScore) {
|
|
201
|
+
bestScore = topicScore;
|
|
202
|
+
bestModel = model;
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
return bestModel;
|
|
207
|
+
}
|
|
208
|
+
/**
|
|
209
|
+
* Build optimized context for next query
|
|
210
|
+
*/
|
|
211
|
+
buildOptimizedContext(conversationId, newQuery) {
|
|
212
|
+
const state = this.getDialogState(conversationId);
|
|
213
|
+
const contextParts = [];
|
|
214
|
+
// Add conversation summary
|
|
215
|
+
contextParts.push(`Topic: ${state.currentTopic}`);
|
|
216
|
+
contextParts.push(`Complexity: ${(state.complexity * 100).toFixed(0)}%`);
|
|
217
|
+
contextParts.push(`Turns: ${state.turns.length}`);
|
|
218
|
+
// Add relevant recent turns (last 3-5)
|
|
219
|
+
const recentTurns = state.turns.slice(-5);
|
|
220
|
+
for (const turn of recentTurns) {
|
|
221
|
+
const prefix = turn.role === 'user' ? 'Q' : 'A';
|
|
222
|
+
const modelTag = turn.model ? `[${turn.model}]` : '';
|
|
223
|
+
contextParts.push(`${prefix}${modelTag}: ${turn.content.slice(0, 200)}`);
|
|
224
|
+
}
|
|
225
|
+
// Add new query
|
|
226
|
+
contextParts.push(`New query: ${newQuery}`);
|
|
227
|
+
return contextParts.join('\n');
|
|
228
|
+
}
|
|
229
|
+
/**
|
|
230
|
+
* Get routing hints based on dialog state
|
|
231
|
+
*/
|
|
232
|
+
getRoutingHints(conversationId) {
|
|
233
|
+
const state = this.getDialogState(conversationId);
|
|
234
|
+
return {
|
|
235
|
+
complexity: state.complexity,
|
|
236
|
+
topicAffinity: this.topicAffinityScore(state.currentTopic),
|
|
237
|
+
depth: Math.min(1, state.turns.length / 20),
|
|
238
|
+
sentiment: state.sentiment === 'negative' ? 0.8 : 0.5,
|
|
239
|
+
};
|
|
240
|
+
}
|
|
241
|
+
/**
|
|
242
|
+
* Calculate topic affinity for routing
|
|
243
|
+
*/
|
|
244
|
+
topicAffinityScore(topic) {
|
|
245
|
+
const topicScores = {
|
|
246
|
+
'coding': 0.9,
|
|
247
|
+
'security': 0.95,
|
|
248
|
+
'devops': 0.85,
|
|
249
|
+
'data-science': 0.8,
|
|
250
|
+
'math': 0.7,
|
|
251
|
+
'science': 0.75,
|
|
252
|
+
'business': 0.6,
|
|
253
|
+
'creative': 0.5,
|
|
254
|
+
'general': 0.5,
|
|
255
|
+
};
|
|
256
|
+
return topicScores[topic] || 0.5;
|
|
257
|
+
}
|
|
258
|
+
/**
|
|
259
|
+
* Clear dialog state
|
|
260
|
+
*/
|
|
261
|
+
clearState(conversationId) {
|
|
262
|
+
this.dialogStates.delete(conversationId);
|
|
263
|
+
}
|
|
264
|
+
/**
|
|
265
|
+
* Get dialog summary
|
|
266
|
+
*/
|
|
267
|
+
getSummary(conversationId) {
|
|
268
|
+
const state = this.getDialogState(conversationId);
|
|
269
|
+
return {
|
|
270
|
+
turns: state.turns.length,
|
|
271
|
+
topics: [...state.topics],
|
|
272
|
+
currentTopic: state.currentTopic,
|
|
273
|
+
complexity: state.complexity,
|
|
274
|
+
duration: Date.now() - state.startedAt,
|
|
275
|
+
modelsUsed: [...state.modelPerformance.keys()],
|
|
276
|
+
};
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
exports.MultiRoundDialogOptimizer = MultiRoundDialogOptimizer;
|
|
280
|
+
// Export singleton instance
|
|
281
|
+
exports.dialogOptimizer = new MultiRoundDialogOptimizer();
|
|
282
|
+
// Default export
|
|
283
|
+
exports.default = exports.dialogOptimizer;
|
|
284
|
+
//# sourceMappingURL=multiRoundDialog.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"multiRoundDialog.js","sourceRoot":"","sources":["../../src/ensemble/multiRoundDialog.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Enhanced Shapley Value Calculator for Ensemble Credit Assignment
|
|
3
|
+
*
|
|
4
|
+
* Incorporates game theory concepts for efficient and fair credit distribution:
|
|
5
|
+
*
|
|
6
|
+
* 1. ETHNOCENTRISM (In-group Loyalty Adjustment):
|
|
7
|
+
* - Players (models) have historical loyalty biases toward certain partners
|
|
8
|
+
* - Models that collaborate successfully develop "trust bonds"
|
|
9
|
+
* - Loyalty increases marginal contribution of trusted partners
|
|
10
|
+
* - Math: L[i,j] = exponential moving avg of historical success(i with j)
|
|
11
|
+
*
|
|
12
|
+
* 2. HANDICAP PRINCIPLE (Zahavi, 1975 - Costly Signaling):
|
|
13
|
+
* - Honest signals require costly investment
|
|
14
|
+
* - Models providing correct answers despite cost signal reliability
|
|
15
|
+
* - Math: H[i] = cost_i * reliability_i (handicap bonus)
|
|
16
|
+
*
|
|
17
|
+
* 3. CORE SHAPLEY VALUE:
|
|
18
|
+
* - φ_i = Σ_{S⊆N\{i}} (|S|! * (n-|S|-1)! / n!) * (v(S∪{i}) - v(S))
|
|
19
|
+
*
|
|
20
|
+
* Combined: φ_i* = α*Shapley_i + β*Loyalty_i + γ*Handicap_i
|
|
21
|
+
* Where α + β + γ = 1 (normalized weights)
|
|
22
|
+
*/
|
|
23
|
+
export interface ShapleyConfig {
|
|
24
|
+
nPermutations?: number;
|
|
25
|
+
useMonteCarlo?: boolean;
|
|
26
|
+
alpha?: number;
|
|
27
|
+
beta?: number;
|
|
28
|
+
gamma?: number;
|
|
29
|
+
}
|
|
30
|
+
export interface ModelContribution {
|
|
31
|
+
modelId: string;
|
|
32
|
+
shapleyValue: number;
|
|
33
|
+
loyaltyValue: number;
|
|
34
|
+
handicapValue: number;
|
|
35
|
+
combinedCredit: number;
|
|
36
|
+
marginalContributions: number[];
|
|
37
|
+
timesSelected: number;
|
|
38
|
+
averageMarginal: number;
|
|
39
|
+
reliabilityScore: number;
|
|
40
|
+
costInvested: number;
|
|
41
|
+
ethnocentrismBias: number;
|
|
42
|
+
}
|
|
43
|
+
type AccuracyFunction = (modelIds: string[]) => number;
|
|
44
|
+
export interface LoyaltyConfig {
|
|
45
|
+
decayRate?: number;
|
|
46
|
+
minInteractions?: number;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Loyalty Matrix L[i][j] = loyalty of model i toward model j (0-1)
|
|
50
|
+
* Models develop trust through successful collaborations
|
|
51
|
+
*/
|
|
52
|
+
export declare class LoyaltyMatrix {
|
|
53
|
+
private matrix;
|
|
54
|
+
private counts;
|
|
55
|
+
private config;
|
|
56
|
+
constructor(cfg?: LoyaltyConfig);
|
|
57
|
+
/** Record successful collaboration between two models */
|
|
58
|
+
recordSuccess(i: string, j: string, weight?: number): void;
|
|
59
|
+
/** Get loyalty of model i toward model j */
|
|
60
|
+
getLoyalty(i: string, j: string): number;
|
|
61
|
+
/** Ethnocentrism = average loyalty toward all partners */
|
|
62
|
+
ethnoCentrism(model: string, allModels: string[]): number;
|
|
63
|
+
}
|
|
64
|
+
export interface HandicapConfig {
|
|
65
|
+
costSensitivity?: number;
|
|
66
|
+
reliabilityWeight?: number;
|
|
67
|
+
minCostThreshold?: number;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Handicap Principle (Zahavi, 1975):
|
|
71
|
+
* "A handicapping signal is honest because it is costly to produce"
|
|
72
|
+
*
|
|
73
|
+
* Models spending more tokens on answers despite being correct signal reliability.
|
|
74
|
+
* H[i] = cost_i * reliability_i (higher = more reliable despite cost)
|
|
75
|
+
*/
|
|
76
|
+
export declare class HandicapCalculator {
|
|
77
|
+
private costs;
|
|
78
|
+
private correct;
|
|
79
|
+
private totals;
|
|
80
|
+
private config;
|
|
81
|
+
constructor(cfg?: HandicapConfig);
|
|
82
|
+
/** Record performance: cost spent and whether answer was correct */
|
|
83
|
+
record(model: string, cost: number, isCorrect: boolean): void;
|
|
84
|
+
/** Reliability = correct / total (prior probability of being right) */
|
|
85
|
+
reliability(model: string): number;
|
|
86
|
+
/** Average cost invested by model */
|
|
87
|
+
avgCost(model: string): number;
|
|
88
|
+
/**
|
|
89
|
+
* Handicap bonus = honest signal of quality
|
|
90
|
+
* H[i] = (cost_i - minCost) / maxCost * reliability_i
|
|
91
|
+
* Higher cost investment + higher reliability = higher handicap
|
|
92
|
+
*/
|
|
93
|
+
handicap(model: string, maxCost?: number): number;
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Combined enhanced Shapley value with ethnocentrism and handicap
|
|
97
|
+
* φ_i* = α*φ_i(Shapley) + β*ε_i(Ethnocentrism) + γ*H_i(Handicap)
|
|
98
|
+
*/
|
|
99
|
+
export declare function calculateEnhancedShapley(modelIds: string[], accuracyFn: AccuracyFunction, loyalty: LoyaltyMatrix, handicap: HandicapCalculator, cfg?: ShapleyConfig): Map<string, ModelContribution>;
|
|
100
|
+
/** Create ensemble accuracy function for Shapley calculation */
|
|
101
|
+
export declare function createAccuracyFn(groundTruth: string, getAnswer: (modelId: string) => string): AccuracyFunction;
|
|
102
|
+
/** Apply Shapley credit to voting weights */
|
|
103
|
+
export declare function applyCredit(contributions: Map<string, ModelContribution>, baseWeights: Record<string, number>, alpha?: number): Record<string, number>;
|
|
104
|
+
export interface ShapleySummary {
|
|
105
|
+
totalCredit: number;
|
|
106
|
+
perModel: ModelContribution[];
|
|
107
|
+
bestContributor: string;
|
|
108
|
+
worstContributor: string;
|
|
109
|
+
}
|
|
110
|
+
export declare function summarize(contributions: Map<string, ModelContribution>): ShapleySummary;
|
|
111
|
+
declare const _default: {
|
|
112
|
+
calculateEnhancedShapley: typeof calculateEnhancedShapley;
|
|
113
|
+
LoyaltyMatrix: typeof LoyaltyMatrix;
|
|
114
|
+
HandicapCalculator: typeof HandicapCalculator;
|
|
115
|
+
createAccuracyFn: typeof createAccuracyFn;
|
|
116
|
+
applyCredit: typeof applyCredit;
|
|
117
|
+
summarize: typeof summarize;
|
|
118
|
+
};
|
|
119
|
+
export default _default;
|