workflow_dispatch music brief: 25 inputs, 65,535 chars vs Sume's 5,000
GitHub dispatch takes 25 inputs and 65,535 characters; Sume's music prompt stops at 5,000 and rejects duration. Guard the length, then call the router.

A workflow_dispatch workflow can take up to 25 top-level inputs and a payload of 65,535 characters, according to GitHub. Sume's music prompt is capped at 5,000 characters, and the Music Router rejects duration and any non-empty negative_prompt. So use choice inputs for tempo and length, one string input for the scene, join them in the shell, and fail the job before the call if the result is over 5,000 characters.
The two limits side by side
GitHub's limits are for the dispatch itself; Sume's limits are for one request body.
| Item | Limit | Source |
|---|---|---|
| workflow_dispatch top-level inputs | 25 | GitHub |
| workflow_dispatch input payload | 65,535 characters | GitHub |
| Input types GitHub lists | string, choice, boolean, environment | GitHub |
| Music prompt | 1 to 5,000 characters | Sume |
| duration / duration_seconds | Rejected; write the length in the prompt | Sume |
| negative_prompt | Non-empty value returns 400 negative_prompt_unsupported | Sume |
A workflow with a guard
Offer the knobs that Sume reads from the prompt: tempo as a number and a length phrase. GitHub's choice type keeps people from typing a length such as 2 mins ish that the model has to guess at.
on:
workflow_dispatch:
inputs:
scene:
description: Scene and mood, one sentence
required: true
type: string
bpm:
type: choice
options: ["72", "96", "128"]
length:
type: choice
options: ["15-second", "30-second", "60-second"]
jobs:
bed:
runs-on: ubuntu-latest
steps:
- env:
SUME_API_KEY: ${{ secrets.SUME_API_KEY }}
PROMPT: "${{ inputs.scene }}, ${{ inputs.bpm }} BPM. A ${{ inputs.length }} track. Instrumental, no vocals."
run: |
[ "${#PROMPT}" -le 5000 ] || { echo "prompt too long"; exit 1; }
jq -n --arg p "$PROMPT" '{prompt:$p}' | curl -fsS -X POST \
https://api.sume.com/v1/music-router/generate \
-H "Authorization: Bearer $SUME_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: dispatch-${{ github.run_id }}" -d @-Why the prompt carries the length
Sume documents that the prompt controls the structure and there is no duration parameter. A phrase such as a 30-second track is the lever. Treat the result as a take to listen to, not a guaranteed length; trim in Timeline if the video needs an exact duration.
Passing user text through an environment variable, as above, also avoids a classic mistake. Writing the input straight into a shell command lets a scene with quotes or $(...) run as code. The env: form puts the value in a variable, and jq --arg builds valid JSON.
Limits
The step returns when Sume accepts the job, not when the track exists. Add a poll step, or use webhook mode and a receiver, if the next step needs the file. Billing is a fixed $0.125 per generation, so a workflow that anyone can dispatch needs a protected environment or a restricted branch: the dispatch form is a button that spends money.
Sources
Related posts
More in Integrations
- Google Sheets =IMAGE() with a Sume URL: PNG, JPEG, never SVG
=IMAGE needs a URL with a protocol and rejects SVG and drive.google.com links. Put a Sume data[0].url from a png or jpeg request in a cell and pick a mode.
- Google Slides createImage with a Sume URL: use PNG or JPEG
CreateImageRequest takes PNG, JPEG or GIF, up to 50 MB and 25 megapixels, from a public URL of 2 KB or less. Ask Sume for output_format png or jpeg, not WebP.
- GPT-6.1 Sol function calling to start a Sume Agent Completion safely
Expose one function that starts an Agent Completion. Let GPT-6.1 Sol fill instruction and input, and keep the spend cap and idempotency key out of its args.
- Read-only MCP session lists avatars; create gives insufficient_scope
A hosted MCP connection with read scope can list and search avatars, but paid avatar and video tools return insufficient_scope until you grant write.
Written by Sume