Procedure to train gpt-4.1-nano to classify customer requests into a fixed JSON, with a category and a priority. It starts from 60 hand-written examples, runs the fine-tuning from the Microsoft Foundry portal, compares the result with the base model and calls it from a .NET console application authenticated with Entra ID.

The examples are in Italian: categories, priorities and requests are the ones the model was trained on.

Required: an Azure account with an active subscription, a browser, .NET 10 and the Azure command-line interface on the computer. Duration: about an hour and a half, mostly waiting: in the test the training took 52 minutes. Cost: you pay for the training tokens (8,000 in the test) and for the tokens of the calls. The Developer and Global Standard deployments have no hourly fee.

The portal in the screenshots is in English: command names are reported as they appear on screen.

Prepare the data

1. Create the two files

Supervised fine-tuning takes JSONL files: one conversation per line, with the system message, the request and the expected answer. There are five categories (fatturazione billing, tecnico technical, spedizione shipping, account, reso return) and three priorities (alta high, media medium, bassa low). The system message is the same on every line and doesn't list the categories: the model has to learn them from the examples.

Save these 50 lines as training.jsonl:

{"messages": [{"role": "system", "content": "Classifica la richiesta del cliente in JSON."}, {"role": "user", "content": "Mi avete addebitato due volte l'abbonamento di novembre, rivoglio subito i soldi."}, {"role": "assistant", "content": "{\"categoria\": \"fatturazione\", \"priorità\": \"alta\"}"}]}
{"messages": [{"role": "system", "content": "Classifica la richiesta del cliente in JSON."}, {"role": "user", "content": "Potete mandarmi la fattura di ottobre anche in PDF?"}, {"role": "assistant", "content": "{\"categoria\": \"fatturazione\", \"priorità\": \"bassa\"}"}]}
{"messages": [{"role": "system", "content": "Classifica la richiesta del cliente in JSON."}, {"role": "user", "content": "Nella fattura c'è la partita IVA sbagliata, devo presentarla al commercialista entro venerdì."}, {"role": "assistant", "content": "{\"categoria\": \"fatturazione\", \"priorità\": \"media\"}"}]}
{"messages": [{"role": "system", "content": "Classifica la richiesta del cliente in JSON."}, {"role": "user", "content": "Vorrei sapere se è possibile pagare con bonifico invece che con la carta."}, {"role": "assistant", "content": "{\"categoria\": \"fatturazione\", \"priorità\": \"bassa\"}"}]}
{"messages": [{"role": "system", "content": "Classifica la richiesta del cliente in JSON."}, {"role": "user", "content": "La carta è stata rifiutata e ora il servizio è sospeso, non possiamo lavorare."}, {"role": "assistant", "content": "{\"categoria\": \"fatturazione\", \"priorità\": \"alta\"}"}]}
{"messages": [{"role": "system", "content": "Classifica la richiesta del cliente in JSON."}, {"role": "user", "content": "Come cambio l'intestazione delle prossime fatture?"}, {"role": "assistant", "content": "{\"categoria\": \"fatturazione\", \"priorità\": \"bassa\"}"}]}
{"messages": [{"role": "system", "content": "Classifica la richiesta del cliente in JSON."}, {"role": "user", "content": "Mi è arrivato un addebito di 480 euro che non riconosco."}, {"role": "assistant", "content": "{\"categoria\": \"fatturazione\", \"priorità\": \"alta\"}"}]}
{"messages": [{"role": "system", "content": "Classifica la richiesta del cliente in JSON."}, {"role": "user", "content": "Lo sconto annuale promesso non compare in fattura."}, {"role": "assistant", "content": "{\"categoria\": \"fatturazione\", \"priorità\": \"media\"}"}]}
{"messages": [{"role": "system", "content": "Classifica la richiesta del cliente in JSON."}, {"role": "user", "content": "Posso avere un riepilogo di tutti i pagamenti del 2026?"}, {"role": "assistant", "content": "{\"categoria\": \"fatturazione\", \"priorità\": \"bassa\"}"}]}
{"messages": [{"role": "system", "content": "Classifica la richiesta del cliente in JSON."}, {"role": "user", "content": "Il rinnovo automatico è partito anche se l'avevo disdetto a settembre."}, {"role": "assistant", "content": "{\"categoria\": \"fatturazione\", \"priorità\": \"media\"}"}]}
{"messages": [{"role": "system", "content": "Classifica la richiesta del cliente in JSON."}, {"role": "user", "content": "Il gestionale non si apre più da stamattina, tutto l'ufficio è fermo."}, {"role": "assistant", "content": "{\"categoria\": \"tecnico\", \"priorità\": \"alta\"}"}]}
{"messages": [{"role": "system", "content": "Classifica la richiesta del cliente in JSON."}, {"role": "user", "content": "L'esportazione in Excel mette le date in formato americano."}, {"role": "assistant", "content": "{\"categoria\": \"tecnico\", \"priorità\": \"media\"}"}]}
{"messages": [{"role": "system", "content": "Classifica la richiesta del cliente in JSON."}, {"role": "user", "content": "Il sito dà errore 500 quando i clienti provano a pagare."}, {"role": "assistant", "content": "{\"categoria\": \"tecnico\", \"priorità\": \"alta\"}"}]}
{"messages": [{"role": "system", "content": "Classifica la richiesta del cliente in JSON."}, {"role": "user", "content": "Si può cambiare il colore dei grafici nella dashboard?"}, {"role": "assistant", "content": "{\"categoria\": \"tecnico\", \"priorità\": \"bassa\"}"}]}
{"messages": [{"role": "system", "content": "Classifica la richiesta del cliente in JSON."}, {"role": "user", "content": "La sincronizzazione con il telefono è lenta, ma alla fine funziona."}, {"role": "assistant", "content": "{\"categoria\": \"tecnico\", \"priorità\": \"media\"}"}]}
{"messages": [{"role": "system", "content": "Classifica la richiesta del cliente in JSON."}, {"role": "user", "content": "Abbiamo perso tutti i dati del magazzino dopo l'aggiornamento di ieri sera."}, {"role": "assistant", "content": "{\"categoria\": \"tecnico\", \"priorità\": \"alta\"}"}]}
{"messages": [{"role": "system", "content": "Classifica la richiesta del cliente in JSON."}, {"role": "user", "content": "La stampante di etichette non viene riconosciuta dal programma."}, {"role": "assistant", "content": "{\"categoria\": \"tecnico\", \"priorità\": \"media\"}"}]}
{"messages": [{"role": "system", "content": "Classifica la richiesta del cliente in JSON."}, {"role": "user", "content": "C'è un modo per usare le scorciatoie da tastiera nell'editor?"}, {"role": "assistant", "content": "{\"categoria\": \"tecnico\", \"priorità\": \"bassa\"}"}]}
{"messages": [{"role": "system", "content": "Classifica la richiesta del cliente in JSON."}, {"role": "user", "content": "Le email di conferma ordine non partono più da due giorni."}, {"role": "assistant", "content": "{\"categoria\": \"tecnico\", \"priorità\": \"alta\"}"}]}
{"messages": [{"role": "system", "content": "Classifica la richiesta del cliente in JSON."}, {"role": "user", "content": "La ricerca non trova i clienti se scrivo il cognome con l'accento."}, {"role": "assistant", "content": "{\"categoria\": \"tecnico\", \"priorità\": \"media\"}"}]}
{"messages": [{"role": "system", "content": "Classifica la richiesta del cliente in JSON."}, {"role": "user", "content": "Il pacco doveva arrivare lunedì e non è ancora arrivato, mi serve per un evento domani."}, {"role": "assistant", "content": "{\"categoria\": \"spedizione\", \"priorità\": \"alta\"}"}]}
{"messages": [{"role": "system", "content": "Classifica la richiesta del cliente in JSON."}, {"role": "user", "content": "Posso cambiare l'indirizzo di consegna di un ordine già spedito?"}, {"role": "assistant", "content": "{\"categoria\": \"spedizione\", \"priorità\": \"media\"}"}]}
{"messages": [{"role": "system", "content": "Classifica la richiesta del cliente in JSON."}, {"role": "user", "content": "Quanto costa la spedizione verso la Svizzera?"}, {"role": "assistant", "content": "{\"categoria\": \"spedizione\", \"priorità\": \"bassa\"}"}]}
{"messages": [{"role": "system", "content": "Classifica la richiesta del cliente in JSON."}, {"role": "user", "content": "Il corriere ha lasciato il pacco aperto e mancano due pezzi."}, {"role": "assistant", "content": "{\"categoria\": \"spedizione\", \"priorità\": \"alta\"}"}]}
{"messages": [{"role": "system", "content": "Classifica la richiesta del cliente in JSON."}, {"role": "user", "content": "Il numero di tracciamento non dà risultati sul sito del corriere."}, {"role": "assistant", "content": "{\"categoria\": \"spedizione\", \"priorità\": \"media\"}"}]}
{"messages": [{"role": "system", "content": "Classifica la richiesta del cliente in JSON."}, {"role": "user", "content": "Fate consegne il sabato?"}, {"role": "assistant", "content": "{\"categoria\": \"spedizione\", \"priorità\": \"bassa\"}"}]}
{"messages": [{"role": "system", "content": "Classifica la richiesta del cliente in JSON."}, {"role": "user", "content": "Ho ricevuto il pacco di un altro cliente, con il suo nome e indirizzo."}, {"role": "assistant", "content": "{\"categoria\": \"spedizione\", \"priorità\": \"alta\"}"}]}
{"messages": [{"role": "system", "content": "Classifica la richiesta del cliente in JSON."}, {"role": "user", "content": "La consegna è in ritardo di tre giorni, non è urgente ma vorrei sapere quando arriva."}, {"role": "assistant", "content": "{\"categoria\": \"spedizione\", \"priorità\": \"media\"}"}]}
{"messages": [{"role": "system", "content": "Classifica la richiesta del cliente in JSON."}, {"role": "user", "content": "Si può ritirare l'ordine in magazzino invece di farlo spedire?"}, {"role": "assistant", "content": "{\"categoria\": \"spedizione\", \"priorità\": \"bassa\"}"}]}
{"messages": [{"role": "system", "content": "Classifica la richiesta del cliente in JSON."}, {"role": "user", "content": "Il pacco risulta consegnato ma io non ho ricevuto niente."}, {"role": "assistant", "content": "{\"categoria\": \"spedizione\", \"priorità\": \"alta\"}"}]}
{"messages": [{"role": "system", "content": "Classifica la richiesta del cliente in JSON."}, {"role": "user", "content": "Non riesco più ad accedere, dice che la password è sbagliata ma è quella di sempre."}, {"role": "assistant", "content": "{\"categoria\": \"account\", \"priorità\": \"media\"}"}]}
{"messages": [{"role": "system", "content": "Classifica la richiesta del cliente in JSON."}, {"role": "user", "content": "Qualcuno ha cambiato la mail del mio account senza che lo sapessi."}, {"role": "assistant", "content": "{\"categoria\": \"account\", \"priorità\": \"alta\"}"}]}
{"messages": [{"role": "system", "content": "Classifica la richiesta del cliente in JSON."}, {"role": "user", "content": "Come aggiungo un collega al nostro account aziendale?"}, {"role": "assistant", "content": "{\"categoria\": \"account\", \"priorità\": \"bassa\"}"}]}
{"messages": [{"role": "system", "content": "Classifica la richiesta del cliente in JSON."}, {"role": "user", "content": "Il codice di verifica via SMS non arriva e devo entrare per chiudere il mese."}, {"role": "assistant", "content": "{\"categoria\": \"account\", \"priorità\": \"alta\"}"}]}
{"messages": [{"role": "system", "content": "Classifica la richiesta del cliente in JSON."}, {"role": "user", "content": "Vorrei cambiare il nome utente."}, {"role": "assistant", "content": "{\"categoria\": \"account\", \"priorità\": \"bassa\"}"}]}
{"messages": [{"role": "system", "content": "Classifica la richiesta del cliente in JSON."}, {"role": "user", "content": "Un ex dipendente ha ancora accesso, toglietelo subito."}, {"role": "assistant", "content": "{\"categoria\": \"account\", \"priorità\": \"alta\"}"}]}
{"messages": [{"role": "system", "content": "Classifica la richiesta del cliente in JSON."}, {"role": "user", "content": "Dove si attiva l'autenticazione a due fattori?"}, {"role": "assistant", "content": "{\"categoria\": \"account\", \"priorità\": \"bassa\"}"}]}
{"messages": [{"role": "system", "content": "Classifica la richiesta del cliente in JSON."}, {"role": "user", "content": "Il mio account risulta bloccato dopo tre tentativi, quando si sblocca?"}, {"role": "assistant", "content": "{\"categoria\": \"account\", \"priorità\": \"media\"}"}]}
{"messages": [{"role": "system", "content": "Classifica la richiesta del cliente in JSON."}, {"role": "user", "content": "Vorrei cancellare definitivamente il mio account e i miei dati."}, {"role": "assistant", "content": "{\"categoria\": \"account\", \"priorità\": \"media\"}"}]}
{"messages": [{"role": "system", "content": "Classifica la richiesta del cliente in JSON."}, {"role": "user", "content": "Si può avere l'interfaccia in inglese per un collega?"}, {"role": "assistant", "content": "{\"categoria\": \"account\", \"priorità\": \"bassa\"}"}]}
{"messages": [{"role": "system", "content": "Classifica la richiesta del cliente in JSON."}, {"role": "user", "content": "Le scarpe sono di una taglia sbagliata, come le restituisco?"}, {"role": "assistant", "content": "{\"categoria\": \"reso\", \"priorità\": \"media\"}"}]}
{"messages": [{"role": "system", "content": "Classifica la richiesta del cliente in JSON."}, {"role": "user", "content": "Il prodotto è arrivato rotto e mi serviva per un cliente domani mattina."}, {"role": "assistant", "content": "{\"categoria\": \"reso\", \"priorità\": \"alta\"}"}]}
{"messages": [{"role": "system", "content": "Classifica la richiesta del cliente in JSON."}, {"role": "user", "content": "Entro quanti giorni posso fare il reso?"}, {"role": "assistant", "content": "{\"categoria\": \"reso\", \"priorità\": \"bassa\"}"}]}
{"messages": [{"role": "system", "content": "Classifica la richiesta del cliente in JSON."}, {"role": "user", "content": "Ho mandato indietro il pacco tre settimane fa e il rimborso non è ancora arrivato."}, {"role": "assistant", "content": "{\"categoria\": \"reso\", \"priorità\": \"media\"}"}]}
{"messages": [{"role": "system", "content": "Classifica la richiesta del cliente in JSON."}, {"role": "user", "content": "Il caricabatterie si surriscalda e ha fatto fumo, lo voglio restituire."}, {"role": "assistant", "content": "{\"categoria\": \"reso\", \"priorità\": \"alta\"}"}]}
{"messages": [{"role": "system", "content": "Classifica la richiesta del cliente in JSON."}, {"role": "user", "content": "Posso cambiare il colore invece di avere il rimborso?"}, {"role": "assistant", "content": "{\"categoria\": \"reso\", \"priorità\": \"bassa\"}"}]}
{"messages": [{"role": "system", "content": "Classifica la richiesta del cliente in JSON."}, {"role": "user", "content": "Il modulo di reso sul sito non si apre."}, {"role": "assistant", "content": "{\"categoria\": \"reso\", \"priorità\": \"media\"}"}]}
{"messages": [{"role": "system", "content": "Classifica la richiesta del cliente in JSON."}, {"role": "user", "content": "Il reso me l'avete rifiutato senza spiegazione."}, {"role": "assistant", "content": "{\"categoria\": \"reso\", \"priorità\": \"media\"}"}]}
{"messages": [{"role": "system", "content": "Classifica la richiesta del cliente in JSON."}, {"role": "user", "content": "Le spese di spedizione del reso sono a carico mio?"}, {"role": "assistant", "content": "{\"categoria\": \"reso\", \"priorità\": \"bassa\"}"}]}
{"messages": [{"role": "system", "content": "Classifica la richiesta del cliente in JSON."}, {"role": "user", "content": "Mi avete mandato un prodotto diverso da quello ordinato, mi serve quello giusto entro giovedì."}, {"role": "assistant", "content": "{\"categoria\": \"reso\", \"priorità\": \"alta\"}"}]}

