{
  "title": "OpenRouter provider-route watchlist",
  "description": "Compare OpenRouter provider-route prices, context limits and supported parameters for a model watchlist. Optional saved changes and workload cost estimates. Public metadata; no inference.",
  "type": "object",
  "schemaVersion": 1,
  "properties": {
    "modelIds": {
      "title": "Public model identifiers",
      "type": "array",
      "editor": "stringList",
      "description": "Up to 20 exact namespace/model identifiers. Omitted or empty uses the listed sample. No URLs, credentials or private models.",
      "default": [],
      "prefill": [
        "openai/gpt-4o-mini"
      ],
      "sectionCaption": "1 - Models and required capabilities",
      "sectionDescription": "Choose explicit model IDs. Each saved row represents one returned provider route."
    },
    "requiredParameters": {
      "title": "Required API parameters",
      "type": "array",
      "editor": "stringList",
      "description": "Up to 20 names, for example tools or response_format. Adds missingParameters and meetsRequestedParameters; does not remove routes or test actual inference.",
      "default": [],
      "prefill": [
        "tools"
      ]
    },
    "inputTokens": {
      "title": "Scenario input tokens",
      "type": "integer",
      "default": 1000000,
      "minimum": 0,
      "maximum": 1000000000,
      "description": "Base estimate uses published per-token prompt price. No request is sent for inference.",
      "sectionCaption": "2 - Base token cost scenario",
      "sectionDescription": "Estimates exclude cache, tools, media, request charges, tiers, discounts, credit fees and taxes."
    },
    "outputTokens": {
      "title": "Scenario output tokens",
      "type": "integer",
      "default": 1000000,
      "minimum": 0,
      "maximum": 1000000000,
      "description": "Base estimate uses published per-token completion price. This is not a quote or invoice."
    },
    "maxResults": {
      "title": "Maximum saved observations",
      "type": "integer",
      "default": 10,
      "minimum": 1,
      "maximum": 1000,
      "description": "Maximum confirmed dataset rows. An unchanged observation skipped by onlyChanges does not use this limit. A capped run can leave selected models/routes unreached; see SUMMARY.",
      "sectionCaption": "3 - Output and saved comparisons"
    },
    "comparePrevious": {
      "title": "Compare with saved observations",
      "type": "boolean",
      "default": false,
      "description": "First observations are new. Later observations are changed or unchanged; only confirmed saved rows can advance history."
    },
    "onlyChanges": {
      "title": "Save only new or changed observations",
      "type": "boolean",
      "default": false,
      "description": "Implies comparePrevious. A fully unchanged run correctly saves zero rows. The initial comparison saves new observations."
    },
    "snapshotName": {
      "title": "Comparison namespace",
      "type": "string",
      "editor": "textfield",
      "default": "default",
      "description": "1-80 letters, numbers, underscores or hyphens. History also includes the exact sorted model watchlist. Use one writer per namespace; overlapping runs are unsupported."
    },
    "stateStoreName": {
      "title": "Named history store",
      "type": "string",
      "editor": "textfield",
      "default": "maydit-openrouter-route-watchlists",
      "description": "3-63 letters, numbers or hyphens. Read/written only when comparisons are requested. Use your own dedicated store to isolate a workflow."
    },
    "maxRunSeconds": {
      "title": "Run budget in seconds",
      "type": "integer",
      "default": 240,
      "minimum": 30,
      "maximum": 900,
      "description": "Includes source and history work, also bounded by the platform deadline minus 25 seconds.",
      "sectionCaption": "4 - Run limits",
      "sectionDescription": "Each public API response is bounded to 2 MiB. Access/rate refusals are reported; no authentication bypass is attempted."
    }
  }
}
