the injected prompt-runner seam (mocked in tests)
OptionalcontextUser: UserInforequest user — passed to the runner for isolation/audit
Extract the vision feature for one record. Returns { value: null } without
calling the model when the row's image column is null/missing/blank.
the vision-llm step spec
the target record (already resolved as-of its decision date)
the resolved prompt entity to run (caller resolves it
from step.Prompt against MJ: AI Prompts); typed loosely so the engine
doesn't depend on the entity class just to thread it through
Runs a VisionLLMFeatureStep over a single record: builds the multimodal prompt params, invokes the injected runner, and parses the structured output. Stateless — construct once and reuse across rows.