darwin-agents 0.4.4
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 +21 -0
- package/README.md +245 -0
- package/dist/agents/analyst.d.ts +11 -0
- package/dist/agents/analyst.d.ts.map +1 -0
- package/dist/agents/analyst.js +78 -0
- package/dist/agents/analyst.js.map +1 -0
- package/dist/agents/blog-writer.d.ts +13 -0
- package/dist/agents/blog-writer.d.ts.map +1 -0
- package/dist/agents/blog-writer.js +59 -0
- package/dist/agents/blog-writer.js.map +1 -0
- package/dist/agents/critic.d.ts +11 -0
- package/dist/agents/critic.d.ts.map +1 -0
- package/dist/agents/critic.js +57 -0
- package/dist/agents/critic.js.map +1 -0
- package/dist/agents/index.d.ts +15 -0
- package/dist/agents/index.d.ts.map +1 -0
- package/dist/agents/index.js +31 -0
- package/dist/agents/index.js.map +1 -0
- package/dist/agents/investigator-critic.d.ts +10 -0
- package/dist/agents/investigator-critic.d.ts.map +1 -0
- package/dist/agents/investigator-critic.js +78 -0
- package/dist/agents/investigator-critic.js.map +1 -0
- package/dist/agents/investigator.d.ts +13 -0
- package/dist/agents/investigator.d.ts.map +1 -0
- package/dist/agents/investigator.js +105 -0
- package/dist/agents/investigator.js.map +1 -0
- package/dist/agents/marketing.d.ts +13 -0
- package/dist/agents/marketing.d.ts.map +1 -0
- package/dist/agents/marketing.js +59 -0
- package/dist/agents/marketing.js.map +1 -0
- package/dist/agents/researcher.d.ts +11 -0
- package/dist/agents/researcher.d.ts.map +1 -0
- package/dist/agents/researcher.js +68 -0
- package/dist/agents/researcher.js.map +1 -0
- package/dist/agents/writer.d.ts +9 -0
- package/dist/agents/writer.d.ts.map +1 -0
- package/dist/agents/writer.js +47 -0
- package/dist/agents/writer.js.map +1 -0
- package/dist/cli/create.d.ts +11 -0
- package/dist/cli/create.d.ts.map +1 -0
- package/dist/cli/create.js +104 -0
- package/dist/cli/create.js.map +1 -0
- package/dist/cli/evolve.d.ts +13 -0
- package/dist/cli/evolve.d.ts.map +1 -0
- package/dist/cli/evolve.js +69 -0
- package/dist/cli/evolve.js.map +1 -0
- package/dist/cli/index.d.ts +13 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +84 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/init.d.ts +12 -0
- package/dist/cli/init.d.ts.map +1 -0
- package/dist/cli/init.js +68 -0
- package/dist/cli/init.js.map +1 -0
- package/dist/cli/run.d.ts +7 -0
- package/dist/cli/run.d.ts.map +1 -0
- package/dist/cli/run.js +371 -0
- package/dist/cli/run.js.map +1 -0
- package/dist/cli/status.d.ts +7 -0
- package/dist/cli/status.d.ts.map +1 -0
- package/dist/cli/status.js +123 -0
- package/dist/cli/status.js.map +1 -0
- package/dist/core/agent.d.ts +53 -0
- package/dist/core/agent.d.ts.map +1 -0
- package/dist/core/agent.js +172 -0
- package/dist/core/agent.js.map +1 -0
- package/dist/core/runner.d.ts +64 -0
- package/dist/core/runner.d.ts.map +1 -0
- package/dist/core/runner.js +203 -0
- package/dist/core/runner.js.map +1 -0
- package/dist/evolution/loop.d.ts +100 -0
- package/dist/evolution/loop.d.ts.map +1 -0
- package/dist/evolution/loop.js +424 -0
- package/dist/evolution/loop.js.map +1 -0
- package/dist/evolution/multi-critic.d.ts +58 -0
- package/dist/evolution/multi-critic.d.ts.map +1 -0
- package/dist/evolution/multi-critic.js +324 -0
- package/dist/evolution/multi-critic.js.map +1 -0
- package/dist/evolution/notifications.d.ts +32 -0
- package/dist/evolution/notifications.d.ts.map +1 -0
- package/dist/evolution/notifications.js +92 -0
- package/dist/evolution/notifications.js.map +1 -0
- package/dist/evolution/optimizer.d.ts +64 -0
- package/dist/evolution/optimizer.d.ts.map +1 -0
- package/dist/evolution/optimizer.js +223 -0
- package/dist/evolution/optimizer.js.map +1 -0
- package/dist/evolution/patterns.d.ts +63 -0
- package/dist/evolution/patterns.d.ts.map +1 -0
- package/dist/evolution/patterns.js +297 -0
- package/dist/evolution/patterns.js.map +1 -0
- package/dist/evolution/safety.d.ts +76 -0
- package/dist/evolution/safety.d.ts.map +1 -0
- package/dist/evolution/safety.js +182 -0
- package/dist/evolution/safety.js.map +1 -0
- package/dist/evolution/tracker.d.ts +48 -0
- package/dist/evolution/tracker.d.ts.map +1 -0
- package/dist/evolution/tracker.js +163 -0
- package/dist/evolution/tracker.js.map +1 -0
- package/dist/index.d.ts +32 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +35 -0
- package/dist/index.js.map +1 -0
- package/dist/memory/index.d.ts +32 -0
- package/dist/memory/index.d.ts.map +1 -0
- package/dist/memory/index.js +49 -0
- package/dist/memory/index.js.map +1 -0
- package/dist/memory/postgres-memory.d.ts +52 -0
- package/dist/memory/postgres-memory.d.ts.map +1 -0
- package/dist/memory/postgres-memory.js +515 -0
- package/dist/memory/postgres-memory.js.map +1 -0
- package/dist/memory/sqlite-memory.d.ts +36 -0
- package/dist/memory/sqlite-memory.d.ts.map +1 -0
- package/dist/memory/sqlite-memory.js +380 -0
- package/dist/memory/sqlite-memory.js.map +1 -0
- package/dist/providers/anthropic.d.ts +20 -0
- package/dist/providers/anthropic.d.ts.map +1 -0
- package/dist/providers/anthropic.js +82 -0
- package/dist/providers/anthropic.js.map +1 -0
- package/dist/providers/claude-cli.d.ts +35 -0
- package/dist/providers/claude-cli.d.ts.map +1 -0
- package/dist/providers/claude-cli.js +143 -0
- package/dist/providers/claude-cli.js.map +1 -0
- package/dist/providers/index.d.ts +39 -0
- package/dist/providers/index.d.ts.map +1 -0
- package/dist/providers/index.js +58 -0
- package/dist/providers/index.js.map +1 -0
- package/dist/providers/ollama.d.ts +17 -0
- package/dist/providers/ollama.d.ts.map +1 -0
- package/dist/providers/ollama.js +64 -0
- package/dist/providers/ollama.js.map +1 -0
- package/dist/providers/openai.d.ts +19 -0
- package/dist/providers/openai.d.ts.map +1 -0
- package/dist/providers/openai.js +75 -0
- package/dist/providers/openai.js.map +1 -0
- package/dist/providers/types.d.ts +62 -0
- package/dist/providers/types.d.ts.map +1 -0
- package/dist/providers/types.js +9 -0
- package/dist/providers/types.js.map +1 -0
- package/dist/types.d.ts +221 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +19 -0
- package/dist/types.js.map +1 -0
- package/package.json +81 -0
|
@@ -0,0 +1,223 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Darwin — Prompt Optimizer
|
|
3
|
+
*
|
|
4
|
+
* Uses an LLM (via injected callback) to generate improved prompt variants
|
|
5
|
+
* based on performance data and detected patterns.
|
|
6
|
+
*/
|
|
7
|
+
export class PromptOptimizer {
|
|
8
|
+
runPrompt;
|
|
9
|
+
constructor(runPrompt) {
|
|
10
|
+
this.runPrompt = runPrompt;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Generate an improved variant of an agent prompt.
|
|
14
|
+
*
|
|
15
|
+
* Builds a meta-prompt that includes the current prompt text, detected
|
|
16
|
+
* patterns (strengths, weaknesses, trends, anomalies), aggregated
|
|
17
|
+
* stats, tool context, per-category breakdowns, and recent critic feedback.
|
|
18
|
+
*/
|
|
19
|
+
async generateVariant(currentPrompt, patterns, stats, toolContext, categoryStats, recentFeedback) {
|
|
20
|
+
const metaPrompt = this.buildMetaPrompt(currentPrompt, patterns, stats, toolContext, categoryStats, recentFeedback);
|
|
21
|
+
const result = await this.runPrompt(metaPrompt);
|
|
22
|
+
// Strip any markdown fences the LLM might wrap around the output
|
|
23
|
+
let cleaned = this.cleanOutput(result);
|
|
24
|
+
// Enforce max length: 130% of current prompt or 3500, whichever is higher
|
|
25
|
+
const maxLength = Math.max(Math.round(currentPrompt.length * 1.3), 3500);
|
|
26
|
+
if (cleaned.length > maxLength) {
|
|
27
|
+
// Truncate at last complete sentence before limit
|
|
28
|
+
const truncated = cleaned.slice(0, maxLength);
|
|
29
|
+
const lastPeriod = truncated.lastIndexOf('.');
|
|
30
|
+
const lastNewline = truncated.lastIndexOf('\n');
|
|
31
|
+
const cutPoint = Math.max(lastPeriod, lastNewline);
|
|
32
|
+
if (cutPoint > maxLength * 0.7) {
|
|
33
|
+
cleaned = truncated.slice(0, cutPoint + 1);
|
|
34
|
+
}
|
|
35
|
+
// If we can't find a good cut point, just use the full prompt (it's too long but better than broken)
|
|
36
|
+
}
|
|
37
|
+
// Alignment erosion check: reject mutations that remove safety keywords
|
|
38
|
+
const alignmentIssue = this.checkAlignmentPreservation(currentPrompt, cleaned);
|
|
39
|
+
if (alignmentIssue) {
|
|
40
|
+
// Reject the mutation — return the original prompt unchanged
|
|
41
|
+
return currentPrompt;
|
|
42
|
+
}
|
|
43
|
+
return cleaned;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Assemble the meta-prompt that instructs the LLM how to improve
|
|
47
|
+
* the agent's system prompt.
|
|
48
|
+
*/
|
|
49
|
+
buildMetaPrompt(currentPrompt, patterns, stats, toolContext, categoryStats, recentFeedback) {
|
|
50
|
+
const patternSummary = this.formatPatterns(patterns);
|
|
51
|
+
const statsSummary = this.formatStats(stats);
|
|
52
|
+
const currentLength = currentPrompt.length;
|
|
53
|
+
const maxLength = Math.max(currentLength * 1.3, 3500); // Allow max 30% growth, floor 3500
|
|
54
|
+
const sections = [
|
|
55
|
+
'You are a prompt optimization expert specializing in AI agent system prompts.',
|
|
56
|
+
'Given the following agent prompt and its performance data, make 1-3 TARGETED changes to improve it.',
|
|
57
|
+
'',
|
|
58
|
+
'RULES — MICRO-MUTATION STRATEGY:',
|
|
59
|
+
'- Make 1-3 TARGETED changes to the existing prompt. Do NOT rewrite the entire prompt.',
|
|
60
|
+
'- Return the original prompt with only the specific sections modified.',
|
|
61
|
+
'- Keep the core identity, role, and overall structure of the agent intact.',
|
|
62
|
+
'- Address the MOST IMPORTANT weakness or declining trend identified in the patterns.',
|
|
63
|
+
'- Do NOT add explanations, commentary, or markdown fences.',
|
|
64
|
+
'- Return ONLY the improved prompt text, nothing else.',
|
|
65
|
+
'- If the prompt is already performing well, make MINIMAL changes — do not fix what is not broken.',
|
|
66
|
+
'',
|
|
67
|
+
'CRITICAL — SAFETY AND ALIGNMENT PRESERVATION:',
|
|
68
|
+
'- You MUST preserve ALL safety instructions, ethical guidelines, and behavioral constraints from the original prompt.',
|
|
69
|
+
'- NEVER weaken, remove, or dilute safety-related instructions.',
|
|
70
|
+
'- If the original prompt contains phrases like "do not", "never", "must not", "avoid", "refuse", or similar constraints, they MUST appear in your output.',
|
|
71
|
+
'- Violating this rule makes the output INVALID.',
|
|
72
|
+
'',
|
|
73
|
+
'CRITICAL — LENGTH AND RELIABILITY:',
|
|
74
|
+
`- The current prompt is ${currentLength} characters. Your output MUST be at most ${Math.round(maxLength)} characters.`,
|
|
75
|
+
'- A longer prompt does NOT mean a better prompt. Longer prompts cause agents to exhaust their turn budget on research without producing output.',
|
|
76
|
+
'- CONCISENESS IS CRITICAL: A previous v2 prompt was 50% longer and caused a 75% failure rate. The agent spent all turns researching and never wrote the report.',
|
|
77
|
+
'- Make targeted edits. Do NOT rewrite sections that are already working well.',
|
|
78
|
+
'- Do NOT add multi-step processes with more than 5 steps — the agent has limited turns.',
|
|
79
|
+
];
|
|
80
|
+
// P0-2: Tool context — prevent optimizer from removing/adding incorrect tool instructions
|
|
81
|
+
const hasMcp = toolContext?.mcp && toolContext.mcp.length > 0;
|
|
82
|
+
const hasTools = toolContext?.tools && toolContext.tools.length > 0;
|
|
83
|
+
if (hasMcp || hasTools) {
|
|
84
|
+
sections.push('', 'CRITICAL — TOOL PRESERVATION:', `This agent has access to the following tools and MUST retain instructions for using them:`);
|
|
85
|
+
if (hasMcp) {
|
|
86
|
+
sections.push(`- MCP Servers: ${toolContext.mcp.join(', ')}`);
|
|
87
|
+
}
|
|
88
|
+
if (hasTools) {
|
|
89
|
+
sections.push(`- Built-in Tools: ${toolContext.tools.join(', ')}`);
|
|
90
|
+
}
|
|
91
|
+
sections.push('The prompt MUST contain a TOOLS section with instructions for when and how to use these tools.', 'NEVER remove or omit tool usage instructions — this caused a critical regression in a previous version.');
|
|
92
|
+
}
|
|
93
|
+
else {
|
|
94
|
+
// Agent has NO tools — critical: don't add tool-dependent instructions
|
|
95
|
+
sections.push('', 'CRITICAL — NO-TOOL AGENT:', 'This agent has NO access to search tools, web browsing, or external APIs.', 'Do NOT add instructions like "research", "cite sources", "search for", or "look up" — the agent CANNOT do these things.', 'Focus improvements on writing quality, structure, and instructions the agent CAN follow without tools.');
|
|
96
|
+
}
|
|
97
|
+
sections.push('', '--- CURRENT PROMPT ---', currentPrompt, '', '--- PERFORMANCE STATS ---', statsSummary);
|
|
98
|
+
// P2-5: Per-category stats so optimizer sees topic-specific performance
|
|
99
|
+
if (categoryStats && categoryStats.length > 0) {
|
|
100
|
+
sections.push('', '--- PERFORMANCE BY CATEGORY ---');
|
|
101
|
+
for (const cat of categoryStats) {
|
|
102
|
+
sections.push(` ${cat.taskType}: ${cat.totalRuns} runs, avg quality ${cat.avgQuality.toFixed(1)}/10, avg sources ${cat.avgSourceCount.toFixed(1)}, success ${(cat.successRate * 100).toFixed(0)}%`);
|
|
103
|
+
}
|
|
104
|
+
sections.push('', 'NOTE: Performance varies by topic category. Do NOT over-optimize for one category at the expense of others.');
|
|
105
|
+
}
|
|
106
|
+
// Recent critic feedback — gives the optimizer concrete WHY behind low scores
|
|
107
|
+
if (recentFeedback && recentFeedback.length > 0) {
|
|
108
|
+
sections.push('', '--- RECENT CRITIC FEEDBACK ---', 'These are verbatim evaluations from the last runs. Use them to understand WHAT SPECIFICALLY went wrong.', 'Look for RECURRING issues across multiple reports — those are the highest priority to fix.', '');
|
|
109
|
+
for (let i = 0; i < recentFeedback.length; i++) {
|
|
110
|
+
sections.push(`[Run ${i + 1}]`);
|
|
111
|
+
sections.push(recentFeedback[i]);
|
|
112
|
+
sections.push('');
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
sections.push('', '--- DETECTED PATTERNS ---', patternSummary, '', '--- YOUR TASK ---', 'Output the improved prompt. Nothing else.');
|
|
116
|
+
return sections.join('\n');
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Format patterns into a human-readable summary for the meta-prompt.
|
|
120
|
+
*/
|
|
121
|
+
formatPatterns(patterns) {
|
|
122
|
+
if (patterns.length === 0) {
|
|
123
|
+
return 'No patterns detected yet.';
|
|
124
|
+
}
|
|
125
|
+
const grouped = {};
|
|
126
|
+
for (const p of patterns) {
|
|
127
|
+
const key = p.type;
|
|
128
|
+
if (!grouped[key]) {
|
|
129
|
+
grouped[key] = [];
|
|
130
|
+
}
|
|
131
|
+
grouped[key].push(p);
|
|
132
|
+
}
|
|
133
|
+
const sections = [];
|
|
134
|
+
for (const [type, items] of Object.entries(grouped)) {
|
|
135
|
+
const label = this.pluralize(type);
|
|
136
|
+
sections.push(`${label}:`);
|
|
137
|
+
for (const item of items) {
|
|
138
|
+
const taskLabel = item.taskType ? ` [${item.taskType}]` : '';
|
|
139
|
+
sections.push(` - ${item.description}${taskLabel} (confidence: ${(item.confidence * 100).toFixed(0)}%, evidence: ${item.evidence})`);
|
|
140
|
+
if (item.suggestion) {
|
|
141
|
+
sections.push(` Suggestion: ${item.suggestion}`);
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
return sections.join('\n');
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* Format stats into a readable summary.
|
|
149
|
+
*/
|
|
150
|
+
formatStats(stats) {
|
|
151
|
+
return [
|
|
152
|
+
`Total runs: ${stats.totalRuns}`,
|
|
153
|
+
`Success rate: ${(stats.successRate * 100).toFixed(1)}%`,
|
|
154
|
+
`Avg quality: ${stats.avgQuality.toFixed(2)} / 10`,
|
|
155
|
+
`Avg duration: ${(stats.avgDuration / 1000).toFixed(1)}s`,
|
|
156
|
+
`Avg sources cited: ${stats.avgSourceCount.toFixed(1)}`,
|
|
157
|
+
].join('\n');
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Remove markdown code fences if the LLM wraps the output.
|
|
161
|
+
*/
|
|
162
|
+
cleanOutput(raw) {
|
|
163
|
+
let cleaned = raw.trim();
|
|
164
|
+
// Strip ```...``` wrapping (with optional language tag)
|
|
165
|
+
const fenceMatch = cleaned.match(/^```(?:\w+)?\n([\s\S]*?)\n```$/);
|
|
166
|
+
if (fenceMatch) {
|
|
167
|
+
cleaned = fenceMatch[1].trim();
|
|
168
|
+
}
|
|
169
|
+
return cleaned;
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* Pluralize a pattern type label correctly.
|
|
173
|
+
* Handles: weakness -> Weaknesses, strength -> Strengths, trend -> Trends, anomaly -> Anomalies
|
|
174
|
+
*/
|
|
175
|
+
pluralize(type) {
|
|
176
|
+
const lookup = {
|
|
177
|
+
weakness: 'Weaknesses',
|
|
178
|
+
strength: 'Strengths',
|
|
179
|
+
trend: 'Trends',
|
|
180
|
+
anomaly: 'Anomalies',
|
|
181
|
+
};
|
|
182
|
+
return lookup[type] ?? type.charAt(0).toUpperCase() + type.slice(1) + 's';
|
|
183
|
+
}
|
|
184
|
+
/**
|
|
185
|
+
* Check that the mutated prompt preserves safety-related keywords from the original.
|
|
186
|
+
* Returns null if OK, or a rejection reason if safety keywords were removed.
|
|
187
|
+
*/
|
|
188
|
+
checkAlignmentPreservation(original, mutated) {
|
|
189
|
+
const safetyPatterns = [
|
|
190
|
+
/\bdo not\b/i,
|
|
191
|
+
/\bnever\b/i,
|
|
192
|
+
/\bmust not\b/i,
|
|
193
|
+
/\bavoid\b/i,
|
|
194
|
+
/\brefuse\b/i,
|
|
195
|
+
/\bprohibit/i,
|
|
196
|
+
/\bforbid/i,
|
|
197
|
+
/\bdo NOT\b/,
|
|
198
|
+
/\bNEVER\b/,
|
|
199
|
+
/\bMUST NOT\b/,
|
|
200
|
+
/\bsafety\b/i,
|
|
201
|
+
/\bethic/i,
|
|
202
|
+
/\balignment\b/i,
|
|
203
|
+
];
|
|
204
|
+
const originalLower = original.toLowerCase();
|
|
205
|
+
const mutatedLower = mutated.toLowerCase();
|
|
206
|
+
const removedKeywords = [];
|
|
207
|
+
for (const pattern of safetyPatterns) {
|
|
208
|
+
const originalMatches = originalLower.match(new RegExp(pattern.source, 'gi'));
|
|
209
|
+
const mutatedMatches = mutatedLower.match(new RegExp(pattern.source, 'gi'));
|
|
210
|
+
if (originalMatches && originalMatches.length > 0) {
|
|
211
|
+
const mutatedCount = mutatedMatches ? mutatedMatches.length : 0;
|
|
212
|
+
if (mutatedCount < originalMatches.length) {
|
|
213
|
+
removedKeywords.push(pattern.source.replace(/\\b/g, '').replace(/\\/g, ''));
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
if (removedKeywords.length > 0) {
|
|
218
|
+
return `Alignment erosion detected: safety keywords removed or reduced: ${removedKeywords.join(', ')}`;
|
|
219
|
+
}
|
|
220
|
+
return null;
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
//# sourceMappingURL=optimizer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"optimizer.js","sourceRoot":"","sources":["../../src/evolution/optimizer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Darwin — Pattern Detector
|
|
3
|
+
*
|
|
4
|
+
* Analyzes experiment history to detect performance patterns:
|
|
5
|
+
* strengths, weaknesses, trends, and anomalies.
|
|
6
|
+
*
|
|
7
|
+
* These patterns drive prompt optimization decisions.
|
|
8
|
+
*/
|
|
9
|
+
import type { DarwinPattern, MemoryProvider } from '../types.js';
|
|
10
|
+
export declare class PatternDetector {
|
|
11
|
+
private memory;
|
|
12
|
+
constructor(memory: MemoryProvider);
|
|
13
|
+
/**
|
|
14
|
+
* Detect patterns across all experiments for a given agent.
|
|
15
|
+
*
|
|
16
|
+
* Groups experiments by taskType, then looks for:
|
|
17
|
+
* - Strengths: categories where the agent consistently scores high
|
|
18
|
+
* - Weaknesses: categories where the agent consistently scores low
|
|
19
|
+
* - Trends: improving or declining performance over time
|
|
20
|
+
* - Anomalies: individual experiments far from the mean
|
|
21
|
+
*/
|
|
22
|
+
detectPatterns(agentName: string): Promise<DarwinPattern[]>;
|
|
23
|
+
private detectStrengths;
|
|
24
|
+
private detectWeaknesses;
|
|
25
|
+
/**
|
|
26
|
+
* Detect categories that underperform relative to the agent's overall average.
|
|
27
|
+
* This catches the "mediocre zone" (4.0-7.5) that absolute thresholds miss.
|
|
28
|
+
*
|
|
29
|
+
* Example: Writer has market=6.3, tech=7.1, webdesign=7.1 → overall ~6.8
|
|
30
|
+
* Market is 0.5 below average. With RELATIVE_WEAKNESS_GAP=1.0, it wouldn't trigger.
|
|
31
|
+
* But if we also check against the BEST category, market is 0.8 below tech/webdesign.
|
|
32
|
+
*
|
|
33
|
+
* Strategy: flag if category is >RELATIVE_WEAKNESS_GAP below the best category
|
|
34
|
+
* OR if category is below 7.0 with significant data (improvement opportunity).
|
|
35
|
+
*/
|
|
36
|
+
private detectRelativeWeaknesses;
|
|
37
|
+
/**
|
|
38
|
+
* Detect improving or declining quality trends across all experiments
|
|
39
|
+
* (sorted chronologically).
|
|
40
|
+
*/
|
|
41
|
+
private detectTrends;
|
|
42
|
+
/**
|
|
43
|
+
* Detect outlier experiments within a task category using
|
|
44
|
+
* standard deviation from the mean quality score.
|
|
45
|
+
*/
|
|
46
|
+
private detectAnomalies;
|
|
47
|
+
private groupByTaskType;
|
|
48
|
+
private avgQuality;
|
|
49
|
+
private successRate;
|
|
50
|
+
/**
|
|
51
|
+
* Calculate confidence from evidence count.
|
|
52
|
+
* More data points = higher confidence, capping at 1.0.
|
|
53
|
+
* Formula: min(count / 10, 1.0) — so 10+ experiments = full confidence.
|
|
54
|
+
*/
|
|
55
|
+
private confidenceFromCount;
|
|
56
|
+
/**
|
|
57
|
+
* Sample standard deviation (Bessel's correction, n-1).
|
|
58
|
+
* With small category sizes (MIN_CATEGORY_SIZE=2), population std
|
|
59
|
+
* would underestimate variance and over-report anomalies.
|
|
60
|
+
*/
|
|
61
|
+
private standardDeviation;
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=patterns.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"patterns.d.ts","sourceRoot":"","sources":["../../src/evolution/patterns.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAEV,aAAa,EACb,cAAc,EACf,MAAM,aAAa,CAAC;AAwBrB,qBAAa,eAAe;IAC1B,OAAO,CAAC,MAAM,CAAiB;gBAEnB,MAAM,EAAE,cAAc;IAIlC;;;;;;;;OAQG;IACG,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;IAkCjE,OAAO,CAAC,eAAe;IAmCvB,OAAO,CAAC,gBAAgB;IAmCxB;;;;;;;;;;OAUG;IACH,OAAO,CAAC,wBAAwB;IAkDhC;;;OAGG;IACH,OAAO,CAAC,YAAY;IAqDpB;;;OAGG;IACH,OAAO,CAAC,eAAe;IA+CvB,OAAO,CAAC,eAAe;IAgBvB,OAAO,CAAC,UAAU;IAWlB,OAAO,CAAC,WAAW;IAKnB;;;;OAIG;IACH,OAAO,CAAC,mBAAmB;IAI3B;;;;OAIG;IACH,OAAO,CAAC,iBAAiB;CAO1B"}
|
|
@@ -0,0 +1,297 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Darwin — Pattern Detector
|
|
3
|
+
*
|
|
4
|
+
* Analyzes experiment history to detect performance patterns:
|
|
5
|
+
* strengths, weaknesses, trends, and anomalies.
|
|
6
|
+
*
|
|
7
|
+
* These patterns drive prompt optimization decisions.
|
|
8
|
+
*/
|
|
9
|
+
/** Minimum experiments in a category before patterns are reported. */
|
|
10
|
+
const MIN_CATEGORY_SIZE = 2;
|
|
11
|
+
/** Score thresholds (on 0-10 quality scale). */
|
|
12
|
+
const STRENGTH_THRESHOLD = 7.5;
|
|
13
|
+
const WEAKNESS_THRESHOLD = 4.0;
|
|
14
|
+
/**
|
|
15
|
+
* Relative weakness: a category scoring >1.0 below the agent's overall average.
|
|
16
|
+
* This catches "mediocre" categories (e.g. 6.3 when others are 7.1).
|
|
17
|
+
*/
|
|
18
|
+
const RELATIVE_WEAKNESS_GAP = 1.0;
|
|
19
|
+
/** Minimum runs in a category before relative weakness is reported. */
|
|
20
|
+
const MIN_RELATIVE_WEAKNESS_RUNS = 5;
|
|
21
|
+
/** Anomaly detection: how many standard deviations away. */
|
|
22
|
+
const ANOMALY_SIGMA = 2.0;
|
|
23
|
+
/** Minimum experiments needed for trend detection. */
|
|
24
|
+
const MIN_TREND_LENGTH = 3;
|
|
25
|
+
export class PatternDetector {
|
|
26
|
+
memory;
|
|
27
|
+
constructor(memory) {
|
|
28
|
+
this.memory = memory;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Detect patterns across all experiments for a given agent.
|
|
32
|
+
*
|
|
33
|
+
* Groups experiments by taskType, then looks for:
|
|
34
|
+
* - Strengths: categories where the agent consistently scores high
|
|
35
|
+
* - Weaknesses: categories where the agent consistently scores low
|
|
36
|
+
* - Trends: improving or declining performance over time
|
|
37
|
+
* - Anomalies: individual experiments far from the mean
|
|
38
|
+
*/
|
|
39
|
+
async detectPatterns(agentName) {
|
|
40
|
+
const experiments = await this.memory.loadExperiments(agentName);
|
|
41
|
+
if (experiments.length === 0) {
|
|
42
|
+
return [];
|
|
43
|
+
}
|
|
44
|
+
const patterns = [];
|
|
45
|
+
// Group experiments by task type
|
|
46
|
+
const byCategory = this.groupByTaskType(experiments);
|
|
47
|
+
// Overall agent average (for relative weakness detection)
|
|
48
|
+
const overallAvg = this.avgQuality(experiments);
|
|
49
|
+
// Per-category analysis
|
|
50
|
+
byCategory.forEach((exps, taskType) => {
|
|
51
|
+
if (exps.length < MIN_CATEGORY_SIZE) {
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
patterns.push(...this.detectStrengths(taskType, exps));
|
|
55
|
+
patterns.push(...this.detectWeaknesses(taskType, exps));
|
|
56
|
+
patterns.push(...this.detectRelativeWeaknesses(taskType, exps, overallAvg));
|
|
57
|
+
patterns.push(...this.detectAnomalies(taskType, exps));
|
|
58
|
+
});
|
|
59
|
+
// Cross-category trend detection (chronological across all experiments)
|
|
60
|
+
patterns.push(...this.detectTrends(experiments));
|
|
61
|
+
return patterns;
|
|
62
|
+
}
|
|
63
|
+
// ─── Strength Detection ──────────────────────────────
|
|
64
|
+
detectStrengths(taskType, experiments) {
|
|
65
|
+
const patterns = [];
|
|
66
|
+
const avgQuality = this.avgQuality(experiments);
|
|
67
|
+
const successRate = this.successRate(experiments);
|
|
68
|
+
if (avgQuality >= STRENGTH_THRESHOLD) {
|
|
69
|
+
patterns.push({
|
|
70
|
+
type: 'strength',
|
|
71
|
+
taskType,
|
|
72
|
+
description: `High quality on "${taskType}" tasks (avg ${avgQuality.toFixed(1)}/10)`,
|
|
73
|
+
confidence: this.confidenceFromCount(experiments.length),
|
|
74
|
+
evidence: experiments.length,
|
|
75
|
+
suggestion: `Leverage this strength. The agent excels at ${taskType} tasks.`,
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
if (successRate >= 0.9 && experiments.length >= MIN_CATEGORY_SIZE) {
|
|
79
|
+
patterns.push({
|
|
80
|
+
type: 'strength',
|
|
81
|
+
taskType,
|
|
82
|
+
description: `${(successRate * 100).toFixed(0)}% success rate on "${taskType}" tasks`,
|
|
83
|
+
confidence: this.confidenceFromCount(experiments.length),
|
|
84
|
+
evidence: experiments.length,
|
|
85
|
+
suggestion: `Reliability on ${taskType} is excellent. Maintain current approach.`,
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
return patterns;
|
|
89
|
+
}
|
|
90
|
+
// ─── Weakness Detection ──────────────────────────────
|
|
91
|
+
detectWeaknesses(taskType, experiments) {
|
|
92
|
+
const patterns = [];
|
|
93
|
+
const avgQuality = this.avgQuality(experiments);
|
|
94
|
+
const successRate = this.successRate(experiments);
|
|
95
|
+
if (avgQuality > 0 && avgQuality <= WEAKNESS_THRESHOLD) {
|
|
96
|
+
patterns.push({
|
|
97
|
+
type: 'weakness',
|
|
98
|
+
taskType,
|
|
99
|
+
description: `Low quality on "${taskType}" tasks (avg ${avgQuality.toFixed(1)}/10)`,
|
|
100
|
+
confidence: this.confidenceFromCount(experiments.length),
|
|
101
|
+
evidence: experiments.length,
|
|
102
|
+
suggestion: `Improve instructions for ${taskType} tasks. Consider adding examples or constraints.`,
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
if (successRate < 0.5 && experiments.length >= MIN_CATEGORY_SIZE) {
|
|
106
|
+
patterns.push({
|
|
107
|
+
type: 'weakness',
|
|
108
|
+
taskType,
|
|
109
|
+
description: `Only ${(successRate * 100).toFixed(0)}% success rate on "${taskType}" tasks`,
|
|
110
|
+
confidence: this.confidenceFromCount(experiments.length),
|
|
111
|
+
evidence: experiments.length,
|
|
112
|
+
suggestion: `High failure rate on ${taskType}. Review error patterns and add guardrails.`,
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
return patterns;
|
|
116
|
+
}
|
|
117
|
+
// ─── Relative Weakness Detection ────────────────────
|
|
118
|
+
/**
|
|
119
|
+
* Detect categories that underperform relative to the agent's overall average.
|
|
120
|
+
* This catches the "mediocre zone" (4.0-7.5) that absolute thresholds miss.
|
|
121
|
+
*
|
|
122
|
+
* Example: Writer has market=6.3, tech=7.1, webdesign=7.1 → overall ~6.8
|
|
123
|
+
* Market is 0.5 below average. With RELATIVE_WEAKNESS_GAP=1.0, it wouldn't trigger.
|
|
124
|
+
* But if we also check against the BEST category, market is 0.8 below tech/webdesign.
|
|
125
|
+
*
|
|
126
|
+
* Strategy: flag if category is >RELATIVE_WEAKNESS_GAP below the best category
|
|
127
|
+
* OR if category is below 7.0 with significant data (improvement opportunity).
|
|
128
|
+
*/
|
|
129
|
+
detectRelativeWeaknesses(taskType, experiments, overallAvg) {
|
|
130
|
+
const patterns = [];
|
|
131
|
+
if (experiments.length < MIN_RELATIVE_WEAKNESS_RUNS) {
|
|
132
|
+
return patterns;
|
|
133
|
+
}
|
|
134
|
+
const avgQuality = this.avgQuality(experiments);
|
|
135
|
+
// Skip if already caught by absolute weakness threshold
|
|
136
|
+
if (avgQuality <= WEAKNESS_THRESHOLD) {
|
|
137
|
+
return patterns;
|
|
138
|
+
}
|
|
139
|
+
// Check 1: Category significantly below agent's overall average
|
|
140
|
+
const gapFromAvg = overallAvg - avgQuality;
|
|
141
|
+
if (gapFromAvg >= RELATIVE_WEAKNESS_GAP) {
|
|
142
|
+
patterns.push({
|
|
143
|
+
type: 'weakness',
|
|
144
|
+
taskType,
|
|
145
|
+
description: `"${taskType}" underperforms vs agent average: ${avgQuality.toFixed(1)}/10 vs ${overallAvg.toFixed(1)}/10 overall (gap: ${gapFromAvg.toFixed(1)})`,
|
|
146
|
+
confidence: this.confidenceFromCount(experiments.length),
|
|
147
|
+
evidence: experiments.length,
|
|
148
|
+
suggestion: `Improve "${taskType}" instructions. This category scores ${gapFromAvg.toFixed(1)} points below the agent's average.`,
|
|
149
|
+
});
|
|
150
|
+
}
|
|
151
|
+
// Check 2: Below "good" threshold with enough data → improvement opportunity
|
|
152
|
+
// 8.0 (not 7.0) — agents scoring 7.4-7.9 should trigger evolution, not coast
|
|
153
|
+
const GOOD_THRESHOLD = 8.0;
|
|
154
|
+
if (avgQuality < GOOD_THRESHOLD && experiments.length >= 10) {
|
|
155
|
+
patterns.push({
|
|
156
|
+
type: 'weakness',
|
|
157
|
+
taskType,
|
|
158
|
+
description: `"${taskType}" below good threshold: ${avgQuality.toFixed(1)}/10 (target: ${GOOD_THRESHOLD}/10, ${experiments.length} runs)`,
|
|
159
|
+
confidence: this.confidenceFromCount(experiments.length),
|
|
160
|
+
evidence: experiments.length,
|
|
161
|
+
suggestion: `"${taskType}" has enough data (${experiments.length} runs) to optimize. Target: raise from ${avgQuality.toFixed(1)} to ${GOOD_THRESHOLD}+.`,
|
|
162
|
+
});
|
|
163
|
+
}
|
|
164
|
+
return patterns;
|
|
165
|
+
}
|
|
166
|
+
// ─── Trend Detection ─────────────────────────────────
|
|
167
|
+
/**
|
|
168
|
+
* Detect improving or declining quality trends across all experiments
|
|
169
|
+
* (sorted chronologically).
|
|
170
|
+
*/
|
|
171
|
+
detectTrends(experiments) {
|
|
172
|
+
const patterns = [];
|
|
173
|
+
// Sort by start time
|
|
174
|
+
const sorted = [...experiments].sort((a, b) => new Date(a.startedAt).getTime() - new Date(b.startedAt).getTime());
|
|
175
|
+
// Need enough data points for trend detection
|
|
176
|
+
if (sorted.length < MIN_TREND_LENGTH) {
|
|
177
|
+
return patterns;
|
|
178
|
+
}
|
|
179
|
+
// Only use experiments with quality scores
|
|
180
|
+
const withQuality = sorted.filter((e) => e.metrics.qualityScore !== null);
|
|
181
|
+
if (withQuality.length < MIN_TREND_LENGTH) {
|
|
182
|
+
return patterns;
|
|
183
|
+
}
|
|
184
|
+
// Compare first half vs second half
|
|
185
|
+
const mid = Math.floor(withQuality.length / 2);
|
|
186
|
+
const firstHalf = withQuality.slice(0, mid);
|
|
187
|
+
const secondHalf = withQuality.slice(mid);
|
|
188
|
+
const avgFirst = this.avgQuality(firstHalf);
|
|
189
|
+
const avgSecond = this.avgQuality(secondHalf);
|
|
190
|
+
// Significant change threshold: 1.0 points on 10-point scale
|
|
191
|
+
const delta = avgSecond - avgFirst;
|
|
192
|
+
if (delta >= 1.0) {
|
|
193
|
+
patterns.push({
|
|
194
|
+
type: 'trend',
|
|
195
|
+
description: `Quality improving: ${avgFirst.toFixed(1)} -> ${avgSecond.toFixed(1)} (recent half)`,
|
|
196
|
+
confidence: this.confidenceFromCount(withQuality.length),
|
|
197
|
+
evidence: withQuality.length,
|
|
198
|
+
suggestion: 'Positive trend detected. Recent prompt changes are working well.',
|
|
199
|
+
});
|
|
200
|
+
}
|
|
201
|
+
else if (delta <= -1.0) {
|
|
202
|
+
patterns.push({
|
|
203
|
+
type: 'trend',
|
|
204
|
+
description: `Quality declining: ${avgFirst.toFixed(1)} -> ${avgSecond.toFixed(1)} (recent half)`,
|
|
205
|
+
confidence: this.confidenceFromCount(withQuality.length),
|
|
206
|
+
evidence: withQuality.length,
|
|
207
|
+
suggestion: 'Negative trend detected. Consider rolling back recent prompt changes.',
|
|
208
|
+
});
|
|
209
|
+
}
|
|
210
|
+
return patterns;
|
|
211
|
+
}
|
|
212
|
+
// ─── Anomaly Detection ───────────────────────────────
|
|
213
|
+
/**
|
|
214
|
+
* Detect outlier experiments within a task category using
|
|
215
|
+
* standard deviation from the mean quality score.
|
|
216
|
+
*/
|
|
217
|
+
detectAnomalies(taskType, experiments) {
|
|
218
|
+
const patterns = [];
|
|
219
|
+
const withQuality = experiments.filter((e) => e.metrics.qualityScore !== null);
|
|
220
|
+
if (withQuality.length < MIN_CATEGORY_SIZE) {
|
|
221
|
+
return patterns;
|
|
222
|
+
}
|
|
223
|
+
const scores = withQuality.map((e) => e.metrics.qualityScore);
|
|
224
|
+
const mean = scores.reduce((s, v) => s + v, 0) / scores.length;
|
|
225
|
+
const stdDev = this.standardDeviation(scores, mean);
|
|
226
|
+
// Skip if no variance (all scores identical)
|
|
227
|
+
if (stdDev === 0) {
|
|
228
|
+
return patterns;
|
|
229
|
+
}
|
|
230
|
+
for (const exp of withQuality) {
|
|
231
|
+
const score = exp.metrics.qualityScore;
|
|
232
|
+
const zScore = Math.abs(score - mean) / stdDev;
|
|
233
|
+
if (zScore >= ANOMALY_SIGMA) {
|
|
234
|
+
const direction = score > mean ? 'above' : 'below';
|
|
235
|
+
patterns.push({
|
|
236
|
+
type: 'anomaly',
|
|
237
|
+
taskType,
|
|
238
|
+
description: `Outlier in "${taskType}": score ${score.toFixed(1)} is ${zScore.toFixed(1)} sigma ${direction} mean (${mean.toFixed(1)})`,
|
|
239
|
+
confidence: Math.min(zScore / 3, 1), // Higher z-score = higher confidence
|
|
240
|
+
evidence: 1,
|
|
241
|
+
suggestion: direction === 'below'
|
|
242
|
+
? `Investigate why experiment ${exp.id} scored unusually low.`
|
|
243
|
+
: `Experiment ${exp.id} scored exceptionally well. Analyze what made it succeed.`,
|
|
244
|
+
});
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
return patterns;
|
|
248
|
+
}
|
|
249
|
+
// ─── Helpers ─────────────────────────────────────────
|
|
250
|
+
groupByTaskType(experiments) {
|
|
251
|
+
const map = new Map();
|
|
252
|
+
for (const exp of experiments) {
|
|
253
|
+
const key = exp.taskType || 'unknown';
|
|
254
|
+
const list = map.get(key);
|
|
255
|
+
if (list) {
|
|
256
|
+
list.push(exp);
|
|
257
|
+
}
|
|
258
|
+
else {
|
|
259
|
+
map.set(key, [exp]);
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
return map;
|
|
263
|
+
}
|
|
264
|
+
avgQuality(experiments) {
|
|
265
|
+
const withScore = experiments.filter((e) => e.metrics.qualityScore !== null);
|
|
266
|
+
if (withScore.length === 0)
|
|
267
|
+
return 0;
|
|
268
|
+
return (withScore.reduce((sum, e) => sum + (e.metrics.qualityScore ?? 0), 0) /
|
|
269
|
+
withScore.length);
|
|
270
|
+
}
|
|
271
|
+
successRate(experiments) {
|
|
272
|
+
if (experiments.length === 0)
|
|
273
|
+
return 0;
|
|
274
|
+
return experiments.filter((e) => e.success).length / experiments.length;
|
|
275
|
+
}
|
|
276
|
+
/**
|
|
277
|
+
* Calculate confidence from evidence count.
|
|
278
|
+
* More data points = higher confidence, capping at 1.0.
|
|
279
|
+
* Formula: min(count / 10, 1.0) — so 10+ experiments = full confidence.
|
|
280
|
+
*/
|
|
281
|
+
confidenceFromCount(count) {
|
|
282
|
+
return Math.min(count / 10, 1.0);
|
|
283
|
+
}
|
|
284
|
+
/**
|
|
285
|
+
* Sample standard deviation (Bessel's correction, n-1).
|
|
286
|
+
* With small category sizes (MIN_CATEGORY_SIZE=2), population std
|
|
287
|
+
* would underestimate variance and over-report anomalies.
|
|
288
|
+
*/
|
|
289
|
+
standardDeviation(values, mean) {
|
|
290
|
+
if (values.length <= 1)
|
|
291
|
+
return 0;
|
|
292
|
+
const squaredDiffs = values.map((v) => (v - mean) ** 2);
|
|
293
|
+
const avgSquaredDiff = squaredDiffs.reduce((s, v) => s + v, 0) / (values.length - 1);
|
|
294
|
+
return Math.sqrt(avgSquaredDiff);
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
//# sourceMappingURL=patterns.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"patterns.js","sourceRoot":"","sources":["../../src/evolution/patterns.ts"],"names":[],"mappings":"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"}
|