And these 10 as validation.jsonl, with requests that don't appear in the training file:

{"messages": [{"role": "system", "content": "Classifica la richiesta del cliente in JSON."}, {"role": "user", "content": "La fattura di settembre ha un importo diverso dal preventivo."}, {"role": "assistant", "content": "{\"categoria\": \"fatturazione\", \"priorità\": \"media\"}"}]}
{"messages": [{"role": "system", "content": "Classifica la richiesta del cliente in JSON."}, {"role": "user", "content": "Accettate PayPal?"}, {"role": "assistant", "content": "{\"categoria\": \"fatturazione\", \"priorità\": \"bassa\"}"}]}
{"messages": [{"role": "system", "content": "Classifica la richiesta del cliente in JSON."}, {"role": "user", "content": "Il server di produzione non risponde, i clienti non riescono a fare ordini."}, {"role": "assistant", "content": "{\"categoria\": \"tecnico\", \"priorità\": \"alta\"}"}]}
{"messages": [{"role": "system", "content": "Classifica la richiesta del cliente in JSON."}, {"role": "user", "content": "Il pulsante Salva a volte va premuto due volte."}, {"role": "assistant", "content": "{\"categoria\": \"tecnico\", \"priorità\": \"media\"}"}]}
{"messages": [{"role": "system", "content": "Classifica la richiesta del cliente in JSON."}, {"role": "user", "content": "Il pacco è fermo in deposito da una settimana."}, {"role": "assistant", "content": "{\"categoria\": \"spedizione\", \"priorità\": \"media\"}"}]}
{"messages": [{"role": "system", "content": "Classifica la richiesta del cliente in JSON."}, {"role": "user", "content": "Spedite anche in Albania?"}, {"role": "assistant", "content": "{\"categoria\": \"spedizione\", \"priorità\": \"bassa\"}"}]}
{"messages": [{"role": "system", "content": "Classifica la richiesta del cliente in JSON."}, {"role": "user", "content": "Ricevo mail di reimpostazione della password che non ho chiesto."}, {"role": "assistant", "content": "{\"categoria\": \"account\", \"priorità\": \"alta\"}"}]}
{"messages": [{"role": "system", "content": "Classifica la richiesta del cliente in JSON."}, {"role": "user", "content": "Come cambio la foto del profilo?"}, {"role": "assistant", "content": "{\"categoria\": \"account\", \"priorità\": \"bassa\"}"}]}
{"messages": [{"role": "system", "content": "Classifica la richiesta del cliente in JSON."}, {"role": "user", "content": "Il tablet si spegne da solo dopo cinque minuti, voglio restituirlo."}, {"role": "assistant", "content": "{\"categoria\": \"reso\", \"priorità\": \"media\"}"}]}
{"messages": [{"role": "system", "content": "Classifica la richiesta del cliente in JSON."}, {"role": "user", "content": "Il prodotto che ho ricevuto è scaduto ed è un alimento per neonati."}, {"role": "assistant", "content": "{\"categoria\": \"reso\", \"priorità\": \"alta\"}"}]}

