Missing required params are why agents stall
A stalled agent turn is usually a missing required input, not a bad prompt. Diagnose the tool schema and model preflight before rewriting anything.
The agent that goes quiet after "animate this" is almost never stuck on your wording. It called a tool, the tool refused to dispatch, and the refusal named a field. Generation credits were not charged. The model did not fail. An input the selected model actually requires (an image, a driving video, a speech track, a first-and-last frame pair) was never passed, and the agent is waiting for you to attach it.
Rewriting the prompt at that point is the expensive move. You change the sentence, the agent picks a tool again, the same field is still empty, and you get another stall that looks like a new one.
Two layers of required, and only one is in the tool list
Every Versely agent tool publishes a required array. generate_images requires prompt and models. generate_video_from_image requires the same two. generate_image_from_image adds image_url. create_hook_pack requires brand_context. That list is the floor: if those are missing, the call is malformed before anyone looks at the model.
The stall people actually hit lives one layer down. After the tool is well-formed, a preflight runs against the model you named. That check is independent of the tool schema, and it is what returns error: "missing_required_input" with recoverable: "fix_input" and an ask_user string. No credits move. The agent is instructed to relay that ask, then wait: not to retry, and not to swap models just to avoid asking.
That split is why the stall feels like a prompt problem. generate_video_from_image will accept a call that has a prompt and a model name. Image-to-video models then fail preflight without an image. Motion control models fail without a character image and a driving video. First-last-frame models fail unless both frames are present. The tool looked callable. The model was not.
The agent has a cheap lookup for the second layer: get_model_input_schema, which takes a model_name and returns the exact fields, allowed values, defaults, and bounds for each provider route of that model. When a turn is looping, that lookup is the thing to force, not a longer brief.
What a stall looks like from the chair
Three shapes, same cause.
The agent asks a question and stops. "Which video should I score? Attach it or point me at one from your library." That sentence is not small talk. It is the ask_user field on a missing_required_input error, paraphrased. Answer it with the asset, not with a restated prompt.
The agent describes a plan and never dispatches. It names a model, restates your brief, and then the turn ends. Open the tool call. If image_urls, video_url, audio_url, first_frame_url, or last_frame_url is missing on a model that needs it, the dispatch never left the machine.
The agent retries a different model. That is the failure mode the error contract exists to prevent. Swapping from an image-conditioned model to a text-to-video model because you did not attach a reference image "succeeds" in the sense that something generates. It is not the job you asked for, and you now have a clip you will throw away.
A prompt that produces the first shape:
Animate this into a five-second 9:16 walk toward camera, no cut.
With a photo attached, that is a complete image-to-video call. Without one, generate_video_from_image has its schema-required fields (prompt, models) and still fails preflight on the image. Adding "make it cinematic" to the sentence does not attach the photo.
Diagnose in this order, not by rewriting
- Read the last tool name.
generate_videos(text-to-video) andgenerate_video_from_imageare different tools. If you meant to animate a still and the agent calledgenerate_videos, the missing input is the tool choice, not a parameter. Send it back: "Use the image I attached; do not text-to-video this." - Diff the tool's
requiredarray against the arguments that were sent. Emptymodels, emptyprompt, missinggeneration_idon an edit: those are schema misses. Fill them. Do not rephrase. - Check the model, not the tool. Ask the agent to call
get_model_input_schemafor the model it picked. Image-edit models needimage_urls. Motion-control models need the character inimage_urland the motion reference invideo_url, not buried in the prompt text. Avatar and audio-to-video models needaudio_url. First-last-frame models need both frames; one still is not enough. - Attach the missing asset and resend the same instruction. The agent is holding the brief. What it lacks is a URL. In the chat, that means using the paperclip. In a background task, that means
$assets.0.url(or$assets_by_label.<label>) in the field the schema names. - If it still loops, name the field. "Pass
image_urlfrom the attached photo. Do not pick a different model." Field names beat adjectives.
The text-to-video capability is the right tool when there is no source frame. The photo-to-video capability is the right tool when there is one. Mixing those two is the other common stall, and it presents the same way: a long pause, then a question you already thought you had answered.
The misses that burn a whole session
| You asked | Model family | Field the preflight wants | What people send instead |
|---|---|---|---|
| Animate this photo | Image-to-video | An image URL | A longer prompt, no attachment |
| Make her dance like the reference clip | Motion control | Character image and driving video | Only the clip, or only the still |
| Transition from A to B | First-last-frame | first_frame_url and last_frame_url |
One image, or two images stuffed into the prompt |
| Talking avatar / lipsync | Audio-conditioned video | audio_url (the speech) |
A script, with no generated or uploaded audio |
| Edit this still | Image-edit | image_urls |
A text-to-image call with the same words |
| Score this clip | Video-to-music / video-to-SFX | video_url |
A music prompt with no clip |
None of those rows is a quality problem. The generation never started. The error contract is explicit that this class of miss does not charge credits, which is the one mercy in the whole pattern: you can sit in the stall for ten turns and still not have spent the generation. You have spent the chat turns, and you have spent your patience, which is why diagnosing the field is cheaper than another rewrite.
A complete motion-control instruction, once you know the fields:
Use Kling Video V3 Pro Motion Control.
image_urlis the attached character still.video_urlis the attached dance clip. Keep her wardrobe. Five seconds, 9:16.
That is not better prose. It is a filled schema. The agent can dispatch it. The stall ends.
One more habit that prevents the next one: if the job is "same subject, new motion," lock the reference still before you name a model. The model list will then include image-conditioned options, and the preflight will have something to check against. A text-only brief into an image-required model is how this post starts.
FAQ
Why didn't the tool schema just mark image_url required?
Because the same tool serves models that do not all want the same inputs. generate_video_from_image is the image-to-video tool, but a first-last-frame variant wants two frames rather than image_url, and a motion-control variant wants an image plus a video. Putting every possible field in required would reject valid calls. The schema is the shared floor; the preflight is the per-model ceiling. Read both.
The agent asked me for an image. I described the image in the prompt. Why is it still waiting?
A description is not an image_url. The preflight checks for a URL (or an attached-image marker the agent can lift into image_urls). "A woman in a red coat on a wet street" is a text-to-video brief. If you wanted that coat to be this coat, attach the photo. The photo-to-video tool exists for exactly that handoff.
Can I tell the agent to pick a different model so it doesn't need the file?
You can, and it will often comply, and you will get a generation that is not the one you meant. The error contract tells the agent not to do this on its own: missing_required_input is fix_input, not choose_other_model. If you do want text-to-video instead of animating a still, say so in those words so the tool changes on purpose.
Does get_model_input_schema cost credits?
It is a lookup. Call it whenever the parameters are non-trivial (custom duration, motion control, lipsync, extend, reference-to-video) and whenever a dispatch just came back missing_required_input. It is the cheapest way to see which fields that specific model, on that specific provider route, will actually accept. The agent chat will call it when asked; you do not need to leave the thread.