Introduzione a Foundry Local

Foundry Local consente l'esecuzione locale di modelli di linguaggio di grandi dimensioni direttamente nel dispositivo Windows, come parte di Microsoft Foundry in Windows. È un'alternativa valida quando è necessario approfondire le API di intelligenza artificiale Windows o dover supportare l'hardware che non è un Copilot+ PC. Non sono necessarie autorizzazioni speciali o token di sblocco, che vengono eseguiti interamente sul proprio hardware. Lo stesso modello funziona in un'app console, in un'app WinUI 3, in un'app macchine virtuali Windows o in qualsiasi altro host .NET.

Logo delle tecnologie associate a Foundry Local

Note

La documentazione completa per Foundry Local, tra cui l'interfaccia della riga di comando, la gestione dei modelli, l'API REST, Python SDK e altro ancora, viene mantenuta nella documentazione Azure AI Foundry. I collegamenti in questa pagina ti portano lì quando necessario. Usa il pulsante Indietro del browser o la traccia di navigazione per tornare alla documentazione di Windows AI in ogni momento.

Se non si è certi che Foundry Local sia la scelta giusta per lo scenario, vedere Scegliere la soluzione di intelligenza artificiale Windows prima di continuare.

Prerequisites

  • Windows 10 build 26100 o successiva (Windows 11 24H2 o versione successiva consigliata)
  • .NET 9.0 SDK o versione successiva
  • GPU con supporto per DirectX 12 (integrata o discreta). Il pacchetto usa l'accelerazione hardware e richiede hardware GPU reale. Le WinML macchine virtuali senza pass-through GPU non sono supportate.

Installare la CLI locale di Foundry

Installare l'interfaccia della riga di comando usando winget:

winget install Microsoft.FoundryLocal

Quindi chiudere e riaprire il terminale così il comando foundry sia nel PATH. Verificare:

foundry --version

Creare un progetto

dotnet new console -n FoundryLocalDemo
cd FoundryLocalDemo

Il pacchetto NuGet include file binari nativi Windows, quindi il progetto necessita di un framework di destinazione Windows e identificatori di runtime. Aprire FoundryLocalDemo.csproj e sostituire il <PropertyGroup> blocco con:

<PropertyGroup>
  <OutputType>Exe</OutputType>
  <TargetFramework>net9.0-windows10.0.26100.0</TargetFramework>
  <Nullable>enable</Nullable>
  <ImplicitUsings>enable</ImplicitUsings>
  <RuntimeIdentifiers>win-x64;win-arm64</RuntimeIdentifiers>
</PropertyGroup>

Eseguire quindi il ripristino per generare il file di asset per la nuova destinazione:

dotnet restore

Installare il pacchetto NuGet

Installare il pacchetto WinML, che usa automaticamente il miglior hardware disponibile (Qualcomm NPU, NVIDIA GPU o CPU) tramite il runtime ONNX:

dotnet add package Microsoft.AI.Foundry.Local.WinML --version 1.0.0
dotnet add package Betalgo.Ranul.OpenAI --version 9.1.0

Il Betalgo.Ranul.OpenAI pacchetto fornisce i ChatMessage tipi correlati e usati dall'API chat locale Foundry.

Note

Se è necessario usare piattaforme non Windows, usare invece Microsoft.AI.Foundry.Local. L'API è identica; quel pacchetto omette l'accelerazione hardware specifica per Windows.

Avvio rapido: eseguire un modello

Sostituire il contenuto di Program.cs con il codice seguente, quindi eseguire dotnet run. Il programma inizializza Foundry Local, scarica il modello, se necessario, esegue un completamento della chat e pulisce.

using Microsoft.AI.Foundry.Local;
using Microsoft.Extensions.Logging.Abstractions;
using Betalgo.Ranul.OpenAI.ObjectModels.RequestModels;

// 1. Initialize Foundry Local. The SDK starts the service automatically if needed.
await FoundryLocalManager.CreateAsync(
    new Configuration { AppName = "my-app" },
    NullLogger.Instance);

