Menu
popagent
publicLatest change 6edc7e928c57dab23c0973ed3f7ee70b3ebb72d5 - Initial popagent baseline by AkurAI Build
import type { IterationCompleteContext, OnIterationCompleteHandler } from "@mastra/core/agent";
import type { RequestContext } from "@mastra/core/request-context";
import { AGENT_CONTEXT_KEYS, agentContextValue } from "./agent-context";
import { agentRuntimeSettings } from "./agent-runtime-settings";
import type { AgentRuntimeSettings } from "./api-types";
import { createToolHooks } from "./hook-lifecycle";
export function toolCallConcurrency(settings: AgentRuntimeSettings) {
return { limit: settings.toolConcurrency, strategy: "called" as const };
}
export function createFinalResponseGuard(
settings: AgentRuntimeSettings,
): OnIterationCompleteHandler {
return (context) => {
const limit = context.maxIterations ?? settings.supervisorMaxSteps;
if (context.isFinal || context.iteration < limit - 1 || context.toolCalls.length === 0) return;
return { continue: false, feedback: settings.finalResponseFeedback };
};
}
async function configuredRuntime(
requestContext: RequestContext | undefined,
): Promise<AgentRuntimeSettings> {
return agentContextValue(requestContext, AGENT_CONTEXT_KEYS.runtimeSettings)
?? agentRuntimeSettings.get();
}
export async function specialistExecutionOptions(
{ requestContext }: { requestContext: RequestContext },
) {
const runtime = agentContextValue(requestContext, AGENT_CONTEXT_KEYS.hookRuntime);
const sessionId = agentContextValue(requestContext, AGENT_CONTEXT_KEYS.sessionId);
const turnId = agentContextValue(requestContext, AGENT_CONTEXT_KEYS.turnId);
const model = agentContextValue(requestContext, AGENT_CONTEXT_KEYS.model);
const observeIteration = agentContextValue(requestContext, AGENT_CONTEXT_KEYS.iterationObserver);
const settings = await configuredRuntime(requestContext);
const reserveFinalResponse = createFinalResponseGuard(settings);
return {
maxSteps: settings.specialistMaxSteps,
toolCallConcurrency: toolCallConcurrency(settings),
onIterationComplete: observeIteration
? async (iteration: IterationCompleteContext) => {
await observeIteration(iteration);
return reserveFinalResponse(iteration);
}
: reserveFinalResponse,
...(runtime && sessionId && turnId && model
? { hooks: createToolHooks(runtime, { sessionId, turnId, model }) }
: {}),
};
}