Decision-1: judge a pending generate_video call as JSON state
Decision-1 accepts JSON as state. Pass the tool arguments of a pending Sume call and ask one noul question; keep keys and signed URLs out of the state.

Yes, Microsoft-Decision-1 can judge a pending tool call, because its state can be JSON, not only text. Put the arguments of the pending Sume call in state, ask one noul question such as whether the call matches what the user asked for, and let a low probability send the call to a human. Strip anything secret first: the state goes to a third-party endpoint.
What to put in the state
Microsoft's page says the state can be text or JSON and that structured state tends to sharpen the task definition. For a paid hosted MCP call the useful fields are the ones a person would check before saying yes. Sume's tools and gates page lists idempotency_key, dry_run and max_spend_credits as the call-level controls; the other arguments are the payload.
| Send to the decision model | Never send |
|---|---|
| The user's request in their words | Your Sume API key or an OAuth token |
| payload.prompt, duration, resolution, aspect ratio | Signed media URLs |
| max_spend_credits and the dry_run estimate (usage.credits) | Workspace or user ids |
| The model id, or the fact that none was named | Anything pasted from private chats |
The request
The body below is the shape from Microsoft's Learn page, with a JSON state and one noul question. criteria is optional but the page recommends defining the true and false conditions for borderline questions.
{
"model": "<your-deployment-name>",
"state": {
"user_request": "a 8 second vertical teaser for the mug",
"pending_call": {"tool": "generate_video", "duration": 8, "aspect_ratio": "9:16"},
"dry_run_credits": 120
},
"questions": {
"matches_request": {
"type": "noul",
"instructions": "Does the pending call match what the user asked for?",
"criteria": {
"true": "Length, ratio and subject agree with the request",
"false": "Any of them differs from the request"
}
}
}
}What it does and does not protect
A mismatch caught here saves one dry run and a confusing job. It does not authorise anything. Under OAuth, a mcp:read session never sees the paid tools at all, and a write session still needs idempotency_key on every paid call. Keep those rules in place and treat the probability as advice. Choose the threshold from labelled examples of your own calls, as Microsoft advises, and route the middle band to a person instead of forcing a yes or no.
Sources
Related posts
More in Developers
- Decision-1: ask three questions in one request before a Sume render
Questions sharing a state can share one Decision-1 request. Route, rate severity and check repeat contact once, then render only if all three pass.
- Image API returned 202 at 4K: handle the job envelope in Python
A slow 4K, high-quality or large-n request can miss the 30 second wait and return 202 with a job, not images. Branch on the status code, then poll.
- Omni Flash edit: test at 360p, then run the final at 1080p
Prove an Omni Flash edit prompt at 360p ($0.0375 a second on Sume) before paying for 1080p ($0.1875 a second). Use a new Idempotency-Key for each resolution.
- Omni Flash edit in sync mode: it waits 30 seconds, then you poll
Sync mode on Sume waits at most 30 seconds. An Omni edit may not finish in that time, so read the job id from the reply and poll it. Never resubmit.
Written by Sume