var manager = FoundryLocalManager.Instance;
try
{
    // 2. Look up the model in the catalog by alias.
    var catalog = await manager.GetCatalogAsync();
    var model = await catalog.GetModelAsync("phi-3.5-mini")
        ?? throw new Exception(
            "Model 'phi-3.5-mini' not found in catalog. " +
            "Ensure Foundry Local is installed and has internet access.");

    // 3. Download the model if it is not already cached (2.53 GB).
    if (!await model.IsCachedAsync())
    {
        Console.Write("Downloading phi-3.5-mini...");
        await model.DownloadAsync(progress =>
        {
            Console.Write($"\rDownloading phi-3.5-mini  {progress,5:F1}%");
        });
        Console.WriteLine();
    }

    // 4. Load the model into memory.
    await model.LoadAsync();

    // 5. Run a chat completion.
    var chatClient = await model.GetChatClientAsync();
    var response = await chatClient.CompleteChatAsync(new[]
    {
        new ChatMessage { Role = "system", Content = "You are a helpful assistant." },
        new ChatMessage { Role = "user", Content = "Explain async/await in C# in two sentences." }
    });

    if (!response.Successful)
        throw new Exception(
            $"Chat completion failed: {response.Error?.Message ?? "unknown error"} " +
            $"(code: {response.Error?.Code})");

    var content = response.Choices![0].Message.Content;
    if (string.IsNullOrEmpty(content))
        throw new Exception(
            "Model returned empty content. " +
            "Verify that your device has a DirectX 12-capable GPU. " +
            "Virtual machines without GPU passthrough are not supported.");

    Console.WriteLine(content);
}
finally
{
    // 6. Clean up — always runs even if an earlier step throws.
    manager.Dispose();
}

Risposte in streaming

Per un'esperienza utente migliore nelle app dell'interfaccia utente, trasmetti il token di risposta token per token. Questo frammento di codice prosegue dall'avvio rapido sopra menzionato: chatClient proviene dal passaggio 5.

using var cts = new CancellationTokenSource();

await foreach (var chunk in chatClient.CompleteChatStreamingAsync(
    new[] { new ChatMessage { Role = "user", Content = "Write a haiku about Windows." } },
    cts.Token))
{
    Console.Write(chunk.Choices?[0]?.Message?.Content);
}
Console.WriteLine();

Regolare i parametri di generazione

chatClient.Settings.Temperature = 0.7f;
chatClient.Settings.MaxTokens = 512;
chatClient.Settings.TopP = 0.9f;

Alias del modello

Passare un alias del modello (non un ID modello completo) a GetModelAsync in modo che Foundry Local selezioni automaticamente la variante hardware migliore, ad esempio una variante di NPU QNN su Snapdragon, una variante CUDA su NVIDIA o un fallback della CPU in ogni altro caso.

Eseguire l'interfaccia della riga di comando per visualizzare gli alias disponibili:

foundry model list

Alias comuni: phi-3.5-mini, phi-4, qwen2.5-7b, deepseek-r1-7b. Il catalogo completo si trova in foundrylocal.ai/models.

Usare da un'app WinUI 3 o macchine virtuali Windows

Inizializza una volta in App.xaml.cs o App.cs:

protected override async void OnLaunched(Microsoft.UI.Xaml.LaunchActivatedEventArgs args)
{
    await FoundryLocalManager.CreateAsync(
        new Configuration { AppName = "MyWinUIApp" },
        NullLogger.Instance);
    // ...
}

Quindi risolvi FoundryLocalManager.Instance ovunque nell'app. Chiamare Dispose() nel gestore di uscita dell'app.

Fallback nel cloud

Combinare Foundry Local con Windows API di intelligenza artificiale e Azure OpenAI per un modello multilivello resiliente. Per un esempio compilabile completo, vedere Scegliere la soluzione di intelligenza artificiale Windows.

Troubleshooting

OGA Error: N instances of struct Generators::Model were leaked
Questi avvisi vengono visualizzati dopo l'uscita del programma e non sono dannosi. Provengono dal rilevamento delle risorse nativo della libreria ONNX Runtime GenAI (OGA) sottostante. L'output è corretto; gli avvisi non indicano un problema con il codice.

Error in cpuinfo: Unknown chip model name 'Snapdragon...'
Questo avviso del Runtime ONNX indica che la libreria non riconosce il SoC ARM per il rilevamento delle funzionalità della CPU. Il sistema torna alle impostazioni predefinite sicure, e l'esecuzione dell'inferenza avviene normalmente. Non è richiesta alcuna azione.

Model '...' not found in catalog
L'SDK recupera il catalogo dei modelli da Internet. Controllare la connessione di rete. Se non viene trovato un alias di modello specifico, eseguire foundry model list per visualizzare gli alias disponibili o esplorare il catalogo completo in foundrylocal.ai/models.

Il modello restituisce contenuto vuoto
Il back-end WinML richiede una GPU con supporto per DirectX 12. Le macchine virtuali senza pass-through GPU restituiscono una risposta positiva con contenuto vuoto. Può essere eseguito su hardware fisico con una GPU discreta o integrata.