@just-every/ensemble 0.2.32 → 0.2.34
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/config/tool_execution.d.ts +1 -1
- package/dist/config/tool_execution.d.ts.map +1 -1
- package/dist/config/tool_execution.js +13 -4
- package/dist/config/tool_execution.js.map +1 -1
- package/dist/data/model_data.d.ts.map +1 -1
- package/dist/data/model_data.js +25 -26
- package/dist/data/model_data.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/model_providers/claude.d.ts.map +1 -1
- package/dist/model_providers/claude.js +45 -5
- package/dist/model_providers/claude.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/dist/utils/tool_result_processor.d.ts +5 -0
- package/dist/utils/tool_result_processor.d.ts.map +1 -1
- package/dist/utils/tool_result_processor.js +114 -9
- package/dist/utils/tool_result_processor.js.map +1 -1
- package/package.json +1 -1
|
@@ -3,4 +3,9 @@ export declare function createSummary(content: string, prompt: string): Promise<
|
|
|
3
3
|
export declare function processToolResult(toolCall: ToolCall, rawResult: string): Promise<string>;
|
|
4
4
|
export declare function shouldSummarizeResult(toolName: string, resultLength: number): boolean;
|
|
5
5
|
export declare function getTruncationMessage(toolName: string): string;
|
|
6
|
+
export declare function clearSummaryCache(): void;
|
|
7
|
+
export declare function getSummaryCacheStats(): {
|
|
8
|
+
size: number;
|
|
9
|
+
oldestEntry: number | null;
|
|
10
|
+
};
|
|
6
11
|
//# sourceMappingURL=tool_result_processor.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tool_result_processor.d.ts","sourceRoot":"","sources":["../../utils/tool_result_processor.ts"],"names":[],"mappings":"AAIA,OAAO,EACH,QAAQ,EAGX,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"tool_result_processor.d.ts","sourceRoot":"","sources":["../../utils/tool_result_processor.ts"],"names":[],"mappings":"AAIA,OAAO,EACH,QAAQ,EAGX,MAAM,mBAAmB,CAAC;AAuD3B,wBAAsB,aAAa,CAC/B,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,GACf,OAAO,CAAC,MAAM,CAAC,CAiFjB;AAKD,wBAAsB,iBAAiB,CACnC,QAAQ,EAAE,QAAQ,EAClB,SAAS,EAAE,MAAM,GAClB,OAAO,CAAC,MAAM,CAAC,CA6DjB;AAKD,wBAAgB,qBAAqB,CACjC,QAAQ,EAAE,MAAM,EAChB,YAAY,EAAE,MAAM,GACrB,OAAO,CAST;AAKD,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAQ7D;AAsDD,wBAAgB,iBAAiB,IAAI,IAAI,CAExC;AAKD,wBAAgB,oBAAoB,IAAI;IACpC,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9B,CAaA"}
|
|
@@ -1,6 +1,46 @@
|
|
|
1
1
|
import { MAX_RESULT_LENGTH, SKIP_SUMMARIZATION_TOOLS, TOOL_CONFIGS, } from '../config/tool_execution.js';
|
|
2
|
+
import crypto from 'crypto';
|
|
3
|
+
const SUMMARIZE_AT_CHARS = 5000;
|
|
4
|
+
const SUMMARIZE_TRUNCATE_CHARS = 200000;
|
|
5
|
+
const summaryCache = new Map();
|
|
6
|
+
const CACHE_EXPIRATION_MS = 60 * 60 * 1000;
|
|
7
|
+
const FAILURE_PATTERNS = [
|
|
8
|
+
/error|exception|failed|timeout|rejected|unable to|cannot|not found|invalid/gi,
|
|
9
|
+
/retry.*attempt|retrying|trying again/gi,
|
|
10
|
+
/no (?:such|valid) (?:file|directory|path|route)/gi,
|
|
11
|
+
/unexpected|unknown|unhandled/gi,
|
|
12
|
+
];
|
|
13
|
+
const MAX_RETRIES = 3;
|
|
14
|
+
const ERROR_FREQUENCY_THRESHOLD = 0.3;
|
|
15
|
+
function truncate(text, length = SUMMARIZE_TRUNCATE_CHARS, separator = '\n\n...[truncated for summary]...\n\n') {
|
|
16
|
+
text = text.trim();
|
|
17
|
+
if (text.length <= length) {
|
|
18
|
+
return text;
|
|
19
|
+
}
|
|
20
|
+
const beginLength = Math.floor(length * 0.3);
|
|
21
|
+
const endLength = length - beginLength - separator.length;
|
|
22
|
+
return (text.substring(0, beginLength) +
|
|
23
|
+
separator +
|
|
24
|
+
text.substring(text.length - endLength));
|
|
25
|
+
}
|
|
2
26
|
export async function createSummary(content, prompt) {
|
|
27
|
+
if (content.length <= SUMMARIZE_AT_CHARS) {
|
|
28
|
+
return content;
|
|
29
|
+
}
|
|
30
|
+
const contentHash = crypto
|
|
31
|
+
.createHash('sha256')
|
|
32
|
+
.update(content)
|
|
33
|
+
.digest('hex');
|
|
34
|
+
const cacheKey = `${contentHash}-${prompt.substring(0, 50)}`;
|
|
35
|
+
const cachedSummary = summaryCache.get(cacheKey);
|
|
36
|
+
if (cachedSummary &&
|
|
37
|
+
Date.now() - cachedSummary.timestamp < CACHE_EXPIRATION_MS) {
|
|
38
|
+
console.log(`Retrieved summary from cache for hash: ${contentHash.substring(0, 8)}...`);
|
|
39
|
+
return cachedSummary.summary;
|
|
40
|
+
}
|
|
3
41
|
try {
|
|
42
|
+
const truncatedContent = truncate(content, SUMMARIZE_TRUNCATE_CHARS);
|
|
43
|
+
const originalLines = content.split('\n').length;
|
|
4
44
|
const { ensembleRequest } = await import('../core/ensemble_request.js');
|
|
5
45
|
const messages = [
|
|
6
46
|
{
|
|
@@ -11,7 +51,7 @@ export async function createSummary(content, prompt) {
|
|
|
11
51
|
{
|
|
12
52
|
type: 'message',
|
|
13
53
|
role: 'user',
|
|
14
|
-
content:
|
|
54
|
+
content: truncatedContent,
|
|
15
55
|
},
|
|
16
56
|
];
|
|
17
57
|
const agent = {
|
|
@@ -20,15 +60,27 @@ export async function createSummary(content, prompt) {
|
|
|
20
60
|
};
|
|
21
61
|
let summary = '';
|
|
22
62
|
for await (const event of ensembleRequest(messages, agent)) {
|
|
23
|
-
if (event.type === '
|
|
63
|
+
if (event.type === 'message_complete' && 'content' in event) {
|
|
24
64
|
summary += event.content;
|
|
25
65
|
}
|
|
26
66
|
}
|
|
27
|
-
|
|
67
|
+
if (!summary) {
|
|
68
|
+
throw new Error('No summary generated');
|
|
69
|
+
}
|
|
70
|
+
const trimmedSummary = summary.trim();
|
|
71
|
+
const summaryLines = trimmedSummary.split('\n').length;
|
|
72
|
+
const metadata = `\n\n[Summarized output: ${originalLines} → ${summaryLines} lines, ${content.length} → ${trimmedSummary.length} chars]`;
|
|
73
|
+
const fullSummary = trimmedSummary + metadata;
|
|
74
|
+
summaryCache.set(cacheKey, {
|
|
75
|
+
summary: fullSummary,
|
|
76
|
+
timestamp: Date.now(),
|
|
77
|
+
});
|
|
78
|
+
return fullSummary;
|
|
28
79
|
}
|
|
29
80
|
catch (error) {
|
|
30
81
|
console.error('Error creating summary:', error);
|
|
31
|
-
|
|
82
|
+
const truncated = truncate(content, MAX_RESULT_LENGTH);
|
|
83
|
+
return truncated + '\n\n[Summary generation failed, output truncated]';
|
|
32
84
|
}
|
|
33
85
|
}
|
|
34
86
|
export async function processToolResult(toolCall, rawResult) {
|
|
@@ -41,17 +93,28 @@ export async function processToolResult(toolCall, rawResult) {
|
|
|
41
93
|
const maxLength = config.maxLength || MAX_RESULT_LENGTH;
|
|
42
94
|
if (skipSummarization) {
|
|
43
95
|
if (rawResult.length > maxLength) {
|
|
96
|
+
const truncatedResult = truncate(rawResult, maxLength);
|
|
44
97
|
const truncationMessage = config.truncationMessage ||
|
|
45
|
-
|
|
46
|
-
return
|
|
98
|
+
`\n\n[Output truncated: ${rawResult.length} → ${maxLength} chars]`;
|
|
99
|
+
return truncatedResult + truncationMessage;
|
|
47
100
|
}
|
|
48
101
|
return rawResult;
|
|
49
102
|
}
|
|
50
|
-
|
|
103
|
+
const summarizeThreshold = Math.max(maxLength, SUMMARIZE_AT_CHARS);
|
|
104
|
+
if (rawResult.length <= summarizeThreshold) {
|
|
51
105
|
return rawResult;
|
|
52
106
|
}
|
|
53
|
-
const
|
|
54
|
-
|
|
107
|
+
const potentialIssues = detectPotentialIssues(rawResult);
|
|
108
|
+
let summaryPrompt = `The following is the output of a tool call \`${toolName}(${toolCall.function.arguments})\` used by an AI agent in an autonomous system. Focus on summarizing both the overall output and the final result of the tool. Your summary will be used to understand what the result of the tool call was.`;
|
|
109
|
+
if (potentialIssues.isLikelyFailing) {
|
|
110
|
+
summaryPrompt += ` Note: The output appears to contain errors or issues. Please highlight any errors, failures, or problems in your summary.`;
|
|
111
|
+
}
|
|
112
|
+
const summary = await createSummary(rawResult, summaryPrompt);
|
|
113
|
+
if (potentialIssues.isLikelyFailing && potentialIssues.issues.length > 0) {
|
|
114
|
+
return (summary +
|
|
115
|
+
`\n\n⚠️ Potential issues detected: ${potentialIssues.issues.join(', ')}`);
|
|
116
|
+
}
|
|
117
|
+
return summary;
|
|
55
118
|
}
|
|
56
119
|
export function shouldSummarizeResult(toolName, resultLength) {
|
|
57
120
|
const config = TOOL_CONFIGS[toolName] || {};
|
|
@@ -66,4 +129,46 @@ export function getTruncationMessage(toolName) {
|
|
|
66
129
|
return (config.truncationMessage ||
|
|
67
130
|
`... Output truncated to ${config.maxLength || MAX_RESULT_LENGTH} characters`);
|
|
68
131
|
}
|
|
132
|
+
function detectPotentialIssues(output) {
|
|
133
|
+
if (!output) {
|
|
134
|
+
return { isLikelyFailing: false, issues: [] };
|
|
135
|
+
}
|
|
136
|
+
let errorCount = 0;
|
|
137
|
+
let retryCount = 0;
|
|
138
|
+
const issues = [];
|
|
139
|
+
FAILURE_PATTERNS.forEach(pattern => {
|
|
140
|
+
const matches = output.match(pattern);
|
|
141
|
+
if (matches) {
|
|
142
|
+
errorCount += matches.length;
|
|
143
|
+
}
|
|
144
|
+
});
|
|
145
|
+
const retryMatches = output.match(/retry.*attempt|retrying|trying again/gi);
|
|
146
|
+
if (retryMatches) {
|
|
147
|
+
retryCount += retryMatches.length;
|
|
148
|
+
}
|
|
149
|
+
const errorFrequency = output.length > 0 ? errorCount / output.length : 0;
|
|
150
|
+
const isLikelyFailing = retryCount > MAX_RETRIES || errorFrequency > ERROR_FREQUENCY_THRESHOLD;
|
|
151
|
+
if (retryCount > MAX_RETRIES) {
|
|
152
|
+
issues.push(`excessive retries (${retryCount})`);
|
|
153
|
+
}
|
|
154
|
+
if (errorFrequency > ERROR_FREQUENCY_THRESHOLD) {
|
|
155
|
+
issues.push(`high error frequency (${(errorFrequency * 100).toFixed(1)}%)`);
|
|
156
|
+
}
|
|
157
|
+
return { isLikelyFailing, issues };
|
|
158
|
+
}
|
|
159
|
+
export function clearSummaryCache() {
|
|
160
|
+
summaryCache.clear();
|
|
161
|
+
}
|
|
162
|
+
export function getSummaryCacheStats() {
|
|
163
|
+
let oldestTimestamp = null;
|
|
164
|
+
summaryCache.forEach(({ timestamp }) => {
|
|
165
|
+
if (oldestTimestamp === null || timestamp < oldestTimestamp) {
|
|
166
|
+
oldestTimestamp = timestamp;
|
|
167
|
+
}
|
|
168
|
+
});
|
|
169
|
+
return {
|
|
170
|
+
size: summaryCache.size,
|
|
171
|
+
oldestEntry: oldestTimestamp,
|
|
172
|
+
};
|
|
173
|
+
}
|
|
69
174
|
//# sourceMappingURL=tool_result_processor.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tool_result_processor.js","sourceRoot":"","sources":["../../utils/tool_result_processor.ts"],"names":[],"mappings":"AASA,OAAO,EACH,iBAAiB,EACjB,wBAAwB,EACxB,YAAY,GACf,MAAM,6BAA6B,CAAC;
|
|
1
|
+
{"version":3,"file":"tool_result_processor.js","sourceRoot":"","sources":["../../utils/tool_result_processor.ts"],"names":[],"mappings":"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"}
|