@defai.digital/feedback-domain 13.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +38 -0
- package/dist/feedback-collector.d.ts +19 -0
- package/dist/feedback-collector.d.ts.map +1 -0
- package/dist/feedback-collector.js +239 -0
- package/dist/feedback-collector.js.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +10 -0
- package/dist/index.js.map +1 -0
- package/dist/score-adjuster.d.ts +24 -0
- package/dist/score-adjuster.d.ts.map +1 -0
- package/dist/score-adjuster.js +216 -0
- package/dist/score-adjuster.js.map +1 -0
- package/dist/types.d.ts +160 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +7 -0
- package/dist/types.js.map +1 -0
- package/package.json +29 -0
- package/src/feedback-collector.ts +313 -0
- package/src/index.ts +29 -0
- package/src/score-adjuster.ts +275 -0
- package/src/types.ts +191 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
Business Source License 1.1
|
|
2
|
+
|
|
3
|
+
Parameters
|
|
4
|
+
|
|
5
|
+
Licensor: DEFAI Private Limited
|
|
6
|
+
Licensed Work: AutomatosX
|
|
7
|
+
The Licensed Work is (c) 2024-2025 DEFAI Private Limited
|
|
8
|
+
Additional Use Grant: You may make production use of the Licensed Work,
|
|
9
|
+
provided that your organization has less than US$2,000,000 in annual gross
|
|
10
|
+
revenue in the prior fiscal year. "Production use" means use in a live
|
|
11
|
+
production environment to support business or operational activities for end
|
|
12
|
+
users.
|
|
13
|
+
Change Date: Four years after the release date of the Licensed Work version
|
|
14
|
+
Change License: Apache License, Version 2.0
|
|
15
|
+
|
|
16
|
+
Terms
|
|
17
|
+
|
|
18
|
+
The Licensor hereby grants you the right to copy, modify, create derivative
|
|
19
|
+
works, redistribute, and make non-production use of the Licensed Work. The
|
|
20
|
+
Licensor may make an Additional Use Grant, above, permitting other uses of the
|
|
21
|
+
Licensed Work. The rights granted to you under this license are subject to the
|
|
22
|
+
following condition.
|
|
23
|
+
|
|
24
|
+
If you make any use of the Licensed Work, you must ensure that the Licensed
|
|
25
|
+
Work, or any modified version of it, carries prominent notices stating that
|
|
26
|
+
you have modified the Licensed Work.
|
|
27
|
+
|
|
28
|
+
This license does not grant permission to use the Licensor's trademarks.
|
|
29
|
+
|
|
30
|
+
The Licensed Work is provided "as is", without warranty of any kind, express
|
|
31
|
+
or implied, including but not limited to the warranties of merchantability,
|
|
32
|
+
fitness for a particular purpose and noninfringement. In no event shall the
|
|
33
|
+
Licensor be liable for any claim, damages or other liability, whether in an
|
|
34
|
+
action of contract, tort or otherwise, arising from, out of or in connection
|
|
35
|
+
with the Licensed Work or the use or other dealings in the Licensed Work.
|
|
36
|
+
|
|
37
|
+
On the Change Date, the Licensed Work will be made available under the Change
|
|
38
|
+
License.
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Feedback Collector
|
|
3
|
+
*
|
|
4
|
+
* Collect and store feedback records.
|
|
5
|
+
*
|
|
6
|
+
* Invariants:
|
|
7
|
+
* - INV-FBK-001: Feedback records immutable
|
|
8
|
+
* - INV-FBK-100: No duplicate feedback
|
|
9
|
+
*/
|
|
10
|
+
import type { FeedbackCollector, FeedbackCollectorOptions, FeedbackStoragePort } from './types.js';
|
|
11
|
+
/**
|
|
12
|
+
* Create in-memory feedback storage
|
|
13
|
+
*/
|
|
14
|
+
export declare function createInMemoryFeedbackStorage(): FeedbackStoragePort;
|
|
15
|
+
/**
|
|
16
|
+
* Create feedback collector
|
|
17
|
+
*/
|
|
18
|
+
export declare function createFeedbackCollector(options: FeedbackCollectorOptions): FeedbackCollector;
|
|
19
|
+
//# sourceMappingURL=feedback-collector.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"feedback-collector.d.ts","sourceRoot":"","sources":["../src/feedback-collector.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAYH,OAAO,KAAK,EACV,iBAAiB,EACjB,wBAAwB,EACxB,mBAAmB,EACpB,MAAM,YAAY,CAAC;AAEpB;;GAEG;AACH,wBAAgB,6BAA6B,IAAI,mBAAmB,CAqEnE;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CACrC,OAAO,EAAE,wBAAwB,GAChC,iBAAiB,CA+MnB"}
|
|
@@ -0,0 +1,239 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Feedback Collector
|
|
3
|
+
*
|
|
4
|
+
* Collect and store feedback records.
|
|
5
|
+
*
|
|
6
|
+
* Invariants:
|
|
7
|
+
* - INV-FBK-001: Feedback records immutable
|
|
8
|
+
* - INV-FBK-100: No duplicate feedback
|
|
9
|
+
*/
|
|
10
|
+
import { createDefaultFeedbackLearningConfig, createTaskHash, } from '@defai.digital/contracts';
|
|
11
|
+
/**
|
|
12
|
+
* Create in-memory feedback storage
|
|
13
|
+
*/
|
|
14
|
+
export function createInMemoryFeedbackStorage() {
|
|
15
|
+
const records = new Map();
|
|
16
|
+
return {
|
|
17
|
+
async store(record) {
|
|
18
|
+
// INV-FBK-001: Records are immutable - just store, never update
|
|
19
|
+
records.set(record.feedbackId, record);
|
|
20
|
+
},
|
|
21
|
+
async get(feedbackId) {
|
|
22
|
+
return records.get(feedbackId) ?? null;
|
|
23
|
+
},
|
|
24
|
+
async list(options) {
|
|
25
|
+
let results = Array.from(records.values());
|
|
26
|
+
// Filter by agent
|
|
27
|
+
if (options?.agentId) {
|
|
28
|
+
results = results.filter((r) => r.selectedAgent === options.agentId);
|
|
29
|
+
}
|
|
30
|
+
// Filter by date
|
|
31
|
+
if (options?.since) {
|
|
32
|
+
const sinceDate = new Date(options.since);
|
|
33
|
+
results = results.filter((r) => new Date(r.timestamp) >= sinceDate);
|
|
34
|
+
}
|
|
35
|
+
// Sort by timestamp (newest first)
|
|
36
|
+
results.sort((a, b) => new Date(b.timestamp).getTime() - new Date(a.timestamp).getTime());
|
|
37
|
+
// Apply pagination
|
|
38
|
+
const offset = options?.offset ?? 0;
|
|
39
|
+
const limit = options?.limit ?? 100;
|
|
40
|
+
return results.slice(offset, offset + limit);
|
|
41
|
+
},
|
|
42
|
+
async count(options) {
|
|
43
|
+
let count = 0;
|
|
44
|
+
for (const record of records.values()) {
|
|
45
|
+
if (options?.agentId && record.selectedAgent !== options.agentId) {
|
|
46
|
+
continue;
|
|
47
|
+
}
|
|
48
|
+
if (options?.since && new Date(record.timestamp) < new Date(options.since)) {
|
|
49
|
+
continue;
|
|
50
|
+
}
|
|
51
|
+
count++;
|
|
52
|
+
}
|
|
53
|
+
return count;
|
|
54
|
+
},
|
|
55
|
+
async deleteOlderThan(date) {
|
|
56
|
+
const threshold = new Date(date);
|
|
57
|
+
let deleted = 0;
|
|
58
|
+
for (const [id, record] of records) {
|
|
59
|
+
if (new Date(record.timestamp) < threshold) {
|
|
60
|
+
records.delete(id);
|
|
61
|
+
deleted++;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
return deleted;
|
|
65
|
+
},
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Create feedback collector
|
|
70
|
+
*/
|
|
71
|
+
export function createFeedbackCollector(options) {
|
|
72
|
+
const { storage } = options;
|
|
73
|
+
// Config is available for future use - call it to get defaults
|
|
74
|
+
void (options.config ?? createDefaultFeedbackLearningConfig());
|
|
75
|
+
// Track recent submissions for deduplication
|
|
76
|
+
// INV-FBK-100: No duplicate feedback
|
|
77
|
+
const recentSubmissions = new Map();
|
|
78
|
+
const DEDUP_WINDOW_MS = 60000; // 1 minute
|
|
79
|
+
return {
|
|
80
|
+
async submit(input) {
|
|
81
|
+
// INV-FBK-100: Check for duplicates
|
|
82
|
+
const dedupKey = `${input.selectedAgent}:${createTaskHash(input.taskDescription)}`;
|
|
83
|
+
const lastSubmit = recentSubmissions.get(dedupKey);
|
|
84
|
+
const now = Date.now();
|
|
85
|
+
if (lastSubmit && now - lastSubmit < DEDUP_WINDOW_MS) {
|
|
86
|
+
throw new Error('Duplicate feedback submission detected');
|
|
87
|
+
}
|
|
88
|
+
// Create feedback record
|
|
89
|
+
const record = {
|
|
90
|
+
feedbackId: crypto.randomUUID(),
|
|
91
|
+
taskDescription: input.taskDescription,
|
|
92
|
+
taskHash: createTaskHash(input.taskDescription),
|
|
93
|
+
selectedAgent: input.selectedAgent,
|
|
94
|
+
feedbackType: input.feedbackType,
|
|
95
|
+
timestamp: new Date().toISOString(),
|
|
96
|
+
retryCount: 0,
|
|
97
|
+
};
|
|
98
|
+
// Add optional fields only if defined
|
|
99
|
+
if (input.recommendedAgent !== undefined) {
|
|
100
|
+
record.recommendedAgent = input.recommendedAgent;
|
|
101
|
+
}
|
|
102
|
+
if (input.rating !== undefined) {
|
|
103
|
+
record.rating = input.rating;
|
|
104
|
+
}
|
|
105
|
+
if (input.outcome !== undefined) {
|
|
106
|
+
record.outcome = input.outcome;
|
|
107
|
+
}
|
|
108
|
+
if (input.durationMs !== undefined) {
|
|
109
|
+
record.durationMs = input.durationMs;
|
|
110
|
+
}
|
|
111
|
+
if (input.userComment !== undefined) {
|
|
112
|
+
record.userComment = input.userComment;
|
|
113
|
+
}
|
|
114
|
+
if (input.sessionId !== undefined) {
|
|
115
|
+
record.sessionId = input.sessionId;
|
|
116
|
+
}
|
|
117
|
+
// Store the record
|
|
118
|
+
// INV-FBK-001: Immutable after this point
|
|
119
|
+
await storage.store(record);
|
|
120
|
+
// Track for deduplication
|
|
121
|
+
recentSubmissions.set(dedupKey, now);
|
|
122
|
+
// Cleanup old dedup entries - collect keys first to avoid concurrent modification
|
|
123
|
+
const keysToDelete = [];
|
|
124
|
+
for (const [key, time] of recentSubmissions) {
|
|
125
|
+
if (now - time > DEDUP_WINDOW_MS) {
|
|
126
|
+
keysToDelete.push(key);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
for (const key of keysToDelete) {
|
|
130
|
+
recentSubmissions.delete(key);
|
|
131
|
+
}
|
|
132
|
+
return record;
|
|
133
|
+
},
|
|
134
|
+
async getHistory(options) {
|
|
135
|
+
return storage.list(options);
|
|
136
|
+
},
|
|
137
|
+
async getAgentStats(agentId) {
|
|
138
|
+
const records = await storage.list({ agentId });
|
|
139
|
+
const totalFeedback = records.length;
|
|
140
|
+
const ratings = records.filter((r) => r.rating !== undefined).map((r) => r.rating);
|
|
141
|
+
const avgRating = ratings.length > 0 ? ratings.reduce((a, b) => a + b, 0) / ratings.length : undefined;
|
|
142
|
+
const outcomes = records.filter((r) => r.outcome !== undefined);
|
|
143
|
+
const successCount = outcomes.filter((r) => r.outcome === 'success').length;
|
|
144
|
+
const successRate = outcomes.length > 0 ? successCount / outcomes.length : 1;
|
|
145
|
+
const recommended = records.filter((r) => r.recommendedAgent !== undefined);
|
|
146
|
+
const acceptedCount = recommended.filter((r) => r.recommendedAgent === r.selectedAgent).length;
|
|
147
|
+
const recommendationAcceptRate = recommended.length > 0 ? acceptedCount / recommended.length : 1;
|
|
148
|
+
const durations = records
|
|
149
|
+
.filter((r) => r.durationMs !== undefined)
|
|
150
|
+
.map((r) => r.durationMs);
|
|
151
|
+
const avgDurationMs = durations.length > 0
|
|
152
|
+
? durations.reduce((a, b) => a + b, 0) / durations.length
|
|
153
|
+
: undefined;
|
|
154
|
+
// Extract top patterns
|
|
155
|
+
const patternCounts = new Map();
|
|
156
|
+
for (const record of records) {
|
|
157
|
+
const count = patternCounts.get(record.taskHash) ?? 0;
|
|
158
|
+
patternCounts.set(record.taskHash, count + 1);
|
|
159
|
+
}
|
|
160
|
+
const topPatterns = Array.from(patternCounts.entries())
|
|
161
|
+
.sort((a, b) => b[1] - a[1])
|
|
162
|
+
.slice(0, 10)
|
|
163
|
+
.map(([pattern]) => pattern);
|
|
164
|
+
const lastFeedback = records.length > 0
|
|
165
|
+
? records.reduce((latest, r) => new Date(r.timestamp) > new Date(latest.timestamp) ? r : latest).timestamp
|
|
166
|
+
: undefined;
|
|
167
|
+
return {
|
|
168
|
+
agentId,
|
|
169
|
+
totalFeedback,
|
|
170
|
+
avgRating,
|
|
171
|
+
successRate,
|
|
172
|
+
recommendationAcceptRate,
|
|
173
|
+
avgDurationMs,
|
|
174
|
+
topPatterns,
|
|
175
|
+
lastFeedback,
|
|
176
|
+
};
|
|
177
|
+
},
|
|
178
|
+
async getOverview() {
|
|
179
|
+
const allRecords = await storage.list({ limit: 10000 });
|
|
180
|
+
const totalFeedback = allRecords.length;
|
|
181
|
+
// Count by type
|
|
182
|
+
const feedbackByType = {
|
|
183
|
+
explicit: 0,
|
|
184
|
+
implicit: 0,
|
|
185
|
+
outcome: 0,
|
|
186
|
+
};
|
|
187
|
+
for (const record of allRecords) {
|
|
188
|
+
feedbackByType[record.feedbackType] =
|
|
189
|
+
(feedbackByType[record.feedbackType] ?? 0) + 1;
|
|
190
|
+
}
|
|
191
|
+
// Average rating
|
|
192
|
+
const ratings = allRecords
|
|
193
|
+
.filter((r) => r.rating !== undefined)
|
|
194
|
+
.map((r) => r.rating);
|
|
195
|
+
const avgRating = ratings.length > 0 ? ratings.reduce((a, b) => a + b, 0) / ratings.length : undefined;
|
|
196
|
+
// Success rate
|
|
197
|
+
const outcomes = allRecords.filter((r) => r.outcome !== undefined);
|
|
198
|
+
const successCount = outcomes.filter((r) => r.outcome === 'success').length;
|
|
199
|
+
const overallSuccessRate = outcomes.length > 0 ? successCount / outcomes.length : 1;
|
|
200
|
+
// Top agents
|
|
201
|
+
const agentScores = new Map();
|
|
202
|
+
for (const record of allRecords) {
|
|
203
|
+
const score = agentScores.get(record.selectedAgent) ?? 0;
|
|
204
|
+
const delta = record.rating ?? (record.outcome === 'success' ? 5 : 1);
|
|
205
|
+
agentScores.set(record.selectedAgent, score + delta);
|
|
206
|
+
}
|
|
207
|
+
const topAgents = Array.from(agentScores.entries())
|
|
208
|
+
.sort((a, b) => b[1] - a[1])
|
|
209
|
+
.slice(0, 10)
|
|
210
|
+
.map(([agentId, score]) => ({ agentId, score }));
|
|
211
|
+
// Calculate trend (simplified)
|
|
212
|
+
const recentRecords = allRecords.slice(0, 20);
|
|
213
|
+
const olderRecords = allRecords.slice(20, 40);
|
|
214
|
+
const recentSuccessRate = recentRecords.length > 0
|
|
215
|
+
? recentRecords.filter((r) => r.outcome === 'success').length / recentRecords.length
|
|
216
|
+
: 1;
|
|
217
|
+
const olderSuccessRate = olderRecords.length > 0
|
|
218
|
+
? olderRecords.filter((r) => r.outcome === 'success').length / olderRecords.length
|
|
219
|
+
: 1;
|
|
220
|
+
let recentTrend = 'stable';
|
|
221
|
+
if (recentSuccessRate > olderSuccessRate + 0.1) {
|
|
222
|
+
recentTrend = 'improving';
|
|
223
|
+
}
|
|
224
|
+
else if (recentSuccessRate < olderSuccessRate - 0.1) {
|
|
225
|
+
recentTrend = 'declining';
|
|
226
|
+
}
|
|
227
|
+
return {
|
|
228
|
+
totalFeedback,
|
|
229
|
+
feedbackByType: feedbackByType,
|
|
230
|
+
avgRating,
|
|
231
|
+
overallSuccessRate,
|
|
232
|
+
topAgents,
|
|
233
|
+
recentTrend,
|
|
234
|
+
lastUpdated: new Date().toISOString(),
|
|
235
|
+
};
|
|
236
|
+
},
|
|
237
|
+
};
|
|
238
|
+
}
|
|
239
|
+
//# sourceMappingURL=feedback-collector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"feedback-collector.js","sourceRoot":"","sources":["../src/feedback-collector.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Feedback Learning Domain
|
|
3
|
+
*
|
|
4
|
+
* Agent feedback collection and learning system.
|
|
5
|
+
*/
|
|
6
|
+
export type { FeedbackStoragePort, ScoreAdjustmentStoragePort, PatternMatcherPort, FeedbackCollectorOptions, ScoreAdjusterOptions, FeedbackCollector, ScoreAdjuster, } from './types.js';
|
|
7
|
+
export { createFeedbackCollector, createInMemoryFeedbackStorage, } from './feedback-collector.js';
|
|
8
|
+
export { createScoreAdjuster, createInMemoryAdjustmentStorage, createSimplePatternMatcher, } from './score-adjuster.js';
|
|
9
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,YAAY,EACV,mBAAmB,EACnB,0BAA0B,EAC1B,kBAAkB,EAClB,wBAAwB,EACxB,oBAAoB,EACpB,iBAAiB,EACjB,aAAa,GACd,MAAM,YAAY,CAAC;AAGpB,OAAO,EACL,uBAAuB,EACvB,6BAA6B,GAC9B,MAAM,yBAAyB,CAAC;AAGjC,OAAO,EACL,mBAAmB,EACnB,+BAA+B,EAC/B,0BAA0B,GAC3B,MAAM,qBAAqB,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Feedback Learning Domain
|
|
3
|
+
*
|
|
4
|
+
* Agent feedback collection and learning system.
|
|
5
|
+
*/
|
|
6
|
+
// Feedback Collector
|
|
7
|
+
export { createFeedbackCollector, createInMemoryFeedbackStorage, } from './feedback-collector.js';
|
|
8
|
+
// Score Adjuster
|
|
9
|
+
export { createScoreAdjuster, createInMemoryAdjustmentStorage, createSimplePatternMatcher, } from './score-adjuster.js';
|
|
10
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAaH,qBAAqB;AACrB,OAAO,EACL,uBAAuB,EACvB,6BAA6B,GAC9B,MAAM,yBAAyB,CAAC;AAEjC,iBAAiB;AACjB,OAAO,EACL,mBAAmB,EACnB,+BAA+B,EAC/B,0BAA0B,GAC3B,MAAM,qBAAqB,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Score Adjuster
|
|
3
|
+
*
|
|
4
|
+
* Calculate and apply score adjustments based on feedback.
|
|
5
|
+
*
|
|
6
|
+
* Invariants:
|
|
7
|
+
* - INV-FBK-002: Adjustments bounded (-0.5 to +0.5)
|
|
8
|
+
* - INV-FBK-003: Minimum sample count before adjustment
|
|
9
|
+
* - INV-FBK-004: Adjustments decay over time
|
|
10
|
+
*/
|
|
11
|
+
import type { ScoreAdjuster, ScoreAdjusterOptions, ScoreAdjustmentStoragePort, PatternMatcherPort } from './types.js';
|
|
12
|
+
/**
|
|
13
|
+
* Create in-memory score adjustment storage
|
|
14
|
+
*/
|
|
15
|
+
export declare function createInMemoryAdjustmentStorage(): ScoreAdjustmentStoragePort;
|
|
16
|
+
/**
|
|
17
|
+
* Create simple pattern matcher
|
|
18
|
+
*/
|
|
19
|
+
export declare function createSimplePatternMatcher(): PatternMatcherPort;
|
|
20
|
+
/**
|
|
21
|
+
* Create score adjuster
|
|
22
|
+
*/
|
|
23
|
+
export declare function createScoreAdjuster(options: ScoreAdjusterOptions): ScoreAdjuster;
|
|
24
|
+
//# sourceMappingURL=score-adjuster.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"score-adjuster.d.ts","sourceRoot":"","sources":["../src/score-adjuster.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAaH,OAAO,KAAK,EACV,aAAa,EACb,oBAAoB,EACpB,0BAA0B,EAC1B,kBAAkB,EACnB,MAAM,YAAY,CAAC;AAEpB;;GAEG;AACH,wBAAgB,+BAA+B,IAAI,0BAA0B,CAyC5E;AAED;;GAEG;AACH,wBAAgB,0BAA0B,IAAI,kBAAkB,CAiC/D;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,oBAAoB,GAAG,aAAa,CA8JhF"}
|
|
@@ -0,0 +1,216 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Score Adjuster
|
|
3
|
+
*
|
|
4
|
+
* Calculate and apply score adjustments based on feedback.
|
|
5
|
+
*
|
|
6
|
+
* Invariants:
|
|
7
|
+
* - INV-FBK-002: Adjustments bounded (-0.5 to +0.5)
|
|
8
|
+
* - INV-FBK-003: Minimum sample count before adjustment
|
|
9
|
+
* - INV-FBK-004: Adjustments decay over time
|
|
10
|
+
*/
|
|
11
|
+
import { createDefaultFeedbackLearningConfig, calculateDecayedAdjustment, shouldApplyAdjustment, createTaskHash, MAX_ADJUSTMENT, } from '@defai.digital/contracts';
|
|
12
|
+
/**
|
|
13
|
+
* Create in-memory score adjustment storage
|
|
14
|
+
*/
|
|
15
|
+
export function createInMemoryAdjustmentStorage() {
|
|
16
|
+
const adjustments = new Map();
|
|
17
|
+
function makeKey(agentId, taskPattern) {
|
|
18
|
+
return `${agentId}:${taskPattern}`;
|
|
19
|
+
}
|
|
20
|
+
return {
|
|
21
|
+
async get(agentId, taskPattern) {
|
|
22
|
+
return adjustments.get(makeKey(agentId, taskPattern)) ?? null;
|
|
23
|
+
},
|
|
24
|
+
async set(adjustment) {
|
|
25
|
+
adjustments.set(makeKey(adjustment.agentId, adjustment.taskPattern), adjustment);
|
|
26
|
+
},
|
|
27
|
+
async listForAgent(agentId) {
|
|
28
|
+
const results = [];
|
|
29
|
+
for (const adjustment of adjustments.values()) {
|
|
30
|
+
if (adjustment.agentId === agentId) {
|
|
31
|
+
results.push(adjustment);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
return results;
|
|
35
|
+
},
|
|
36
|
+
async deleteExpired() {
|
|
37
|
+
const now = new Date();
|
|
38
|
+
let deleted = 0;
|
|
39
|
+
for (const [key, adjustment] of adjustments) {
|
|
40
|
+
if (adjustment.expiresAt && new Date(adjustment.expiresAt) < now) {
|
|
41
|
+
adjustments.delete(key);
|
|
42
|
+
deleted++;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
return deleted;
|
|
46
|
+
},
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Create simple pattern matcher
|
|
51
|
+
*/
|
|
52
|
+
export function createSimplePatternMatcher() {
|
|
53
|
+
const patterns = new Map();
|
|
54
|
+
return {
|
|
55
|
+
async findMatches(taskDescription, _threshold) {
|
|
56
|
+
const taskHash = createTaskHash(taskDescription);
|
|
57
|
+
const results = [];
|
|
58
|
+
// Simple exact match on hash
|
|
59
|
+
const exactMatch = patterns.get(taskHash);
|
|
60
|
+
if (exactMatch) {
|
|
61
|
+
results.push(exactMatch);
|
|
62
|
+
}
|
|
63
|
+
// Could add fuzzy matching here in the future
|
|
64
|
+
return results;
|
|
65
|
+
},
|
|
66
|
+
async upsertPattern(pattern) {
|
|
67
|
+
patterns.set(pattern.patternId, pattern);
|
|
68
|
+
},
|
|
69
|
+
async getPattern(patternId) {
|
|
70
|
+
return patterns.get(patternId) ?? null;
|
|
71
|
+
},
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Create score adjuster
|
|
76
|
+
*/
|
|
77
|
+
export function createScoreAdjuster(options) {
|
|
78
|
+
const { adjustmentStorage, patternMatcher } = options;
|
|
79
|
+
const config = options.config ?? createDefaultFeedbackLearningConfig();
|
|
80
|
+
return {
|
|
81
|
+
async getAdjustment(agentId, taskDescription) {
|
|
82
|
+
if (!config.enabled) {
|
|
83
|
+
return 0;
|
|
84
|
+
}
|
|
85
|
+
const taskHash = createTaskHash(taskDescription);
|
|
86
|
+
const adjustment = await adjustmentStorage.get(agentId, taskHash);
|
|
87
|
+
if (!adjustment) {
|
|
88
|
+
// INV-FBK-202: Cold start - return neutral
|
|
89
|
+
return 0;
|
|
90
|
+
}
|
|
91
|
+
// INV-FBK-003: Check minimum sample count
|
|
92
|
+
if (!shouldApplyAdjustment(adjustment, config)) {
|
|
93
|
+
return 0;
|
|
94
|
+
}
|
|
95
|
+
// INV-FBK-004: Apply decay
|
|
96
|
+
return calculateDecayedAdjustment(adjustment, config);
|
|
97
|
+
},
|
|
98
|
+
async processNewFeedback(record) {
|
|
99
|
+
if (!config.enabled) {
|
|
100
|
+
return;
|
|
101
|
+
}
|
|
102
|
+
const { selectedAgent, taskHash, rating, outcome } = record;
|
|
103
|
+
// Calculate score delta based on feedback
|
|
104
|
+
let delta = 0;
|
|
105
|
+
if (rating !== undefined) {
|
|
106
|
+
// Map 1-5 rating to -0.5 to +0.5
|
|
107
|
+
delta = (rating - 3) / 4; // -0.5 to +0.5
|
|
108
|
+
}
|
|
109
|
+
else if (outcome !== undefined) {
|
|
110
|
+
switch (outcome) {
|
|
111
|
+
case 'success':
|
|
112
|
+
delta = 0.3;
|
|
113
|
+
break;
|
|
114
|
+
case 'partial':
|
|
115
|
+
delta = 0.1;
|
|
116
|
+
break;
|
|
117
|
+
case 'failure':
|
|
118
|
+
delta = -0.3;
|
|
119
|
+
break;
|
|
120
|
+
case 'cancelled':
|
|
121
|
+
delta = 0;
|
|
122
|
+
break;
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
// Get or create adjustment
|
|
126
|
+
let adjustment = await adjustmentStorage.get(selectedAgent, taskHash);
|
|
127
|
+
if (adjustment) {
|
|
128
|
+
// Update existing adjustment
|
|
129
|
+
// INV-FBK-201: Average conflicting feedback
|
|
130
|
+
const totalWeight = adjustment.sampleCount + 1;
|
|
131
|
+
const newValue = (adjustment.scoreAdjustment * adjustment.sampleCount + delta) / totalWeight;
|
|
132
|
+
// INV-FBK-002: Bound adjustment
|
|
133
|
+
const boundedValue = Math.max(-MAX_ADJUSTMENT, Math.min(MAX_ADJUSTMENT, newValue));
|
|
134
|
+
adjustment = {
|
|
135
|
+
...adjustment,
|
|
136
|
+
scoreAdjustment: boundedValue,
|
|
137
|
+
sampleCount: totalWeight,
|
|
138
|
+
confidence: Math.min(1, totalWeight / 10), // Confidence increases with samples
|
|
139
|
+
lastUpdated: new Date().toISOString(),
|
|
140
|
+
};
|
|
141
|
+
}
|
|
142
|
+
else {
|
|
143
|
+
// Create new adjustment
|
|
144
|
+
// INV-FBK-002: Bound initial adjustment
|
|
145
|
+
const boundedDelta = Math.max(-MAX_ADJUSTMENT, Math.min(MAX_ADJUSTMENT, delta));
|
|
146
|
+
adjustment = {
|
|
147
|
+
agentId: selectedAgent,
|
|
148
|
+
taskPattern: taskHash,
|
|
149
|
+
scoreAdjustment: boundedDelta,
|
|
150
|
+
sampleCount: 1,
|
|
151
|
+
confidence: 0.1,
|
|
152
|
+
lastUpdated: new Date().toISOString(),
|
|
153
|
+
};
|
|
154
|
+
}
|
|
155
|
+
await adjustmentStorage.set(adjustment);
|
|
156
|
+
// Update pattern stats
|
|
157
|
+
const pattern = await patternMatcher.getPattern(taskHash);
|
|
158
|
+
if (pattern) {
|
|
159
|
+
const agentScores = { ...pattern.agentScores };
|
|
160
|
+
agentScores[selectedAgent] = (agentScores[selectedAgent] ?? 0) + delta;
|
|
161
|
+
// Calculate new avgRating using ratingCount (not feedbackCount)
|
|
162
|
+
const currentRatingCount = pattern.ratingCount ?? 0;
|
|
163
|
+
const newRatingCount = rating !== undefined ? currentRatingCount + 1 : currentRatingCount;
|
|
164
|
+
const newAvgRating = rating !== undefined
|
|
165
|
+
? ((pattern.avgRating ?? rating) * currentRatingCount + rating) / newRatingCount
|
|
166
|
+
: pattern.avgRating;
|
|
167
|
+
// Calculate successRate using outcomeCount (only success/failure count)
|
|
168
|
+
const currentOutcomeCount = pattern.outcomeCount ?? 0;
|
|
169
|
+
const isSuccessOrFailure = outcome === 'success' || outcome === 'failure';
|
|
170
|
+
const newOutcomeCount = isSuccessOrFailure ? currentOutcomeCount + 1 : currentOutcomeCount;
|
|
171
|
+
const newSuccessRate = outcome === 'success'
|
|
172
|
+
? (pattern.successRate * currentOutcomeCount + 1) / newOutcomeCount
|
|
173
|
+
: outcome === 'failure'
|
|
174
|
+
? (pattern.successRate * currentOutcomeCount) / newOutcomeCount
|
|
175
|
+
: pattern.successRate; // Keep unchanged for partial/cancelled/undefined
|
|
176
|
+
await patternMatcher.upsertPattern({
|
|
177
|
+
...pattern,
|
|
178
|
+
agentScores,
|
|
179
|
+
feedbackCount: pattern.feedbackCount + 1,
|
|
180
|
+
ratingCount: newRatingCount,
|
|
181
|
+
outcomeCount: newOutcomeCount,
|
|
182
|
+
successRate: newSuccessRate,
|
|
183
|
+
avgRating: newAvgRating,
|
|
184
|
+
updatedAt: new Date().toISOString(),
|
|
185
|
+
});
|
|
186
|
+
}
|
|
187
|
+
else {
|
|
188
|
+
// Create new pattern
|
|
189
|
+
// Only count success/failure toward outcomeCount
|
|
190
|
+
const isSuccessOrFailure = outcome === 'success' || outcome === 'failure';
|
|
191
|
+
await patternMatcher.upsertPattern({
|
|
192
|
+
patternId: taskHash,
|
|
193
|
+
pattern: taskHash,
|
|
194
|
+
agentScores: { [selectedAgent]: delta },
|
|
195
|
+
feedbackCount: 1,
|
|
196
|
+
ratingCount: rating !== undefined ? 1 : 0,
|
|
197
|
+
outcomeCount: isSuccessOrFailure ? 1 : 0,
|
|
198
|
+
// successRate only meaningful when outcomeCount > 0
|
|
199
|
+
successRate: outcome === 'success' ? 1 : outcome === 'failure' ? 0 : 0.5,
|
|
200
|
+
avgRating: rating,
|
|
201
|
+
createdAt: new Date().toISOString(),
|
|
202
|
+
updatedAt: new Date().toISOString(),
|
|
203
|
+
});
|
|
204
|
+
}
|
|
205
|
+
},
|
|
206
|
+
async getAgentAdjustments(agentId) {
|
|
207
|
+
return adjustmentStorage.listForAgent(agentId);
|
|
208
|
+
},
|
|
209
|
+
async applyDecay() {
|
|
210
|
+
// This would be called periodically to decay all adjustments
|
|
211
|
+
// For now, decay is applied on read via calculateDecayedAdjustment
|
|
212
|
+
await adjustmentStorage.deleteExpired();
|
|
213
|
+
},
|
|
214
|
+
};
|
|
215
|
+
}
|
|
216
|
+
//# sourceMappingURL=score-adjuster.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"score-adjuster.js","sourceRoot":"","sources":["../src/score-adjuster.ts"],"names":[],"mappings":"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"}
|