Skip to content

Commit bf0b4dc

Browse files
committed
Move middleware retries
1 parent 2a164bb commit bf0b4dc

File tree

5 files changed

+29
-20
lines changed

5 files changed

+29
-20
lines changed

src/agent.ts

Lines changed: 13 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,8 @@ export type MagmaLLMConfig = {
4040
model: LanguageModel;
4141
};
4242

43+
export const DEFAULT_MAX_MIDDLEWARE_RETRIES = 5;
44+
4345
export type MagmaAgentProps<STATE, TOOLS extends MagmaToolSet<STATE>> = {
4446
state: STATE;
4547
llmConfig: MagmaLLMConfig;
@@ -48,8 +50,7 @@ export type MagmaAgentProps<STATE, TOOLS extends MagmaToolSet<STATE>> = {
4850
middleware?: MagmaMiddlewareSet<STATE, TOOLS>;
4951

5052
messageContext?: number;
51-
maxMiddlewareRetries?: number;
52-
onUsageUpdate?: (usage: MagmaUsage) => void;
53+
onUsageUpdate?: (usage: MagmaUsage, options: { state: STATE }) => void;
5354
onError?: (error: Error) => void;
5455

5556
verbose?: boolean;
@@ -66,8 +67,7 @@ export class MagmaAgent<STATE, TOOLS extends MagmaToolSet<STATE>> implements Mag
6667
middleware: MagmaMiddlewareSet<STATE, TOOLS>;
6768

6869
messageContext: number;
69-
maxMiddlewareRetries: number;
70-
onUsageUpdate: (usage: MagmaUsage) => void;
70+
onUsageUpdate: (usage: MagmaUsage, options: { state: STATE }) => void;
7171
onError: (error: Error) => void;
7272

7373
verbose?: boolean;
@@ -89,7 +89,6 @@ export class MagmaAgent<STATE, TOOLS extends MagmaToolSet<STATE>> implements Mag
8989
this.middleware = (middleware ?? {}) as MagmaMiddlewareSet<STATE, TOOLS>;
9090

9191
this.messageContext = props.messageContext ?? -1;
92-
this.maxMiddlewareRetries = props.maxMiddlewareRetries ?? 5;
9392
this.onUsageUpdate = props.onUsageUpdate ?? (() => {});
9493
this.onError =
9594
props.onError ??
@@ -119,7 +118,7 @@ export class MagmaAgent<STATE, TOOLS extends MagmaToolSet<STATE>> implements Mag
119118
userMessage: MagmaUserMessage;
120119
onTrace?: (trace: TraceEvent[]) => void;
121120
trigger?: undefined;
122-
ctx?: MagmaCtx;
121+
// ctx?: MagmaCtx;
123122
onStreamChunk?: (chunk: MagmaStreamChunk, options: { state: STATE }) => void;
124123
}): Promise<MagmaAssistantMessage | null>;
125124

@@ -130,7 +129,7 @@ export class MagmaAgent<STATE, TOOLS extends MagmaToolSet<STATE>> implements Mag
130129
userMessage: MagmaUserMessage;
131130
onTrace?: (trace: TraceEvent[]) => void;
132131
trigger: keyof TOOLS;
133-
ctx?: MagmaCtx;
132+
// ctx?: MagmaCtx;
134133
onStreamChunk?: (chunk: MagmaStreamChunk, options: { state: STATE }) => void;
135134
}): Promise<MagmaToolResultMessage | null>;
136135

@@ -141,15 +140,15 @@ export class MagmaAgent<STATE, TOOLS extends MagmaToolSet<STATE>> implements Mag
141140
userMessage: MagmaUserMessage;
142141
onTrace?: (trace: TraceEvent[]) => void;
143142
trigger?: keyof TOOLS;
144-
ctx?: MagmaCtx;
143+
// ctx?: MagmaCtx;
145144
onStreamChunk?: (chunk: MagmaStreamChunk, options: { state: STATE }) => void;
146145
}): Promise<MagmaAssistantMessage | MagmaToolResultMessage | null> {
147146
return (await this._main({
148147
config: args.config,
149148
userOrToolMessage: args.userMessage,
150149
onTrace: args.onTrace,
151150
trigger: args.trigger,
152-
ctx: args.ctx,
151+
// ctx: args.ctx,
153152
onStreamChunk: args.onStreamChunk
154153
})) as MagmaToolResultMessage | null;
155154
}
@@ -317,7 +316,7 @@ export class MagmaAgent<STATE, TOOLS extends MagmaToolSet<STATE>> implements Mag
317316
} as AssistantModelMessage;
318317

319318
// Call the onUsageUpdate callback
320-
this.onUsageUpdate(await totalUsage);
319+
this.onUsageUpdate(await totalUsage, { state: this.state });
321320