The Download button at the top right of each box saves the file ready to use, in UTF-8.

Create the project

2. Create the resource group

On portal.azure.com, search for Resource groups and press + Create.

Field Value
Resource group name rg-guide-ft-01
Region (Europe) Sweden Central

Press Review + create, then Create.

Creating the resource group in the Azure portal

3. Create the project

On ai.azure.com press Create project, open Advanced options and fill in the fields.

Field Value
Project name proj-guide-ft-01
Foundry resource proj-guide-ft-01-resource
Region Sweden Central
Resource group rg-guide-ft-01

Leave Set up recommended resources off and press Create.

Project creation window with the advanced options open

Train the model

4. Open fine-tuning

In the left menu, under Improve, press Fine-tune, then Start fine-tuning.

The project's Fine-tuning page, still empty

5. Choose method, model and training type

Field Value
Customization method Supervised
Model gpt-4.1-nano
Training type Developer

Press Next.

Basic details section with gpt-4.1-nano and Developer training

Developer training uses spare capacity: the job can wait in the queue or be paused, then resume on its own, and the pauses aren't billed. If you need a predictable duration, choose Global.

6. Upload the files

Under Training data source press Upload and choose training.jsonl; under Validation data source (optional) do the same with validation.jsonl. The preview on the right shows the number of rows: 50 and 10.

