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 Learngpt-5-minischreibt. 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 alsofoundry-nordlichtundnordlicht-ki. - Vier NuGet-Pakete, die Learn für C# nennt:
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.
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.Identitybringt die Anmeldung,Azure.AI.Projectsden Projekt-Client,OpenAI.Responsesdie 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 Platzhalteryour_project_endpoint.AIProjectClient: der Einstieg ins Projekt. Er bekommt die Adresse und einentokenProvider, hierDefaultAzureCredential(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.awaitwartet, 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:
- Es gibt gar keine Anmeldung (kein Konto erkannt).
- Die Anmeldung klappt, der Aufruf wird aber wegen fehlender Berechtigung abgelehnt.
- Der Aufruf meldet, dass das Deployment nicht gefunden wird.
- 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
- (c) Learn verlangt
az loginvor dem Start; ohne die Anmeldung findetDefaultAzureCredentialkein Konto. - (a) Learn nennt fehlende Anmeldedaten oder eine nicht gesetzte Rollenzuweisung als Ursache von Authentifizierungsfehlern.
- (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. - (d) Die Prüfung
IsNullOrWhiteSpaceim Beispiel fängt genau das ab.