322321
// Add the completion message to the messages array
323322
localMessages.push({
@@ -368,10 +367,10 @@ export class MagmaAgent<STATE, TOOLS extends MagmaToolSet<STATE>> implements Mag
368367
}
369368

370369
// If the onCompletion middleware returns null
371-
// That means it failed to meet the middleware requirements in ${this.maxMiddlewareRetries} attempts
370+
// That means it failed to run a critical middleware in the specified number of retries
372371
if (!onCompletionMiddlewareResult) {
373372
throw new Error(
374-
`Catastrophic error: failed onCompletion middleware ${this.maxMiddlewareRetries} times`
373+
`Catastrophic error: failed critical onCompletion middleware maximum number of times`
375374
);
376375
}
377376

@@ -430,7 +429,7 @@ export class MagmaAgent<STATE, TOOLS extends MagmaToolSet<STATE>> implements Mag
430429

431430
if (!preToolExecutionMiddlewareResult) {
432431
throw new Error(
433-
`Catastrophic error: failed preToolExecution middleware ${this.maxMiddlewareRetries} times`
432+
`Catastrophic error: failed critical preToolExecution middleware maximum number of times`
434433
);
435434
}
436435

@@ -529,7 +528,7 @@ export class MagmaAgent<STATE, TOOLS extends MagmaToolSet<STATE>> implements Mag
529528

530529
if (!onMainFinishMiddlewareResult) {
531530
throw new Error(
532-
`Catastrophic error: failed onMainFinish middleware ${this.maxMiddlewareRetries} times`
531+
`Catastrophic error: failed critical onMainFinish middleware maximum number of times`
533532
);
534533
}
535534

src/middleware/onCompletion.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { AssistantModelMessage, TextPart } from "ai";
22
import { MagmaMiddlewareSet, MagmaToolSet, TraceEvent } from "../types";
3-
import { MagmaAgent, MagmaCtx } from "../agent";
3+
import { DEFAULT_MAX_MIDDLEWARE_RETRIES, MagmaAgent, MagmaCtx } from "../agent";
44
import { parseErrorToString } from "../helpers";
55

66
export async function runOnCompletionMiddleware<STATE, TOOLS extends MagmaToolSet<STATE>>({
@@ -96,7 +96,10 @@ export async function runOnCompletionMiddleware<STATE, TOOLS extends MagmaToolSe
9696
error: errorMessage
9797
}
9898
});
99-
if (ctx.middlewareRetries[name] >= agent.maxMiddlewareRetries) {
99+
if (
100+
ctx.middlewareRetries[name] >=
101+
(mdlwr.maxRetries ?? DEFAULT_MAX_MIDDLEWARE_RETRIES)
102+
) {
100103
if (mdlwr.critical) {
101104
agent.log(
102105
`Middleware ${name} failed, and is critical. Returning null...`

src/middleware/onMainFinish.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { AssistantModelMessage, TextPart } from "ai";
22
import { MagmaMiddlewareSet, MagmaToolSet, TraceEvent } from "../types";
33
import { parseErrorToString } from "../helpers";
4-
import { MagmaAgent, MagmaCtx } from "../agent";
4+
import { DEFAULT_MAX_MIDDLEWARE_RETRIES, MagmaAgent, MagmaCtx } from "../agent";
55

66
export async function runOnMainFinishMiddleware<STATE, TOOLS extends MagmaToolSet<STATE>>({
77
agent,
@@ -96,7 +96,10 @@ export async function runOnMainFinishMiddleware<STATE, TOOLS extends MagmaToolSe
9696
error: errorMessage
9797
}
9898
});
99-
if (ctx.middlewareRetries[name] >= agent.maxMiddlewareRetries) {
99+
if (
100+
ctx.middlewareRetries[name] >=
101+
(mdlwr.maxRetries ?? DEFAULT_MAX_MIDDLEWARE_RETRIES)
102+
) {
100103
if (mdlwr.critical) {
101104
agent.log(
102105
`Middleware ${name} failed, and is critical. Returning null...`

src/middleware/preToolExecution.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { AssistantModelMessage, ToolCallPart } from "ai";
22
import { MagmaMiddlewareSet, MagmaToolCall, MagmaToolSet, TraceEvent } from "../types";
3-
import { MagmaAgent, MagmaCtx } from "../agent";
3+
import { DEFAULT_MAX_MIDDLEWARE_RETRIES, MagmaAgent, MagmaCtx } from "../agent";
44
import { parseErrorToString } from "../helpers";
55

66
export async function runPreToolExecutionMiddleware<STATE, TOOLS extends MagmaToolSet<STATE>>({
@@ -104,7 +104,10 @@ export async function runPreToolExecutionMiddleware<STATE, TOOLS extends MagmaTo
104104
error: errorMessage
105105
}
106106
});
107-
if (ctx.middlewareRetries[name] >= agent.maxMiddlewareRetries) {
107+
if (
108+
ctx.middlewareRetries[name] >=
109+
(mdlwr.maxRetries ?? DEFAULT_MAX_MIDDLEWARE_RETRIES)
110+
) {
108111
if (mdlwr.critical) {
109112
agent.log(
110113
`Middleware ${name} failed, and is critical. Returning null...`

src/types/utilities/middleware.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ export type MagmaMiddleware<
5252
? (keyof TOOLS)[]
5353
: never;
5454
critical?: boolean;
55+
maxRetries?: number;
5556
order?: number;
5657
};
5758

0 commit comments

Comments
 (0)