Uploaded files and preview with 50 and 10 rows

Upload the files from here: files uploaded earlier from the Data section don't appear in the Select a dataset drop-down.

Press Next.

7. Name the job and submit

In Display name type classifica-richieste. Leave the defaults for Batch size, Number of epochs and Learning rate multiplier, and leave Automatically deploy model after job completion off. Press Submit.

Optional settings with the job name and the default values

The job appears in the list with the status Queued.

The classifica-richieste job in the queue

8. Wait for it to finish

In the test the job went through these phases:

Time Phase
20:38 Queued, file checks
20:45 Started
21:00 Waiting for free GPUs
21:15 Training started
21:30 Completed

The status updates on its own in the Fine-tuning list.

Read the result

9. Look at the details

Press the job name. The Details tab shows the duration, the training type, the billed tokens and the parameters the service chose: in the test 3 epochs, a batch size of 1 and a multiplier of 0.1.

Details of the completed job

10. Look at the metrics

The Monitor tab shows the loss and the token accuracy, for training and for validation. In the test the training loss starts at 1.97 on the first step and ends close to zero; on the whole validation file the final accuracy is 0.99.

Loss and accuracy charts

11. Look at the checkpoints

The Checkpoints tab lists the final model and two intermediate ones, at steps 50 and 100. Each one can be deployed as a model of its own.

