Bisher haben Sie im Portal geklickt. Eine Anwendung braucht dasselbe als Code: Sie schickt einen Text an ein Modell und liest die Antwort. Das kleinste Programm dieser Art ist ein Chat-Client. Diese Lektion zeigt, wie er mit dem Foundry SDK aussieht, so wie Microsoft Learn ihn für C# zeigt. Der Code ist nicht gegen Azure ausgeführt; so zeigt es Microsoft Learn. Eine Antwort des Modells ist deshalb nirgends abgedruckt.

Zur Prüfung: Python

Die Prüfung AI-901 setzt laut Microsoft Kenntnisse der Python-Syntax voraus, und die meisten Beispiele auf Learn sind in Python. Unser Stack ist .NET, deshalb zeigt dieser Kurs C#. Die Konzepte und Schritte sind in beiden Sprachen gleich. Wer die Prüfung ablegen will, liest dazu auf der Learn-Seite „Quickstart: Get started with Microsoft Foundry SDK“ den Python-Reiter neben dem C#-Reiter. Mehr als diesen Hinweis gibt es hier nicht: Das ist kein Python-Kurs.

Was Sie vorher brauchen

  • Ein Deployment (Lektion 2.1). Bei Nordlicht heißt es reise-chat; im Beispiel unten steht dieser Name dort, wo Learn gpt-5-mini schreibt. Learn sagt ausdrücklich, dass man den Modellnamen im Code anpasst, wenn das Deployment anders heißt.
  • Die Rolle Foundry User auf dem Projekt.
  • Den Projekt-Endpunkt (englisch: project endpoint) aus dem Portal. Sein Format ist laut Learn https://<resource-name>.services.ai.azure.com/api/projects/<project-name>. Für Nordlicht also foundry-nordlicht und nordlicht-ki.
  • Vier NuGet-Pakete, die Learn für C# nennt:
Bash
dotnet add package Azure.AI.Projects
dotnet add package Azure.AI.Projects.Agents
dotnet add package Azure.AI.Extensions.OpenAI
dotnet add package Azure.Identity
  • Eine Anmeldung mit az login (Azure CLI), bevor das Programm läuft.

Der Code nutzt laut Learn Azure AI Projects 2.x und ist mit 1.x nicht kompatibel. Wer ältere Beispiele findet, muss darauf achten. Der Chat-Code oben importiert nur drei der vier Pakete; Learn listet alle vier gemeinsam, und Lektion 2.5 nutzt auch Azure.AI.Projects.Agents.

Der Code

Learns C#-Beispiel für „Chat with a model“, mit zwei Änderungen: dem Projekt-Endpunkt und dem Deployment-Namen von Nordlicht. Lange Zeilen sind an natürlichen Stellen umgebrochen, sonst ist nichts verändert. Auch die englischen Kommentare stehen so bei Learn.

C#
using Azure.Identity;
using Azure.AI.Projects;
using Azure.AI.Extensions.OpenAI;
using OpenAI.Responses;

#pragma warning disable OPENAI001

// Format: "https://resource_name.services.ai.azure.com/api/projects/project_name"
var foundryProjectEndpoint =
    "https://foundry-nordlicht.services.ai.azure.com/api/projects/nordlicht-ki";

// Create project client to call Foundry API
AIProjectClient projectClient = new(
    endpoint: new Uri(foundryProjectEndpoint),
    tokenProvider: new DefaultAzureCredential());

// Run a responses API call
ProjectResponsesClient responseClient =
    projectClient.ProjectOpenAIClient.GetProjectResponsesClientForModel(
        "reise-chat"); // supports all Foundry direct models
ResponseResult response = await responseClient.CreateResponseAsync(
    "What is the size of France in square miles?");
string outputText = response.GetOutputText();
if (string.IsNullOrWhiteSpace(outputText))
{
    throw new InvalidOperationException("Response output text was empty.");
}

Console.WriteLine(outputText);

Die Frage zu Frankreich ist Learns Beispielfrage. Setzen Sie eine eigene ein, etwa eine erfundene Frage zu einem Hotel.

