expxagents 0.30.2 → 0.30.3
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.
|
@@ -5,4 +5,8 @@ export declare class AgentRunner {
|
|
|
5
5
|
private sessionManager;
|
|
6
6
|
constructor(opts: AgentRunOptions);
|
|
7
7
|
run(prompt?: string): Promise<AgentResult>;
|
|
8
|
+
/** Extract readable error detail from provider errors */
|
|
9
|
+
private static extractErrorDetail;
|
|
10
|
+
/** Check if error is transient and worth retrying */
|
|
11
|
+
private static isRetryableError;
|
|
8
12
|
}
|
|
@@ -26,76 +26,137 @@ export class AgentRunner {
|
|
|
26
26
|
const cwd = this.opts.cwd;
|
|
27
27
|
const model = this.opts.model;
|
|
28
28
|
const maxSteps = this.opts.maxSteps ?? 30;
|
|
29
|
+
const maxRetries = 3;
|
|
29
30
|
const tools = createTools(cwd, this.opts.onAskUser);
|
|
30
31
|
const session = this.opts.sessionId
|
|
31
32
|
? this.sessionManager.getOrCreate(this.opts.sessionId, cwd)
|
|
32
33
|
: null;
|
|
33
34
|
const messages = [];
|
|
34
|
-
// Add session history if multi-turn
|
|
35
35
|
if (session) {
|
|
36
36
|
messages.push(...session.messages);
|
|
37
37
|
}
|
|
38
|
-
// Add current user message
|
|
39
38
|
messages.push({ role: 'user', content: userPrompt });
|
|
40
39
|
const toolCallRecords = [];
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
const p = part;
|
|
52
|
-
if (p.type === 'text-delta' && p.textDelta) {
|
|
53
|
-
// Filter leaked tool-call artifacts from weaker models
|
|
54
|
-
const cleaned = p.textDelta
|
|
55
|
-
.replace(/<TOOLCALL>[\s\S]*?<\/TOOLCALL>/g, '')
|
|
56
|
-
.replace(/\{"(name|tool|function)":\s*"[^"]*",\s*"arguments":\s*\{[^}]*\}\s*\}?\]?/g, '')
|
|
57
|
-
.replace(/<\/?tool_call>/gi, '')
|
|
58
|
-
.replace(/<\/?function_call>/gi, '');
|
|
59
|
-
if (cleaned.trim()) {
|
|
60
|
-
fullText += cleaned;
|
|
61
|
-
this.opts.onChunk?.(cleaned);
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
else if (p.type === 'tool-call') {
|
|
65
|
-
// Emit tool call immediately so dashboard/CLI shows progress
|
|
66
|
-
this.opts.onToolCall?.(p.toolName ?? 'unknown', p.args ?? {});
|
|
67
|
-
toolCallRecords.push({
|
|
68
|
-
tool: p.toolName ?? 'unknown',
|
|
69
|
-
args: p.args ?? {},
|
|
70
|
-
result: '',
|
|
71
|
-
durationMs: 0,
|
|
40
|
+
// Retry loop for transient provider errors (rate limits, timeouts, 5xx)
|
|
41
|
+
let lastError = null;
|
|
42
|
+
for (let attempt = 1; attempt <= maxRetries; attempt++) {
|
|
43
|
+
try {
|
|
44
|
+
const result = streamText({
|
|
45
|
+
model: this.provider(model),
|
|
46
|
+
system: buildSystemPrompt(cwd),
|
|
47
|
+
messages: messages,
|
|
48
|
+
tools: tools,
|
|
49
|
+
maxSteps,
|
|
72
50
|
});
|
|
51
|
+
let fullText = '';
|
|
52
|
+
for await (const part of result.fullStream) {
|
|
53
|
+
const p = part;
|
|
54
|
+
if (p.type === 'text-delta' && p.textDelta) {
|
|
55
|
+
const cleaned = p.textDelta
|
|
56
|
+
.replace(/<TOOLCALL>[\s\S]*?<\/TOOLCALL>/g, '')
|
|
57
|
+
.replace(/\{"(name|tool|function)":\s*"[^"]*",\s*"arguments":\s*\{[^}]*\}\s*\}?\]?/g, '')
|
|
58
|
+
.replace(/<\/?tool_call>/gi, '')
|
|
59
|
+
.replace(/<\/?function_call>/gi, '');
|
|
60
|
+
if (cleaned.trim()) {
|
|
61
|
+
fullText += cleaned;
|
|
62
|
+
this.opts.onChunk?.(cleaned);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
else if (p.type === 'tool-call') {
|
|
66
|
+
this.opts.onToolCall?.(p.toolName ?? 'unknown', p.args ?? {});
|
|
67
|
+
toolCallRecords.push({
|
|
68
|
+
tool: p.toolName ?? 'unknown',
|
|
69
|
+
args: p.args ?? {},
|
|
70
|
+
result: '',
|
|
71
|
+
durationMs: 0,
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
else if (p.type === 'tool-result') {
|
|
75
|
+
const last = [...toolCallRecords].reverse().find((tc) => tc.tool === (p.toolName ?? ''));
|
|
76
|
+
if (last) {
|
|
77
|
+
last.result = String(p.result ?? '').slice(0, 500);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
const totalUsage = await result.usage;
|
|
82
|
+
if (session) {
|
|
83
|
+
this.sessionManager.addMessages(session.id, [
|
|
84
|
+
{ role: 'user', content: userPrompt },
|
|
85
|
+
{ role: 'assistant', content: fullText },
|
|
86
|
+
]);
|
|
87
|
+
}
|
|
88
|
+
const agentResult = {
|
|
89
|
+
output: fullText,
|
|
90
|
+
toolCalls: toolCallRecords,
|
|
91
|
+
model,
|
|
92
|
+
inputTokens: totalUsage?.promptTokens ?? 0,
|
|
93
|
+
outputTokens: totalUsage?.completionTokens ?? 0,
|
|
94
|
+
};
|
|
95
|
+
this.opts.onDone?.(agentResult);
|
|
96
|
+
return agentResult;
|
|
73
97
|
}
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
98
|
+
catch (err) {
|
|
99
|
+
lastError = err instanceof Error ? err : new Error(String(err));
|
|
100
|
+
// Extract detailed error info from provider errors
|
|
101
|
+
const errorDetail = AgentRunner.extractErrorDetail(lastError);
|
|
102
|
+
const isRetryable = AgentRunner.isRetryableError(lastError);
|
|
103
|
+
if (isRetryable && attempt < maxRetries) {
|
|
104
|
+
const waitMs = attempt * 2000; // 2s, 4s, 6s
|
|
105
|
+
this.opts.onChunk?.(`\n[Retry ${attempt}/${maxRetries}] ${errorDetail}. Retrying in ${waitMs / 1000}s...\n`);
|
|
106
|
+
await new Promise(r => setTimeout(r, waitMs));
|
|
107
|
+
continue;
|
|
79
108
|
}
|
|
109
|
+
throw new Error(`${errorDetail} (after ${attempt} attempt${attempt > 1 ? 's' : ''})`);
|
|
80
110
|
}
|
|
81
111
|
}
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
112
|
+
throw lastError ?? new Error('Unknown error');
|
|
113
|
+
}
|
|
114
|
+
/** Extract readable error detail from provider errors */
|
|
115
|
+
static extractErrorDetail(err) {
|
|
116
|
+
const msg = err.message ?? '';
|
|
117
|
+
// OpenRouter / OpenAI structured errors
|
|
118
|
+
const jsonMatch = msg.match(/\{[\s\S]*"error"[\s\S]*\}/);
|
|
119
|
+
if (jsonMatch) {
|
|
120
|
+
try {
|
|
121
|
+
const parsed = JSON.parse(jsonMatch[0]);
|
|
122
|
+
const detail = parsed.error?.message ?? parsed.message ?? parsed.error;
|
|
123
|
+
if (detail)
|
|
124
|
+
return String(detail);
|
|
125
|
+
}
|
|
126
|
+
catch { /* not JSON */ }
|
|
127
|
+
}
|
|
128
|
+
// Rate limit
|
|
129
|
+
if (msg.includes('429') || msg.toLowerCase().includes('rate limit')) {
|
|
130
|
+
return 'Rate limited by provider. Too many requests';
|
|
131
|
+
}
|
|
132
|
+
// Context length
|
|
133
|
+
if (msg.toLowerCase().includes('context') && msg.toLowerCase().includes('length')) {
|
|
134
|
+
return 'Context window exceeded. Try a model with larger context or a shorter conversation (/clear)';
|
|
135
|
+
}
|
|
136
|
+
// Auth
|
|
137
|
+
if (msg.includes('401') || msg.toLowerCase().includes('unauthorized') || msg.toLowerCase().includes('invalid api key')) {
|
|
138
|
+
return 'Invalid API key. Check your OPENROUTER_API_KEY';
|
|
89
139
|
}
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
return
|
|
140
|
+
// Quota
|
|
141
|
+
if (msg.includes('402') || msg.toLowerCase().includes('insufficient') || msg.toLowerCase().includes('quota')) {
|
|
142
|
+
return 'Insufficient credits on OpenRouter. Add credits at https://openrouter.ai/credits';
|
|
143
|
+
}
|
|
144
|
+
// Generic provider error
|
|
145
|
+
if (msg.includes('Provider returned error')) {
|
|
146
|
+
return 'Provider returned an error. The model may be temporarily unavailable';
|
|
147
|
+
}
|
|
148
|
+
return msg.slice(0, 300);
|
|
149
|
+
}
|
|
150
|
+
/** Check if error is transient and worth retrying */
|
|
151
|
+
static isRetryableError(err) {
|
|
152
|
+
const msg = err.message ?? '';
|
|
153
|
+
return msg.includes('429') ||
|
|
154
|
+
msg.includes('500') ||
|
|
155
|
+
msg.includes('502') ||
|
|
156
|
+
msg.includes('503') ||
|
|
157
|
+
msg.includes('timeout') ||
|
|
158
|
+
msg.toLowerCase().includes('rate limit') ||
|
|
159
|
+
msg.includes('Provider returned error');
|
|
99
160
|
}
|
|
100
161
|
}
|
|
101
162
|
//# sourceMappingURL=agent.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent.js","sourceRoot":"","sources":["../src/agent.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAChC,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAgB,MAAM,aAAa,CAAC;AAG1D,MAAM,OAAO,WAAW;IACd,IAAI,CAAsE;IAC1E,QAAQ,CAAkC;IAC1C,cAAc,CAAiB;IAEvC,YAAY,IAAqB;QAC/B,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC;QAC7D,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,IAAI,KAAK,CAAC,uFAAuF,CAAC,CAAC;QAC3G,CAAC;QAED,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,OAAO,CAAC,GAAG,CAAC,wBAAwB,IAAI,aAAa,CAAC;QAElF,IAAI,CAAC,IAAI,GAAG,EAAE,GAAG,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;QACvC,IAAI,CAAC,QAAQ,GAAG,YAAY,CAAC;YAC3B,OAAO,EAAE,IAAI,CAAC,OAAO,IAAI,8BAA8B;YACvD,MAAM;SACP,CAAC,CAAC;QACH,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,cAAc,IAAI,IAAI,cAAc,EAAE,CAAC;IACpE,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,MAAe;QACvB,MAAM,UAAU,GAAG,MAAM,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC;QAC9C,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC;QAC1B,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,KAAM,CAAC;QAC/B,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,IAAI,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"agent.js","sourceRoot":"","sources":["../src/agent.ts"],"names":[],"mappings":"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"}
|