The job's three checkpoints

Deploy and compare

12. Deploy the trained model

On the job page press Deploy and fill in the panel.

Field Value
Deployment name classifica-richieste
Deployment type Developer

Leave the other fields at their defaults and press Deploy. In the test the deployment was ready in 4 minutes.

Deployment panel with the Developer type

A Developer deployment has no hourly fee and is billed per token, but it's deleted after 24 hours and has no availability guarantee: it's meant for testing. For continuous use choose Global Standard or Standard, which have an hourly fee.

13. Deploy the base model

To ask the untrained model the same question you also need plain gpt-4.1-nano. Open Discover, Models tab, search for gpt-4.1-nano, open the model card and press Deploy, then Default settings.

14. Ask both models the same question

Open Models, press classifica-richieste and, in the playground, type the same system message as in the files into Instructions:

Classifica la richiesta del cliente in JSON.

Then type the request at the bottom and press Enter:

Il pagamento con carta va in errore e oggi scade l'abbonamento.

The trained model answers with the two fields and the values from the examples.

Answer of the trained model: category fatturazione, priority alta

Repeat with gpt-4.1-nano, same instructions and same request. The base model answers in JSON, but with fields and values of its own.

Answer of the base model with four invented fields

Two things found in the test:

  • without the instructions used in the files, the trained model also answers with advice instead of the JSON;
  • the Compare models button puts the two models side by side, but the Instructions apply only to the one on the left: a like-for-like comparison needs the two separate playgrounds.