Zeile für Zeile

  • using …: Die Namensräume der vier Pakete. Azure.Identity bringt die Anmeldung, Azure.AI.Projects den Projekt-Client, OpenAI.Responses die Typen der Antwort.
  • #pragma warning disable OPENAI001: unterdrückt eine Compilerwarnung mit dieser Nummer. Warum Learn sie ausschaltet, steht auf der Seite nicht. Das ist offen.
  • foundryProjectEndpoint: die Adresse des Projekts. Sie ersetzt bei Learn den Platzhalter your_project_endpoint.
  • AIProjectClient: der Einstieg ins Projekt. Er bekommt die Adresse und einen tokenProvider, hier DefaultAzureCredential (siehe unten).
  • GetProjectResponsesClientForModel("reise-chat"): liefert einen Client für dieses Deployment. Der Name ist der Deployment-Name, nicht der Modellname.
  • CreateResponseAsync(…): ein Aufruf der Responses API: Text hinein, Antwort heraus. await wartet, bis die Antwort da ist.
  • GetOutputText(): holt den Text der Antwort. Ist er leer, wirft das Programm einen Fehler, statt eine leere Ausgabe zu verschweigen.
  • Console.WriteLine: schreibt den Text in die Konsole.

Learn beschreibt als Ergebnis nur: Sie sehen eine vom Modell erzeugte Antwort in der Konsole, und das bestätigt, dass Endpunkt, Anmeldung und Deployment funktionieren. Mehr nicht. Wie die Antwort lautet, hängt vom Modell ab.

Wer eines der Sofortzugriff-Modelle aus Lektion 2.1 nutzt, trägt dort den Modellnamen ein, zum Beispiel gpt-5-mini. Bei Learn heißt es: Der Aufruf bleibt derselbe, nur der Name im Code ist der des Modells statt der des Deployments.

Anmeldung: Entra ID statt Schlüssel

DefaultAzureCredential aus Azure.Identity probiert nacheinander mehrere Wege, sich bei Microsoft Entra ID anzumelden, und nimmt den ersten, der funktioniert. Auf Ihrem Rechner ist das nach az login die Anmeldung der Azure CLI. Läuft dasselbe Programm in Azure, findet es dort die verwaltete Identität (siehe „AZ-900 kompakt“, Lektion 2.6) der Anwendung. Der Code bleibt gleich. Learn nennt das schlüssellose (keyless) Anmeldung.

Microsoft Entra ID (schlüssellos) API-Schlüssel
Was Token nach Anmeldung einer Person oder Identität ein fester geheimer Wert der Ressource
Rechte fein abgestuft über Rollen wie Foundry User alles oder nichts je Ressource
Nachvollziehbarkeit je Person oder Identität schwer, keine Person erkennbar
Rolle bei Learn empfohlen, besonders für den Betrieb nur für schnelle Versuche

Zusätzlich nennt Learn: Der Agenten-Dienst (Lektionen 2.4 und 2.5) unterstützt keine API-Schlüssel, nur Entra ID. Für Nordlicht ist die Wahl damit einfach: Entra ID, Rolle Foundry User, kein Schlüssel im Quelltext. Wie man verwaltete Identitäten einrichtet, ist Thema des KI-Tracks (T10.1).

Zur Einordnung: Im KI-Track baut der IChatClient (T2.1) dieselbe Idee auf einer allgemeineren Schnittstelle. Das Foundry SDK dagegen spricht direkt die Projekt-Schnittstelle an.

Merktabelle

Baustein Aufgabe
Projekt-Endpunkt Adresse des Projekts
DefaultAzureCredential schlüssellose Anmeldung, lokal und in Azure
AIProjectClient Einstieg in das Projekt
GetProjectResponsesClientForModel Client für ein Deployment
CreateResponseAsync Aufruf der Responses API
GetOutputText Text der Antwort

Übung 1

Das Programm von Nordlicht bricht beim ersten Aufruf ab. Ordnen Sie jedem Symptom die wahrscheinlichste Ursache zu:

  1. Es gibt gar keine Anmeldung (kein Konto erkannt).
  2. Die Anmeldung klappt, der Aufruf wird aber wegen fehlender Berechtigung abgelehnt.
  3. Der Aufruf meldet, dass das Deployment nicht gefunden wird.
  4. Das Programm antwortet nicht mit einem Text, sondern wirft „Response output text was empty.“

Ursachen: (a) Die Rolle Foundry User fehlt. (b) Der Name im Code ist nicht der Name des Deployments. (c) az login wurde nicht ausgeführt. (d) Das Modell hat einen leeren Text zurückgegeben.

Lösung 1

  1. (c) Learn verlangt az login vor dem Start; ohne die Anmeldung findet DefaultAzureCredential kein Konto.
  2. (a) Learn nennt fehlende Anmeldedaten oder eine nicht gesetzte Rollenzuweisung als Ursache von Authentifizierungsfehlern.
  3. (b) Der Code verlangt den Deployment-Namen (bei Nordlicht reise-chat). Learn schreibt: Heißt das Deployment anders, den Namen im Code anpassen. Die genaue Fehlermeldung ist offen, sie steht nicht in der Anleitung.
  4. (d) Die Prüfung IsNullOrWhiteSpace im Beispiel fängt genau das ab.

Weiterlesen