diff --git a/src/agents/pi-embedded-runner/run.ts b/src/agents/pi-embedded-runner/run.ts index 24e05cc1fd2..d5f18acffcf 100644 --- a/src/agents/pi-embedded-runner/run.ts +++ b/src/agents/pi-embedded-runner/run.ts @@ -300,8 +300,14 @@ export async function runEmbeddedPiAgent( channelId: params.messageChannel ?? params.messageProvider ?? undefined, }; + const attachments = (params.images ?? []).map((img) => ({ + kind: "image" as const, + mimeType: img.media_type, + })); + const hookSelection = await resolveHookModelSelection({ prompt: params.prompt, + attachments: attachments.length > 0 ? attachments : undefined, provider, modelId, hookRunner, diff --git a/src/agents/pi-embedded-runner/run/setup.ts b/src/agents/pi-embedded-runner/run/setup.ts index 6a52bbf7cb8..2134dc6f631 100644 --- a/src/agents/pi-embedded-runner/run/setup.ts +++ b/src/agents/pi-embedded-runner/run/setup.ts @@ -28,7 +28,7 @@ type HookContext = { type HookRunnerLike = { hasHooks(hookName: string): boolean; runBeforeModelResolve( - input: { prompt: string }, + input: { prompt: string; attachments?: { kind: string; mimeType?: string }[] }, context: HookContext, ): Promise<{ providerOverride?: string; modelOverride?: string } | undefined>; runBeforeAgentStart( @@ -39,6 +39,7 @@ type HookRunnerLike = { export async function resolveHookModelSelection(params: { prompt: string; + attachments?: { kind: string; mimeType?: string }[]; provider: string; modelId: string; hookRunner?: HookRunnerLike | null; @@ -58,7 +59,7 @@ export async function resolveHookModelSelection(params: { if (hookRunner?.hasHooks("before_model_resolve")) { try { modelResolveOverride = await hookRunner.runBeforeModelResolve( - { prompt: params.prompt }, + { prompt: params.prompt, attachments: params.attachments }, params.hookContext, ); } catch (hookErr) { diff --git a/src/plugins/hook-before-agent-start.types.ts b/src/plugins/hook-before-agent-start.types.ts index 00b2dc6a900..928107f17d4 100644 --- a/src/plugins/hook-before-agent-start.types.ts +++ b/src/plugins/hook-before-agent-start.types.ts @@ -1,7 +1,14 @@ // before_model_resolve hook +export type PluginHookBeforeModelResolveAttachment = { + kind: "image" | "video" | "audio" | "document" | "other"; + mimeType?: string; +}; + export type PluginHookBeforeModelResolveEvent = { /** User prompt for this run. No session messages are available yet in this phase. */ prompt: string; + /** Attachment metadata for file-aware model routing. */ + attachments?: PluginHookBeforeModelResolveAttachment[]; }; export type PluginHookBeforeModelResolveResult = {