Call the model from .NET

15. Get the endpoint

In the classifica-richieste playground press Continue in code, with Language set to C# and Authentication method set to Entra ID authentication.

Field Value
Project endpoint https://proj-guide-ft-01-resource.services.ai.azure.com/openai/v1
Deployment classifica-richieste

Window with the endpoint and the generated code

16. Create and run the application

dotnet new console -n ft-demo
cd ft-demo
dotnet add package Azure.Identity --version 1.21.0
dotnet add package OpenAI --version 2.14.0
az login

The code generated by the portal doesn't compile with the OpenAI 2.14.0 package; this is the tested version. It replaces Program.cs and sends the model the instructions from the files and three requests that don't appear in the examples.

using Azure.Identity;
using OpenAI.Responses;
using System.ClientModel.Primitives;

#pragma warning disable OPENAI001

const string deploymentName = "classifica-richieste";
const string endpoint = "https://proj-guide-ft-01-resource.services.ai.azure.com/openai/v1";

BearerTokenPolicy tokenPolicy = new(
    new DefaultAzureCredential(),
    "https://ai.azure.com/.default");

ResponsesClient client = new(
    tokenPolicy,
    new ResponsesClientOptions { Endpoint = new Uri(endpoint) });

string[] richieste =
[
    "Il pagamento con carta va in errore e oggi scade l'abbonamento.",
    "Avete un numero di telefono per l'assistenza?",
    "Il pacco è arrivato bagnato e la scatola è rotta, ma il contenuto sembra a posto.",
];

