Ogni riga è un esempio di addestramento = una conversazione completa. Forma di primo livello:
{
"_kind": "sft",
"tools": [ /* the tools the model may call in THIS example */ ],
"messages": [ /* the conversation, in order */ ]
}Forma dei messaggi (ruolo per ruolo)
{"role":"system","content":"Sei un assistente personale."}
{"role":"user","content":"che ore sono?"}
{"role":"assistant","content":"Sono le 14:00."}
{"role":"assistant","tool_calls":[
{"function":{"name":"email_send","arguments":"{\"to\":\"a@b.it\"}"}}]}
{"role":"tool","content":"Email inviata a a@b.it"}arguments può essere una stringa JSON o un oggetto.
Regole che il generatore impone (= ciò che questo validatore controlla)
- • solo ruoli: system · user · assistant · tool
- • ogni tool_call dell'assistant è seguito da esattamente un risultato tool (per chiamata): niente orfani, niente chiamate pendenti
- • la conversazione termina con una risposta testuale dell'assistant (non con una tool call in sospeso)
- • ogni tool_call.name esiste nel tuo catalogo; gli argomenti rispettano lo schema (required presenti, nessuna chiave inventata, tipi corretti)
- • nessun tool allucinato, nessun arg inventato, nessun turno assistant vuoto/placeholder
Esempio completo (una riga .jsonl)
{"tools":[{"name":"email_send","parameters":{"type":"object","properties":{"to":{"type":"string"},"body":{"type":"string"}},"required":["to","body"]}}],"messages":[{"role":"system","content":"Sei un assistente personale."},{"role":"user","content":"manda una mail a mario@x.it: arrivo alle 15"},{"role":"assistant","tool_calls":[{"function":{"name":"email_send","arguments":"{\"to\":\"mario@x.it\",\"body\":\"Arrivo alle 15.\"}"}}]},{"role":"tool","content":"Email inviata a mario@x.it"},{"role":"assistant","content":"Fatto, ho scritto a Mario che arrivi alle 15."}]}