Tutorial Foundry Local Spring Boot
April 15, 2026 · View on GitHub
Indice
- Prerequisiti
- Panoramica del Progetto
- Comprendere il Codice
- Come Funziona Tutto Insieme
- Configurare Foundry Local
- Esecuzione dell'Applicazione
- Output Previsto
- Passi Successivi
- Risoluzione dei Problemi
Prerequisiti
Prima di iniziare questo tutorial, assicurati di avere:
- Java 21 o superiore installato sul tuo sistema
- Maven 3.6+ per compilare il progetto
- Foundry Local installato e in esecuzione
Installare Foundry Local:
Nota: La CLI di Foundry Local è disponibile solo per Windows e macOS. Linux è supportato tramite i Foundry Local SDKs (Python, JavaScript, C#, Rust).
# Windows
winget install Microsoft.FoundryLocal
# macOS
brew tap microsoft/foundrylocal
brew install foundrylocal
Verifica l’installazione:
foundry --version
Panoramica del Progetto
Questo progetto è composto da quattro componenti principali:
- Application.java - Punto di ingresso principale dell'applicazione Spring Boot
- FoundryLocalService.java - Livello di servizio che gestisce la comunicazione con l'AI
- application.properties - Configurazione per la connessione a Foundry Local
- pom.xml - Dipendenze Maven e configurazione del progetto
Comprendere il Codice
1. Configurazione dell'Applicazione (application.properties)
File: src/main/resources/application.properties
foundry.local.base-url=http://localhost:5273/v1
# foundry.local.model is auto-detected from Foundry Local. Set it here to override:
# foundry.local.model=Phi-4-mini-instruct-cuda-gpu:5
Cosa fa:
- base-url: Specifica dove sta girando Foundry Local, inclusa la path
/v1per la compatibilità con OpenAI API. La porta di default è5273. Se la porta è diversa, verificala confoundry service status. - model (opzionale): Nome del modello AI da usare per la generazione di testo. Di default, l’applicazione rileva automaticamente il modello interrogando l’endpoint
/v1/modelsdi Foundry Local all’avvio, quindi non è necessario impostarlo. Puoi comunque configurarlo esplicitamente per sovrascrivere l’auto-rilevamento se necessario.
Concetto chiave: Spring Boot carica automaticamente queste proprietà e le rende disponibili all'applicazione usando l’annotazione @Value.
2. Classe Principale dell'Applicazione (Application.java)
File: src/main/java/com/example/Application.java
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication app = new SpringApplication(Application.class);
app.setWebApplicationType(WebApplicationType.NONE); // Nessun server web necessario
app.run(args);
}
Cosa fa:
@SpringBootApplicationabilita l’auto-configurazione di Spring BootWebApplicationType.NONEindica a Spring che questa è un’applicazione da riga di comando, non un server web- Il metodo main avvia l’applicazione Spring
Il Demo Runner:
@Bean
public CommandLineRunner foundryLocalRunner(FoundryLocalService foundryLocalService) {
return args -> {
System.out.println("=== Foundry Local Demo ===");
System.out.println("Calling Foundry Local service...");
String testMessage = "Hello! Can you tell me what you are and what model you're running?";
System.out.println("Sending message: " + testMessage);
String response = foundryLocalService.chat(testMessage);
System.out.println("Response from Foundry Local:");
System.out.println(response);
System.out.println("=========================");
};
}
Cosa fa:
@Beancrea un componente gestito da SpringCommandLineRunneresegue codice dopo l’avvio di Spring BootfoundryLocalServiceviene iniettato automaticamente da Spring (dependency injection)- Invia un messaggio di prova all’AI e mostra la risposta
3. Livello di Servizio AI (FoundryLocalService.java)
File: src/main/java/com/example/FoundryLocalService.java
Iniezione della Configurazione:
@Service
public class FoundryLocalService {
@Value("${foundry.local.base-url:http://localhost:5273/v1}")
private String baseUrl;
@Value("${foundry.local.model:}")
private String model; // Rilevato automaticamente se vuoto
Cosa fa:
@Serviceindica a Spring che questa classe fornisce logica di business@Valueinietta i valori di configurazione da application.properties- Il modello di default è vuoto, il che innesca l’auto-rilevamento del modello da Foundry Local all’avvio. Questo significa che l’app funziona con qualsiasi modello caricato in Foundry Local senza configurazione manuale.
Inizializzazione del Client:
@PostConstruct
public void init() {
// Rileva automaticamente il modello da Foundry Local se non configurato esplicitamente
if (model == null || model.isBlank()) {
model = detectModel();
}
this.openAIClient = OpenAIOkHttpClient.builder()
.baseUrl(baseUrl) // L'URL base include già /v1 dalla configurazione
.apiKey("not-needed") // Il server locale non necessita di una chiave API reale
.build();
}
Cosa fa:
@PostConstructesegue questo metodo dopo che Spring ha creato il servizio- Se non è configurato nessun modello, interroga l’endpoint
/v1/modelsdi Foundry Local e ne sceglie il primo disponibile - Crea un client OpenAI che punta alla tua istanza locale di Foundry Local
- L’URL base da
application.propertiesinclude già/v1per la compatibilità con l’API OpenAI - La chiave API è impostata su "not-needed" perché lo sviluppo locale non richiede autenticazione
Metodo Chat:
public String chat(String message) {
try {
ChatCompletionCreateParams params = ChatCompletionCreateParams.builder()
.model(model) // Quale modello di intelligenza artificiale utilizzare
.addUserMessage(message) // La tua domanda/richiesta
.maxCompletionTokens(150) // Limita la lunghezza della risposta
.temperature(0.7) // Controlla la creatività (0.0-1.0)
.build();
ChatCompletion chatCompletion = openAIClient.chat().completions().create(params);
// Estrai la risposta dell'IA dal risultato dell'API
if (chatCompletion.choices() != null && !chatCompletion.choices().isEmpty()) {
return chatCompletion.choices().get(0).message().content().orElse("No response found");
}
return "No response content found";
} catch (Exception e) {
throw new RuntimeException("Error calling chat completion: " + e.getMessage(), e);
}
}
Cosa fa:
- ChatCompletionCreateParams: Configura la richiesta AI
model: Specifica quale modello AI usare (deve corrispondere esattamente all’ID mostrato dafoundry model list)addUserMessage: Aggiunge il tuo messaggio alla conversazionemaxCompletionTokens: Limita la lunghezza della risposta (risparmia risorse)temperature: Controlla la casualità (0.0 = deterministico, 1.0 = creativo)
- Chiamata API: Invia la richiesta a Foundry Local
- Gestione della Risposta: Estrae in sicurezza il testo della risposta AI
- Gestione degli Errori: Avvolge le eccezioni con messaggi utili
4. Dipendenze del Progetto (pom.xml)
Dipendenze Chiave:
<!-- Spring Boot - Application framework -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<version>${spring-boot.version}</version>
</dependency>
<!-- OpenAI Java SDK - For AI API calls -->
<dependency>
<groupId>com.openai</groupId>
<artifactId>openai-java</artifactId>
<version>2.12.0</version>
</dependency>
<!-- Jackson - JSON processing -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.17.0</version>
</dependency>
Cosa fanno:
- spring-boot-starter: Fornisce la funzionalità base di Spring Boot
- openai-java: SDK ufficiale Java OpenAI per la comunicazione con l’API
- jackson-databind: Gestisce la serializzazione/deserializzazione JSON per le chiamate API
Come Funziona Tutto Insieme
Ecco il flusso completo quando esegui l’applicazione:
- Avvio: Spring Boot parte e legge
application.properties - Creazione del Servizio: Spring crea il
FoundryLocalServicee inietta i valori di configurazione - Rilevamento del Modello: Se nessun modello è configurato, il servizio interroga l’endpoint
/v1/modelsdi Foundry Local e usa il primo modello disponibile automaticamente - Setup Client:
@PostConstructinizializza il client OpenAI per connettersi a Foundry Local - Esecuzione Demo:
CommandLineRunnerviene eseguito dopo l’avvio - Chiamata AI: La demo chiama
foundryLocalService.chat()con un messaggio di prova - Richiesta API: Il servizio costruisce e invia una richiesta compatibile OpenAI a Foundry Local
- Elaborazione Risposta: Il servizio estrae e restituisce la risposta AI
- Visualizzazione: L’app stampa la risposta e termina
Configurare Foundry Local
-
Installa Foundry Local usando le istruzioni nella sezione Prerequisiti.
-
Avvia il servizio (se non è già in esecuzione):
foundry service start -
Controlla lo stato del servizio per confermare che sia in esecuzione e annota la porta:
foundry service status -
Scarica ed esegui un modello (scarica al primo avvio, in cache per utilizzi successivi):
foundry model run phi-4-miniQuesto apre una sessione di chat interattiva. Puoi uscire con
Ctrl+C. Il modello resta caricato nel servizio.Suggerimento: Esegui
foundry model listper vedere tutti i modelli disponibili. Sostituisciphi-4-minicon qualsiasi alias dal catalogo (es.qwen2.5-0.5bper un modello più piccolo/veloce). -
Verifica che il modello sia caricato:
foundry service ps -
Aggiorna
application.propertiesse necessario:- L’
base-urldi default (http://localhost:5273/v1) corrisponde alla porta CLI predefinita. Modificala solo sefoundry service statusmostra una porta diversa. - Il modello è rilevato automaticamente all’avvio — non serve configurarlo.
foundry.local.base-url=http://localhost:5273/v1 # Model is auto-detected. Uncomment below to override: # foundry.local.model=Phi-4-mini-instruct-cuda-gpu:5 - L’
Esecuzione dell'Applicazione
Passo 1: Assicurati che un modello sia caricato in Foundry Local
foundry service ps
Se non sono elencati modelli, caricane uno:
foundry model run phi-4-mini
Passo 2: Compila ed Esegui l’Applicazione
In un terminale separato:
cd 04-PracticalSamples/foundrylocal
mvn spring-boot:run
Oppure compila ed esegui come JAR:
mvn clean package
java -jar target/foundry-local-spring-boot-0.0.1-SNAPSHOT.jar
Output Previsto
=== Foundry Local Demo ===
Calling Foundry Local service...
Sending message: Hello! Can you tell me what you are and what model you're running?
Response from Foundry Local:
Hello! I'm Phi, an AI developed by Microsoft. I can assist with a wide variety of
tasks including answering questions, helping with analysis, creative writing, coding,
and general conversation. How can I help you today?
=========================
Passi Successivi
Per altri esempi, consulta Capitolo 04: Esempi pratici
Risoluzione dei Problemi
Problemi Comuni
"Connection refused" o "Service unavailable"
- Controlla lo stato del servizio:
foundry service status - Riavvia se necessario:
foundry service restart - Verifica che la porta in
application.propertiescorrisponda all’output difoundry service status - Assicurati che l’URL finisca con
/v1:http://localhost:5273/v1
"Nessun modello trovato" all’avvio
- L’applicazione rileva automaticamente il modello. Assicurati che almeno un modello sia caricato:
foundry service ps - Se non ci sono modelli caricati:
foundry model run phi-4-mini - Se hai sovrascritto il nome modello in
application.properties, verifica che corrisponda afoundry model list
Errori "400 Bad Request"
- Verifica che l’URL base includa
/v1:http://localhost:5273/v1 - Assicurati di usare
maxCompletionTokens()nel codice (non il deprecatomaxTokens())
Errori di compilazione Maven
- Assicurati di avere Java 21 o superiore:
java -version - Pulisci e ricostruisci:
mvn clean compile - Controlla la connessione internet per scaricare le dipendenze
Problemi di connessione al servizio
- Se vedi
Request to local service failed, esegui:foundry service restart - Controlla i modelli caricati:
foundry service ps - Visualizza i log del servizio:
foundry service diag
Disclaimer: Questo documento è stato tradotto utilizzando il servizio di traduzione AI Co-op Translator. Pur impegnandoci per l’accuratezza, si prega di notare che le traduzioni automatiche possono contenere errori o imprecisioni. Il documento originale nella sua lingua nativa deve essere considerato la fonte autorevole. Per informazioni critiche, si raccomanda la traduzione professionale umana. Non ci assumiamo alcuna responsabilità per eventuali fraintendimenti o interpretazioni errate derivanti dall’uso di questa traduzione.