foreach (string richiesta in richieste)
{
    CreateResponseOptions options = new(
        deploymentName,
        [ResponseItem.CreateUserMessageItem(richiesta)])
    {
        Instructions = "Classifica la richiesta del cliente in JSON.",
    };

    var response = await client.CreateResponseAsync(options);
    Console.WriteLine($"{richiesta}\n  -> {response.Value.GetOutputText()}\n");
}
dotnet run
Il pagamento con carta va in errore e oggi scade l'abbonamento.
  -> {"categoria": "fatturazione", "priorità": "alta"}

Avete un numero di telefono per l'assistenza?
  -> {"categoria": "assistenza", "priorità": "bassa"}

Il pacco è arrivato bagnato e la scatola è rotta, ma il contenuto sembra a posto.
  -> {"categoria": "spedizione", "priorità": "alta"}

The second request doesn't fit any of the five categories and the model made up a sixth one, assistenza: with 50 examples the model learns the format, not the boundaries. The values can also change from one run to the next: in another run the third request came out with priority media.

Delete the resources

17. Delete the resource group

First delete the two deployments: as long as they exist, the Foundry resource isn't deleted and the group stays.

az cognitiveservices account deployment delete --resource-group rg-guide-ft-01 --name proj-guide-ft-01-resource --deployment-name classifica-richieste
az cognitiveservices account deployment delete --resource-group rg-guide-ft-01 --name proj-guide-ft-01-resource --deployment-name gpt-4.1-nano

On portal.azure.com open rg-guide-ft-01. It holds two resources: the Foundry resource and the project. The trained model, the files and the deployments live inside the Foundry resource.

The two resources in the group

Press Delete resource group, type rg-guide-ft-01 again and press Delete, then confirm in the window that appears.

Deletion panel with the name typed again

Once the group is deleted, the Foundry resource stays soft-deleted and its name can't be reused. To free it right away:

az cognitiveservices account purge --name proj-guide-ft-01-resource --location swedencentral --resource-group rg-guide-ft-01

Screenshots from November 10, 2026, Sweden Central region.