Weekly new-model watcher as a Sume schedule: schema without links

A scheduled watcher that lists new AI models fails if its output schema holds vendor page URLs. Use host-only fields and read each run with the actions API.

4 min readSume
All posts

A weekly Sume schedule can watch for new model launches and return them as a typed list, but its output schema must not ask for vendor page URLs. Sume checks every URL in output against media the run actually produced, so a link to a vendor blog fails the projection. Use a source_host field with no scheme instead.

What a schedule gives you

A schedule is a saved Agents automation with instructions, a model, a 5-field cron expression with an IANA timezone, and a spend cap. You create it in the dashboard, because the Developer API can list, read and start schedules but not create or edit them. The cadence runs a fresh thread each time and returns a run receipt.

The trap in a watcher schema

Say the instructions tell the agent to look for model launches in the last seven days, such as Microsoft's MAI-Voice-2.1 and MAI-Voice-2.1-Flash. The natural schema asks for a source_url. That field is the trap. The URL gate collects every http(s) string at any depth and rejects any not produced by the run, so the whole output becomes null with output_schema_unsatisfied.

A schema that passes the gate

Bind this schema in the dashboard and name the primary key new_models. Every property is in required, optional values are nullable, and the host replaces the link. Add no minItems, because a quiet week should return an empty list, not a failure.

Watcher output fields (Sume docs read 2026-10-05; example row from the Microsoft page read 2026-10-05)
FieldTypeExample
vendorstringMicrosoft AI
modelstringMAI-Voice-2.1-Flash
kindenum: video, image, audio, agent, otheraudio
summarystringLow-latency text to speech
source_hoststring or nullmicrosoft.ai
checked_onstring2026-10-05
{
  "name": "acme/model-watch/v1", "strict": true,
  "schema": {
    "type": "object", "additionalProperties": false,
    "required": ["new_models"],
    "properties": {"new_models": {"type": "array", "items": {
      "type": "object", "additionalProperties": false,
      "required": ["vendor", "model", "kind", "summary", "source_host"],
      "properties": {
        "vendor": {"type": "string"}, "model": {"type": "string"},
        "kind": {"type": "string", "enum": ["video", "image", "audio", "agent", "other"]},
        "summary": {"type": "string"},
        "source_host": {"type": ["string", "null"]}}}}}
  }
}

Read the runs

Run history is one call. GET /v1/actions/{action_id}/runs pages newest first, and each receipt carries status, output and output_error. The script prints new models from completed runs and reports any run whose projection failed, so a schema problem never hides as an empty week.

import json, os, urllib.request

def get(path):
    req = urllib.request.Request("https://api.sume.com" + path,
      headers={"Authorization": "Bearer " + os.environ["SUME_API_KEY"]})
    with urllib.request.urlopen(req) as r:
        return json.load(r)

def main():
    action_id = os.environ["ACTION_ID"]
    runs = get("/v1/actions/" + action_id + "/runs?limit=5")["data"]
    for run in runs:
        if run["output_error"]:
            print(run["id"], "projection failed:", run["output_error"]["code"])
        elif run["status"] == "completed" and run["output"]:
            for m in run["output"]["new_models"]:
                print(m["vendor"], m["model"], m["kind"])

main()

Cost and cap

The default generation cap for a schedule is $1.00 per run if you set none, and an API caller can only lower it. That cap covers generation spend, not the agent's own LLM turn, which bills a separate wallet. A watcher that only reads and writes text generates no media, so its receipt cost is the number to watch, not a video bill.

Sources

Related posts

More in Agents

All Agents posts

Written by Sume