Schema dell'allenamento
Ultimo aggiornamento: 2026-05-29
Your Trainer è un'app di ciclismo indoor multi-ciclista per tablet Android. Controllo dello smart trainer con dati locali + controllo locale. Acquisto unico.
Il file di allenamento .ytw è semplice JSON — scrivilo in qualsiasi editor di testo, importalo tramite il foglio di condivisione, condividilo con gli amici. L'editor visivo gestisce i casi comuni; lo schema è la via d'uscita quando ti serve il controllo totale.
Quando scrivere a mano
La maggior parte dei ciclisti non avrà mai bisogno di questa pagina — l'editor visivo degli allenamenti e l'AI Workout Coach coprono tutto, da una sessione di soglia 4×8 a uno stack di microburst. Ricorri allo schema quando:
- Vuoi una struttura che l'editor non espone (riscaldamenti molto lunghi, scripting elaborato dei suggerimenti, target di cadenza misti per intervallo).
- Stai traducendo un allenamento che hai già nel formato di un altro strumento.
- Vuoi inviare un allenamento a qualcuno come singolo file.
- Vuoi generare allenamenti in massa in modo programmatico.
Esempio minimo
Il file .ytw valido più breve è un programma con un intervallo. Salvalo con estensione .ytw e condividilo in Your Trainer.
{
"programId": "my-sweet-spot",
"programName": "My Sweet Spot 30",
"description": "A short sweet-spot workout.",
"totalDuration": 1800,
"workoutType": "POWER",
"primaryLocale": "en",
"intervals": [
{ "id": "warmup", "duration": 300, "targetPowerPercent": 50, "intensityZone": "Z1", "label": "Warmup", "intervalType": "WARMUP" },
{ "id": "work", "duration": 1200, "targetPowerPercent": 88, "intensityZone": "Z3", "label": "Sweet Spot", "intervalType": "INTERVAL" },
{ "id": "cooldown", "duration": 300, "targetPowerPercent": 50, "intensityZone": "Z1", "label": "Cooldown", "intervalType": "COOLDOWN" }
]
}
Campi di primo livello
L'oggetto di primo livello descrive un programma di allenamento. I campi obbligatori sono contrassegnati.
| Campo | Tipo | Descrizione |
|---|---|---|
programId obbligatorio | stringa | Identificatore stabile. Usa kebab-case (my-sweet-spot). La chiave univoca dell'allenamento nella tua libreria — reimportare un file con lo stesso programId aggiorna la voce esistente invece di crearne un duplicato. |
programName obbligatorio | stringa | Nome visualizzato nella lingua principale del ciclista. |
description obbligatorio | stringa | Descrizione di una o due frasi mostrata sulla scheda dell'allenamento. |
totalDuration obbligatorio | intero (secondi) | Durata totale dell'allenamento. L'app la ricalcola dagli intervalli al salvataggio, quindi è sicuro lasciarla incoerente durante la stesura. |
intervals obbligatorio | array | Elenco ordinato di oggetti intervallo o gruppi di ripetizione. |
workoutType | stringa | Famiglia di allenamento: POWER (predefinito), HR_ZONE o ROUTE. Vedi Tipi di allenamento. |
variant | stringa | Sotto-forma all'interno della famiglia: STANDARD (predefinito) o RAMP_TEST. |
primaryLocale | stringa (BCP-47) | Lingua in cui sono state scritte le stringhe. Predefinito "en". Guida la catena di fallback tra le lingue. |
category | stringa | Categorizzazione libera (es. "threshold", "endurance"). Facoltativo. |
difficulty | intero (1–5) | Difficoltà soggettiva. Compare sulla scheda dell'allenamento. |
isUserCreated | booleano | True per gli allenamenti creati nell'app dal ciclista; false per gli allenamenti importati o inclusi. Predefinito false. |
isFavorite | booleano | Flag di fissaggio in alto. I ciclisti lo attivano nell'app; di solito viene omesso nei file condivisi. |
routeProfile | array di { distanceMeters, elevationMeters } | Profilo altimetrico completo per gli allenamenti ROUTE. Null per POWER e HR_ZONE. |
strings | oggetto (lingua → LocaleStrings) | Traduzioni per ciascuna lingua di nome, descrizione, etichette degli intervalli e suggerimenti. |
Campi dell'intervallo
Ogni oggetto intervallo descrive un blocco dell'allenamento. La forma del blocco dipende dal workoutType del genitore — i blocchi Power usano percentuali di potenza, i blocchi HR-Zone usano un target di zona.
| Campo | Tipo | Descrizione |
|---|---|---|
duration obbligatorio | intero (secondi) | Lunghezza del blocco in secondi. |
targetPowerPercent obbligatorio per power | intero (% di FTP) | Target di potenza per gli allenamenti POWER. Mutuamente esclusivo con targetHrZone. |
targetPowerEndPercent | intero (% di FTP) | Potenza finale facoltativa per le rampe. Quando è presente, il target in watt interpola linearmente da targetPowerPercent → targetPowerEndPercent lungo tutto il blocco. |
targetHrZone obbligatorio per FC | intero (1–5) | Zona FC per gli allenamenti HR_ZONE. Mutuamente esclusivo con targetPowerPercent. |
intensityZone obbligatorio | stringa | Token visivo di zona: Z1–Z5. Determina il colore nella visualizzazione del terreno. Vedi Zone di allenamento. |
intervalType | stringa | WARMUP, COOLDOWN o INTERVAL (predefinito). I blocchi di riscaldamento e defaticamento sono esclusi dai riepiloghi che considerano solo il lavoro (potenza media dei blocchi di lavoro, tempo in zona per la parte di lavoro, ecc.). |
label obbligatorio | stringa | Testo visualizzato sul blocco nella lingua principale del ciclista. Le varianti per altre lingue stanno in strings.<locale>.labels. |
id | stringa | Slug stabile — la chiave usata in strings.<locale>.labels e nella composizione delle chiavi dei suggerimenti. Consigliato per ogni allenamento distribuito con traduzioni. |
autoLabel | booleano | True quando l'etichetta è stata generata da un preset dell'editor anziché digitata dal ciclista. Le etichette automatiche sono localizzate da Your Trainer stesso e non richiedono voci per lingua in strings. Predefinito false. |
cadenceTarget | intero (RPM) | Target di cadenza facoltativo per il blocco (es. 60 per salite a bassa cadenza, 100 per esercizi di spin-up). |
cues | array di CoachingCue | Suggerimenti di coaching che si attivano durante il blocco. |
Suggerimenti di coaching
Un suggerimento di coaching è un breve overlay di testo che appare nella cabina di pilotaggio durante una pedalata. Ogni suggerimento ha un offset all'interno dell'intervallo che lo contiene, il testo da mostrare e per quanto tempo lasciarlo sullo schermo.
| Campo | Tipo | Descrizione |
|---|---|---|
offsetSec obbligatorio | intero (secondi) | Secondi dall'inizio dell'intervallo genitore in cui il suggerimento si attiva. |
text obbligatorio | stringa | Testo del suggerimento nella lingua principale dell'allenamento. Le varianti per altre lingue stanno in strings.<locale>.cues, indicizzate da <intervalId>:<cueIndex>. |
durationSec | intero (secondi) | Per quanto tempo il suggerimento resta a schermo. Predefinito 5. |
Esempio di intervallo con tre suggerimenti (la composizione della chiave usa l'id dell'intervallo genitore + l'indice del suggerimento nell'array):
{
"id": "work",
"duration": 600,
"targetPowerPercent": 95,
"intensityZone": "Z4",
"label": "Threshold",
"intervalType": "INTERVAL",
"cues": [
{ "offsetSec": 0, "text": "Settle in — find your rhythm." },
{ "offsetSec": 300, "text": "Halfway. Stay smooth.", "durationSec": 8 },
{ "offsetSec": 540, "text": "One minute. Hold form." }
]
}
Stringhe localizzate & catena di fallback
Il blocco strings contiene le traduzioni per ciascuna lingua di ogni stringa dell'allenamento visibile al ciclista. Ogni voce di lingua ha la stessa forma:
"strings": {
"en": {
"name": "Sweet Spot 30",
"description": "A short sweet-spot workout.",
"labels": { "warmup": "Warmup", "work": "Sweet Spot", "cooldown": "Cooldown" },
"cues": { "work:0": "Settle in", "work:1": "Halfway" }
},
"de": {
"name": "Sweet Spot 30",
"description": "Ein kurzes Sweet-Spot-Training.",
"labels": { "warmup": "Aufwärmen", "work": "Sweet Spot", "cooldown": "Ausrollen" },
"cues": { "work:0": "Locker einrollen", "work:1": "Halbzeit" }
}
}
Le chiavi dei suggerimenti seguono il pattern <intervalId>:<cueIndex> — quindi il primo suggerimento dell'intervallo work ha chiave work:0.
Per ogni stringa visibile al ciclista, l'app sceglie la migliore corrispondenza di lingua in questo ordine:
strings[<rider-locale>]— la lingua del ciclista stesso.strings[primaryLocale]— la lingua dell'autore.strings["en"]— fallback universale.- Il campo di primo livello (
programName,labeldell'intervallo,textdel suggerimento).
Le stringhe mostrate da una lingua diversa da quella del ciclista appaiono in corsivo sulle schede degli allenamenti e nella cabina di pilotaggio, così il ciclista capisce quali stringhe non sono ancora state tradotte.
strings blocks for additional locales when prompted.Gruppi di ripetizione
Per le strutture ripetitive, un gruppo di ripetizione scrive l'unità una sola volta e dice all'app quante volte riprodurla. I gruppi di ripetizione vengono espansi in blocchi individuali all'importazione, così il ciclista vede ogni blocco nella striscia degli intervalli in arrivo durante la pedalata.
{
"intervals": [
{ "id": "warmup", "duration": 600, "targetPowerPercent": 50, "intensityZone": "Z1", "label": "Warmup", "intervalType": "WARMUP" },
{
"repeat": 4,
"intervals": [
{ "id": "on", "duration": 480, "targetPowerPercent": 95, "intensityZone": "Z4", "label": "Threshold" },
{ "id": "off", "duration": 240, "targetPowerPercent": 55, "intensityZone": "Z1", "label": "Recovery" }
]
},
{ "id": "cooldown", "duration": 600, "targetPowerPercent": 50, "intensityZone": "Z1", "label": "Cooldown", "intervalType": "COOLDOWN" }
]
}
L'esempio sopra si espande in 1 riscaldamento + 4×(soglia + recupero) + 1 defaticamento = 10 blocchi. I gruppi di ripetizione possono annidarsi, ma la struttura piatta è preferibile per leggibilità.
Tipi di allenamento & varianti
Il campo workoutType seleziona il paradigma; variant seleziona una sotto-forma al suo interno.
workoutType | Cos'è | Forma dell'intervallo richiesta |
|---|---|---|
POWER (predefinito) | Intervalli ancorati all'FTP. Il rullo segue il target in watt in ERG, oppure le curve di resistenza in SIM. | Ogni intervallo ha targetPowerPercent (e facoltativamente targetPowerEndPercent per le rampe). |
HR_ZONE | Intervalli guidati dalla frequenza cardiaca. Il rullo regola i watt in tempo reale per mantenere la FC del ciclista nella zona target — utile quando la metrica di allenamento è il carico cardiovascolare (recupero, base, lavoro polarizzato). | Ogni intervallo ha targetHrZone (1–5). Il pulsante START riporta COLLEGA HRM finché l'HRM non è collegato. |
ROUTE | Pedalate di simulazione guidate dalla pendenza. Il rullo segue il profilo altimetrico da routeProfile; il ciclista sceglie cadenza e rapporto. | Gli intervalli di solito sono vuoti o contengono un singolo segnaposto a lunghezza piena. Il contenuto reale della pedalata risiede in routeProfile. |
Il campo variant seleziona una sotto-forma:
STANDARD(predefinito) — normale allenamento strutturato.RAMP_TEST— segnato come test FTP. Chiede al ciclista di aggiornare l'FTP alla fine della pedalata ed è escluso dai riepiloghi del carico di allenamento (così uno sforzo massimale non distorce il grafico del carico settimanale).
Pacchetti (.ytwpack)
Quando vuoi un lotto curato di allenamenti in un colpo solo, il formato .ytwpack raggruppa molti file .ytw insieme a un manifesto del pacchetto. Un .ytwpack è in realtà un archivio ZIP — rinominalo in .zip e decomprimilo per vederne il contenuto, oppure importalo tramite l'installer di pacchetti di Your Trainer per installare ogni allenamento con un solo tocco.
Un archivio .ytwpack contiene:
manifest.jsonnella radice dell'archivio — i metadati a livello di pacchetto descritti di seguito.- Un
<slug>.ytwper ogni allenamento del pacchetto, dove ciascun file segue lo schema documentato sopra.
Il manifesto del pacchetto contiene informazioni sufficienti per una scheda di decisione di installazione senza dover aprire ogni allenamento. Campi di primo livello:
| Campo | Tipo | Descrizione |
|---|---|---|
schema_version obbligatorio | intero | Attualmente sempre 1. |
pack_id obbligatorio | stringa | Identificatore stabile in kebab-case (es. sweet-spot). |
name obbligatorio | stringa | Nome visualizzato nel catalogo dei pacchetti. |
description obbligatorio | stringa | Riepilogo di una o due frasi visibile prima che il ciclista tocchi per installare. |
version obbligatorio | stringa (SemVer) | MAJOR.MINOR.PATCH, facoltativo -prerelease. Patch per correzioni di contenuti; minor per allenamenti aggiuntivi; major per modifiche di schema che rompono la compatibilità. Incluso nel nome del file pubblicato (v1.0.2.ytwpack). |
content_hash obbligatorio | stringa | sha256: sulla concatenazione dei byte di ogni file .ytw ordinati per slug. Stabile attraverso le rigenerazioni di contenuti immutati; cambia ogni volta che gli allenamenti all'interno cambiano. |
generated_at obbligatorio | stringa (ISO 8601) | Timestamp UTC. |
set obbligatorio | stringa | power o hr-zone — la famiglia di allenamento a cui appartiene questo pacchetto. |
category obbligatorio | stringa | Sotto-tassonomia all'interno del set (es. sweet-spot). |
workout_count obbligatorio | intero | Numero di voci .ytw nel pacchetto. |
total_ride_time_seconds obbligatorio | intero | Somma delle durate di ogni allenamento nel pacchetto. |
experience_level obbligatorio | stringa | Calcolato dall'intervallo di difficoltà dei contenuti — uno tra beginner / intermediate / advanced / mixed. Formato wire minuscolo; l'app lo capitalizza per la visualizzazione. |
hrm_required obbligatorio | booleano | True se qualche allenamento nel pacchetto usa HR_ZONE. |
type_mix obbligatorio | oggetto | Percentuale per categoria del tempo totale di pedalata (somma 100). Alimenta il grafico a ciambella del mix di tipi nella scheda di installazione in-app. |
duration_histogram obbligatorio | oggetto | Conteggio degli allenamenti per intervallo di durata: 0-30, 30-60, 60-90, 90+ (minuti). Alimenta il grafico delle durate della scheda di installazione. |
contents obbligatorio | array | Voci complete per ciascun allenamento — superset della forma della voce nel manifesto di libreria; ognuna porta slug, name, duration_seconds, metriche di riepilogo, oltre a un array sparkline per il rendering della miniatura. |
Due strade di installazione per un .ytwpack scaricato:
- Installazione con un tocco in Your Trainer — apri il
.ytwpacknel foglio di condivisione, Your Trainer legge il manifesto del pacchetto, ti mostra cosa contiene (mix di tipi, istogramma delle durate, tempo totale di pedalata) e installa ogni allenamento in una volta sola. Disponibile non appena verrà rilasciato l'installer di pacchetti in-app. - Decompressione manuale — rinomina in
.zip(o decomprimi direttamente con qualsiasi strumento di archiviazione), poi condividi ogni.ytwin Your Trainer uno alla volta tramite il foglio di condivisione.
Esempio di manifesto di pacchetto (con contents troncato per leggibilità):
{
"schema_version": 1,
"pack_id": "sweet-spot",
"name": "Sweet Spot",
"description": "26 sweet-spot sessions across classic intervals, sustained stacks, and over-unders.",
"version": "1.0.2",
"content_hash": "sha256:9432a3a76015158dc71ec63…",
"generated_at": "2025-05-28T00:00:00Z",
"set": "power",
"category": "sweet-spot",
"workout_count": 26,
"total_ride_time_seconds": 119340,
"experience_level": "intermediate",
"hrm_required": false,
"type_mix": { "sweet-spot": 100 },
"duration_histogram": { "0-30": 0, "30-60": 5, "60-90": 12, "90+": 9 },
"contents": [
{ "slug": "sweet-spot-3x10min-at-88pct-ftp", "name": "Sweet Spot 3×10min @ 88% FTP", "duration_seconds": 3300, "tss": 55.8, "intensity_factor": 0.764, "sparkline": […] },
{ "slug": "sweet-spot-3x15min-at-90pct-ftp", "name": "Sweet Spot 3×15min @ 90% FTP", "duration_seconds": 4500, "tss": 81.6, "intensity_factor": 0.808, "sparkline": […] }
/* … 24 more workouts … */
]
}
Manifesti di libreria & pacchetto
Due manifesti vengono pubblicati insieme agli artefatti scaricabili. Entrambi sono semplici JSON; entrambi sono descritti da documenti JSON Schema che puoi recuperare direttamente.
| URL | Cosa elenca | JSON Schema |
|---|---|---|
library/manifest.json |
Ogni .ytw curato nella libreria — metadati per allenamento per i client di sfoglia / ricerca / filtro. Elenca anche i download .ytwpack disponibili (percorso del file, versione, hash dei contenuti, riepilogo del mix di tipi, URL dell'icona). |
/schemas/workout-manifest.json |
packs/manifest.json |
Endpoint del catalogo dei pacchetti: ogni .ytwpack pubblicato con metadati di riepilogo. Stessa forma di voce per pacchetto dell'array packs del manifesto di libreria; la Pack Library in-app la recupera all'aggiornamento avviato dal ciclista. |
/schemas/workout-manifest.json |
(dentro ogni .ytwpack) |
Manifesto per pacchetto trasportato come manifest.json nella radice dell'archivio — la tabella sopra ne documenta la forma. |
/schemas/workout-pack-manifest.json |
Se stai costruendo strumenti che consumano la libreria — un browser di allenamenti personalizzato, un convertitore di allenamenti che produce .zwo, una dashboard per allenatori che mostra i pacchetti — questi sono i contratti contro cui validare. La stessa forma di voce per allenamento appare in entrambi gli array contents / workouts dei manifesti, quindi un client che gestisce uno gestisce anche l'altro.
Esempi pratici
Intervallo a rampa
Un riscaldamento di 5 minuti che sale dal 40 % di FTP al 75 % di FTP tramite interpolazione lineare:
{
"id": "rampup",
"duration": 300,
"targetPowerPercent": 40,
"targetPowerEndPercent": 75,
"intensityZone": "Z1",
"label": "Ramp up",
"intervalType": "WARMUP"
}
Over-under
Tre serie da 2 minuti al 95 % di FTP / 1 minuto al 105 % di FTP, espresse come gruppo di ripetizione:
{
"repeat": 3,
"intervals": [
{ "id": "under", "duration": 120, "targetPowerPercent": 95, "intensityZone": "Z4", "label": "Under" },
{ "id": "over", "duration": 60, "targetPowerPercent": 105, "intensityZone": "Z5", "label": "Over" }
]
}
Allenamento con zone FC
Pedalata di resistenza di 30 minuti in Z2 con un'accelerazione di 3 minuti in Z4 nel mezzo:
{
"programId": "hr-z2-with-surge",
"programName": "Z2 with a Z4 surge",
"description": "Steady Zone 2 with a single 3-minute Zone 4 surge.",
"totalDuration": 1800,
"workoutType": "HR_ZONE",
"primaryLocale": "en",
"intervals": [
{ "id": "warmup", "duration": 300, "targetHrZone": 1, "intensityZone": "Z1", "label": "Warmup", "intervalType": "WARMUP" },
{ "id": "endure1", "duration": 600, "targetHrZone": 2, "intensityZone": "Z2", "label": "Endurance" },
{ "id": "surge", "duration": 180, "targetHrZone": 4, "intensityZone": "Z4", "label": "Surge" },
{ "id": "endure2", "duration": 420, "targetHrZone": 2, "intensityZone": "Z2", "label": "Endurance" },
{ "id": "cooldown","duration": 300, "targetHrZone": 1, "intensityZone": "Z1", "label": "Cooldown", "intervalType": "COOLDOWN" }
]
}
Multilingue
L'esempio minimo Sweet Spot con i blocchi strings per EN + DE + NL. Stesso allenamento, tre esperienze native:
{
"programId": "my-sweet-spot",
"programName": "Sweet Spot 30",
"description": "A short sweet-spot workout.",
"totalDuration": 1800,
"workoutType": "POWER",
"primaryLocale": "en",
"intervals": [
{ "id": "warmup", "duration": 300, "targetPowerPercent": 50, "intensityZone": "Z1", "label": "Warmup", "intervalType": "WARMUP" },
{ "id": "work", "duration": 1200, "targetPowerPercent": 88, "intensityZone": "Z3", "label": "Sweet Spot", "intervalType": "INTERVAL",
"cues": [
{ "offsetSec": 0, "text": "Settle in" },
{ "offsetSec": 600, "text": "Halfway" }
]
},
{ "id": "cooldown", "duration": 300, "targetPowerPercent": 50, "intensityZone": "Z1", "label": "Cooldown", "intervalType": "COOLDOWN" }
],
"strings": {
"en": {
"name": "Sweet Spot 30",
"description": "A short sweet-spot workout.",
"labels": { "warmup": "Warmup", "work": "Sweet Spot", "cooldown": "Cooldown" },
"cues": { "work:0": "Settle in", "work:1": "Halfway" }
},
"de": {
"name": "Sweet Spot 30",
"description": "Ein kurzes Sweet-Spot-Training.",
"labels": { "warmup": "Aufwärmen", "work": "Sweet Spot", "cooldown": "Ausrollen" },
"cues": { "work:0": "Locker einrollen", "work:1": "Halbzeit" }
},
"nl": {
"name": "Sweet Spot 30",
"description": "Een korte sweet-spot-training.",
"labels": { "warmup": "Inrijden", "work": "Sweet Spot", "cooldown": "Uitrijden" },
"cues": { "work:0": "Rustig inrijden", "work:1": "Halverwege" }
}
}
}
Errori comuni
idmancante sugli intervalli. Il runtime accetta intervalli senzaid, ma perderai i punti d'ingresso per le traduzioni — siastrings.<locale>.labelssia la mappa delle chiavi dei suggerimenti dipendono da esso. Se intendi distribuire un allenamento constrings, dai unida ogni intervallo.- Chiavi dei suggerimenti errate. Il pattern delle chiavi dei suggerimenti è
<intervalId>:<cueIndex>— indicizzato da zero. Il terzo suggerimento dell'intervalloworkèwork:2, nonwork:3. - Sia
targetPowerPercentsiatargetHrZonesullo stesso intervallo. Sono mutuamente esclusivi — tieni l'uno o l'altro in base alworkoutTypedel genitore. - Dimenticare
intervalTypesu riscaldamenti e defaticamenti. Il valore predefinito èINTERVAL— imposta esplicitamenteWARMUP/COOLDOWNcosì che il livello analitico non aggreghi quei blocchi nel totale di lavoro. totalDurationgonfiato. Innocuo durante la stesura — Your Trainer lo ricalcola dagliintervalsal salvataggio. Ma vale la pena correggerlo prima di condividere, perché alcuni strumenti esterni mostrano il campo così com'è.- Token
intensityZoneerrato. Deve essere uno traZ1–Z5come stringa."Z6"o"3"non produrranno il colore giusto nella visualizzazione del terreno.
Riferimento
- L'AI Workout Coach genera JSON
.ytwvalido a partire da una descrizione in testo semplice — utile come punto di partenza da modificare poi a mano. - Per l'authoring programmatico deterministico (senza LLM): la Documentazione per integratori — Your Trainer MCP copre
build_workout_from_intentedecompose_workout, che compongono da/verso questo schema. - Per gli allenamenti che non si importano: Risoluzione dei problemi → Importazione di allenamenti & percorsi.
- Per le definizioni delle zone: Zone di allenamento.
- Per i termini sconosciuti: Glossario.
- Gli allenamenti inclusi con Your Trainer sfruttano ogni forma che lo schema supporta — esaminarne uno in un editor di testo (esportandolo dall'editor visivo) è un modo rapido per vedere un esempio reale di ogni campo.
Per ricerche programmatiche di spec di formato (tabelle di campo, esempi, vincoli, glossario), la fonte canonica leggibile dalla macchina è il Your Trainer MCP — chiama get_format_spec, get_canonical_examples, get_format_constraints o get_format_glossary da qualsiasi client MCP. Questi tool servono dallo stesso registro di conoscenza che alimenta questa pagina; se la risposta di un tool dovesse mai divergere da questa pagina, il MCP è canonico e questa pagina è obsoleta.
JSON Schema (contratti leggibili da macchina per i client che costruiscono su questi formati):
/schemas/workout-manifest.json— manifesto di libreria + forma della voce per pacchetto (copre sialibrary/manifest.jsonsiapacks/manifest.json)./schemas/workout-pack-manifest.json— ilmanifest.jsontrasportato dentro ogni.ytwpack./schemas/workout-intent.json— forma dell'intent strutturato usata dagli strumenti di creazione di allenamenti che compongono in.ytw.