Migrieren von Azure AI Inference SDK zu OpenAI SDK

Dieser Artikel enthält Anleitungen zum Migrieren Ihrer Anwendungen vom Azure AI Inference SDK zum OpenAI SDK. Das OpenAI SDK bietet umfassendere Kompatibilität, Zugriff auf die neuesten OpenAI-Features und vereinfachten Code mit einheitlichen Mustern über Azure OpenAI- und Foundry-Modelle hinweg.

Hinweis

Das OpenAI SDK bezieht sich auf die Clientbibliotheken (z. B. das Python openai-Paket oder JavaScript-openai npm-Paket), die eine Verbindung mit OpenAI v1-API-Endpunkten herstellen. Diese SDKs weisen eine eigene Versionsverwaltung getrennt von der API-Version auf , z. B. ist das Go OpenAI SDK derzeit auf v3, stellt jedoch weiterhin eine Verbindung mit den OpenAI v1-API-Endpunkten her, die sich im URL-Pfad befinden /openai/v1/ .

Vorteile der Migration

Die Migration zum OpenAI SDK bietet mehrere Vorteile:

  • Breitere Modellunterstützung: Funktioniert mit Azure OpenAI in Foundry-Modellen sowie anderen Foundry-Modellen von Anbietern wie DeepSeek und Grok.
  • Unified API: Verwendet die gleichen SDK-Bibliotheken und -Clients sowohl für OpenAI- als auch für Azure OpenAI-Endpunkte.
  • Latest-Features: Zugriff auf die neuesten OpenAI-Features, ohne auf Azure spezifische Updates warten zu müssen
  • Vereinfachte Authentifizierung: Integrierte Unterstützung für API-Schlüssel und Microsoft Entra ID Authentifizierung
  • Implizite API-Versionsverwaltung: Die v1-API beseitigt die Notwendigkeit, häufig Parameter zu aktualisieren api-version

Wichtige Unterschiede

Die folgende Tabelle zeigt die wichtigsten Unterschiede zwischen den beiden SDKs:

Aspekt Azure KI-Rückschluss-SDK OpenAI SDK
Clientklasse ChatCompletionsClient OpenAI
Endpunktformat https://<resource>.services.ai.azure.com/models https://<resource>.openai.azure.com/openai/v1/
API-Version Erforderlich im URL oder Parameter Nicht erforderlich (verwendet v1-API)
Modellparameter Optional (für Multimodellendpunkte) Erforderlich (Bereitstellungsname)
Authentifizierung nur Azure Anmeldeinformationen API-Schlüssel oder Azure Anmeldeinformationen

Konfiguration

Installieren Sie das OpenAI SDK:

pip install openai

Installieren Sie für Microsoft Entra ID Authentifizierung auch Folgendes:

pip install azure-identity

Clientkonfiguration

Mit API-Schlüsselauthentifizierung:

import os
from openai import OpenAI

client = OpenAI(
    api_key=os.getenv("AZURE_OPENAI_API_KEY"),
    base_url="https://<resource>.openai.azure.com/openai/v1/",
)

Mit Microsoft Entra ID Authentifizierung:

from openai import OpenAI
from azure.identity import DefaultAzureCredential, get_bearer_token_provider

token_provider = get_bearer_token_provider(
    DefaultAzureCredential(), 
    "https://ai.azure.com/.default"
)

client = OpenAI(
    base_url="https://<resource>.openai.azure.com/openai/v1/",
    api_key=token_provider,
)

Chatvervollständigung

response = client.chat.completions.create(
    model="DeepSeek-V3.1",  # Required: your deployment name
    messages=[
        {"role": "system", "content": "You are a helpful assistant."},
        {"role": "user", "content": "How many languages are in the world?"}
    ]
)

print(response.choices[0].message.content)

Die Ausgabe lautet wie folgt:

Response: As of now, it's estimated that there are about 7,000 languages spoken around the world. However, this number can vary as some languages become extinct and new ones develop. It's also important to note that the number of speakers can greatly vary between languages, with some having millions of speakers and others only a few hundred.

Streaming

stream = client.chat.completions.create(
    model="DeepSeek-V3.1",
    messages=[
        {"role": "system", "content": "You are a helpful assistant."},
        {"role": "user", "content": "Write a poem about Azure."}
    ],
    stream=True
)

for chunk in stream:
    if chunk.choices[0].delta.content:
        print(chunk.choices[0].delta.content, end="")

Responses

Die Antwort-API ist die zustandsbehaftete Schnittstelle von OpenAI, die ein strukturiertes output Array zurückgibt, das Nachrichten-, Toolaufrufe und Begründungselemente enthält.

response = client.responses.create(
    model="DeepSeek-V3.1",  # Required: your deployment name
    input="How many languages are in the world?",
    max_output_tokens=2000,
)

print(response.output_text)

Argumentation

Hinweis

Diese Informationen zu Reasoning-Inhalten gelten nicht für Azure OpenAI-Modelle. Azure OpenAI-Begründungsmodelle verwenden die Funktion reasoning summaries.

Einige Begründungsmodelle, z. B. DeepSeek-R1, generieren Fertigstellungen und enthalten die Gründe dafür. Die Antwort-API zeigt dies als strukturiertes reasoning Ausgabeelement an, das summary[].text das Denken des Modells zusammen mit der endgültigen Antwort enthält.

response = client.responses.create(
    model="DeepSeek-R1-0528",  # Required: your deployment name
    input="How many languages are in the world?",
    max_output_tokens=2000,
)

# Walk response.output for items of type "reasoning" and join summary[].text.
parts = []
for item in getattr(response, "output", None) or []:
    if getattr(item, "type", None) != "reasoning":
        continue
    for s in getattr(item, "summary", None) or []:
        text = getattr(s, "text", None)
        if text:
            parts.append(text)
reasoning_summary = "\n".join(parts).strip()

print("Thinking:", reasoning_summary)
print("Answer:", response.output_text)

Die Ausgabe lautet wie folgt:

Thinking: Okay, the user is asking how many languages exist in the world. I need to provide a clear and accurate answer...
Answer: There are approximately 7,000 languages spoken around the world today.

Hinweis

Bekanntes Problem: Bei Foundry-Modellen (Nicht-Azure OpenAI-Modelle) wie DeepSeek-R1-0528 wird der Text der Begründungszusammenfassung für jedes reasoning Ausgabeelement zwar zuverlässig ausgefüllt, doch die Anzahl der Token für die Begründung in den Nutzungsdetails der Antwort (reasoning_tokens im Datenverkehr) wird derzeit mit 0 angegeben, selbst wenn der Text der Zusammenfassung vorhanden ist. Verlassen Sie sich bei der Verwendung von Foundry-Modellen nicht auf die Anzahl der Begründungs-Token für die Abrechnung oder Kontingentberechnung. Diese Einschränkung gilt nicht für Azure OpenAI in Foundry Models.

Wenn Sie mehrteilige Unterhaltung führen, vermeiden Sie es, Begründungsinhalte im Chatverlauf zu senden, da diese tendenziell lange Erklärungen erzeugen.

Einbettungen

from openai import OpenAI
from azure.identity import DefaultAzureCredential, get_bearer_token_provider

token_provider = get_bearer_token_provider(DefaultAzureCredential(), 
"https://ai.azure.com/.default")

client = OpenAI(
    base_url = "https://YOUR-RESOURCE-NAME.openai.azure.com/openai/v1/",
    api_key = token_provider,
)

response = client.embeddings.create(
    input = "How do I use Python in VS Code?",
    model = "text-embedding-3-large" // Use the name of your deployment
)
print(response.data[0].embedding)

Konfiguration

Installieren Sie das OpenAI SDK:

dotnet add package OpenAI

Installieren Sie für Microsoft Entra ID Authentifizierung auch Folgendes:

dotnet add package Azure.Identity

Clientkonfiguration

Mit API-Schlüsselauthentifizierung:

using OpenAI;
using OpenAI.Chat;
using System.ClientModel;

ChatClient client = new(
    model: "gpt-4o-mini", // Your deployment name
    credential: new ApiKeyCredential(Environment.GetEnvironmentVariable("AZURE_OPENAI_API_KEY")),
    options: new OpenAIClientOptions() { 
        Endpoint = new Uri("https://<resource>.openai.azure.com/openai/v1/")
    }
);

Mit Microsoft Entra ID Authentifizierung:

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

#pragma warning disable OPENAI001

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

ChatClient client = new(
    model: "gpt-4o-mini", // Your deployment name
    authenticationPolicy: tokenPolicy,
    options: new OpenAIClientOptions() {
        Endpoint = new Uri("https://<resource>.openai.azure.com/openai/v1/")
    }
);

Chatvervollständigung

using OpenAI.Chat;

ChatCompletion completion = client.CompleteChat(
    new SystemChatMessage("You are a helpful assistant."),
    new UserChatMessage("What is Azure AI?")
);

Console.WriteLine(completion.Content[0].Text);

Streaming

using OpenAI.Chat;

CollectionResult<StreamingChatCompletionUpdate> updates = client.CompleteChatStreaming(
    new SystemChatMessage("You are a helpful assistant."),
    new UserChatMessage("Write a poem about Azure.")
);

foreach (StreamingChatCompletionUpdate update in updates)
{
    foreach (ChatMessageContentPart part in update.ContentUpdate)
    {
        Console.Write(part.Text);
    }
}

Responses

Die Antwort-API ist die zustandsbehaftete Schnittstelle von OpenAI, die ein strukturiertes output Array zurückgibt, das Nachrichten-, Toolaufrufe und Begründungselemente enthält.

using OpenAI.Responses;

var responseClient = client.GetResponsesClient("DeepSeek-V3.1");
var result = await responseClient.CreateResponseAsync(new CreateResponseOptions(
    [ResponseItem.CreateUserMessageItem("How many languages are in the world?")])
    { MaxOutputTokenCount = 2000 }
);

Console.WriteLine(result.Value.GetOutputText());

Argumentation

Hinweis

Diese Informationen zu Inhalten zur Schlussfolgerung gelten nicht für Azure OpenAI-Modelle. Azure OpenAI-Begründungsmodelle verwenden die Funktion reasoning summaries.

Einige Begründungsmodelle, z. B. DeepSeek-R1, generieren Fertigstellungen und enthalten die Gründe dafür. Die Antwort-API zeigt dies als strukturiertes reasoning Ausgabeelement an, das summary[].text das Denken des Modells zusammen mit der endgültigen Antwort enthält.

using System.Text;
using OpenAI.Responses;

var responseClient = client.GetResponsesClient("DeepSeek-R1-0528");
var result = await responseClient.CreateResponseAsync(new CreateResponseOptions(
    [ResponseItem.CreateUserMessageItem("How many languages are in the world?")])
    { MaxOutputTokenCount = 2000 }
);

// Walk OutputItems for ReasoningResponseItem entries and join SummaryParts text.
var sb = new StringBuilder();
foreach (var item in result.Value.OutputItems)
{
    if (item is not ReasoningResponseItem reasoning) continue;
    foreach (var part in reasoning.SummaryParts)
    {
        if (part is ReasoningSummaryTextPart textPart && !string.IsNullOrEmpty(textPart.Text))
        {
            if (sb.Length > 0) sb.Append('\n');
            sb.Append(textPart.Text);
        }
    }
}

Console.WriteLine($"Thinking: {sb.ToString().Trim()}");
Console.WriteLine($"Answer:   {result.Value.GetOutputText()}");

Die Ausgabe lautet wie folgt:

Thinking: Okay, the user is asking how many languages exist in the world. I need to provide a clear and accurate answer...
Answer:   There are approximately 7,000 languages spoken around the world today.

Hinweis

Bekanntes Problem: Bei Foundry-Modellen (Nicht-Azure OpenAI-Modelle) wie DeepSeek-R1-0528 wird der Text der Begründungszusammenfassung für jedes reasoning Ausgabeelement zwar zuverlässig ausgefüllt, doch die Anzahl der Token für die Begründung in den Nutzungsdetails der Antwort (reasoning_tokens im Datenverkehr) wird derzeit mit 0 angegeben, selbst wenn der Text der Zusammenfassung vorhanden ist. Verlassen Sie sich bei der Verwendung von Foundry-Modellen nicht auf die Anzahl der Begründungs-Token für die Abrechnung oder Kontingentberechnung. Diese Einschränkung gilt nicht für Azure OpenAI in Foundry Models.

Wenn Sie mehrteilige Unterhaltung führen, vermeiden Sie es, Begründungsinhalte im Chatverlauf zu senden, da diese tendenziell lange Erklärungen erzeugen.

Einbettungen

using OpenAI;
using OpenAI.Embeddings;
using System.ClientModel;

EmbeddingClient client = new(
    "text-embedding-3-small",
    credential: new ApiKeyCredential("API-KEY"),
    options: new OpenAIClientOptions()
    {

        Endpoint = new Uri("https://YOUR-RESOURCE-NAME.openai.azure.com/openai/v1")
    }
);

string input = "This is a test";

OpenAIEmbedding embedding = client.GenerateEmbedding(input);
ReadOnlyMemory<float> vector = embedding.ToFloats();
Console.WriteLine($"Embeddings: [{string.Join(", ", vector.ToArray())}]");

Konfiguration

Installieren Sie das OpenAI SDK:

npm install openai

Installieren Sie für Microsoft Entra ID Authentifizierung auch Folgendes:

npm install @azure/identity

Clientkonfiguration

Mit API-Schlüsselauthentifizierung:

import { OpenAI } from "openai";

const client = new OpenAI({
    baseURL: "https://<resource>.openai.azure.com/openai/v1/",
    apiKey: process.env.AZURE_OPENAI_API_KEY
});

Mit Microsoft Entra ID Authentifizierung:

import { DefaultAzureCredential, getBearerTokenProvider } from "@azure/identity";
import { OpenAI } from "openai";

const tokenProvider = getBearerTokenProvider(
    new DefaultAzureCredential(),
    'https://ai.azure.com/.default'
);

const client = new OpenAI({
    baseURL: "https://<resource>.openai.azure.com/openai/v1/",
    apiKey: tokenProvider
});

Chatvervollständigung

const completion = await client.chat.completions.create({
    model: "DeepSeek-V3.1", // Required: your deployment name
    messages: [
        { role: "system", content: "You are a helpful assistant." },
        { role: "user", content: "How many languages are in the world?" }
    ]
});

console.log(completion.choices[0].message.content);

Streaming

const stream = await client.chat.completions.create({
    model: "DeepSeek-V3.1",
    messages: [
        { role: "system", content: "You are a helpful assistant." },
        { role: "user", content: "Write a poem about Azure." }
    ],
    stream: true
});

for await (const chunk of stream) {
    if (chunk.choices[0]?.delta?.content) {
        process.stdout.write(chunk.choices[0].delta.content);
    }
}

Responses

Die Antwort-API ist die zustandsbehaftete Schnittstelle von OpenAI, die ein strukturiertes output Array zurückgibt, das Nachrichten-, Toolaufrufe und Begründungselemente enthält.

const response = await client.responses.create({
    model: "DeepSeek-V3.1", // Required: your deployment name
    input: "How many languages are in the world?",
    max_output_tokens: 2000,
});

console.log(response.output_text);

Argumentation

Hinweis

Diese Informationen zu Inhalten zur Schlussfolgerung gelten nicht für Azure OpenAI-Modelle. Azure OpenAI-Begründungsmodelle verwenden die Funktion reasoning summaries.

Einige Begründungsmodelle, z. B. DeepSeek-R1, generieren Fertigstellungen und enthalten die Gründe dafür. Die Antwort-API zeigt dies als strukturiertes reasoning Ausgabeelement an, das summary[].text das Denken des Modells zusammen mit der endgültigen Antwort enthält.

const response = await client.responses.create({
    model: "DeepSeek-R1-0528", // Required: your deployment name
    input: "How many languages are in the world?",
    max_output_tokens: 2000,
});

// Walk response.output for items of type "reasoning" and join summary[].text.
const parts = [];
for (const item of response?.output ?? []) {
    if (item?.type !== "reasoning") continue;
    for (const s of item?.summary ?? []) {
        if (s?.text) parts.push(s.text);
    }
}
const reasoningSummary = parts.join("\n").trim();

console.log("Thinking:", reasoningSummary);
console.log("Answer:  ", response.output_text);

Die Ausgabe lautet wie folgt:

Thinking: Okay, the user is asking how many languages exist in the world. I need to provide a clear and accurate answer...
Answer:   There are approximately 7,000 languages spoken around the world today.

Hinweis

Bekanntes Problem: Bei Foundry-Modellen (Nicht-Azure OpenAI-Modelle) wie DeepSeek-R1-0528 wird der Text der Begründungszusammenfassung für jedes reasoning Ausgabeelement zwar zuverlässig ausgefüllt, doch die Anzahl der Token für die Begründung in den Nutzungsdetails der Antwort (reasoning_tokens im Datenverkehr) wird derzeit mit 0 angegeben, selbst wenn der Text der Zusammenfassung vorhanden ist. Verlassen Sie sich bei der Verwendung von Foundry-Modellen nicht auf die Anzahl der Begründungs-Token für die Abrechnung oder Kontingentberechnung. Diese Einschränkung gilt nicht für Azure OpenAI in Foundry Models.

Wenn Sie mehrteilige Unterhaltung führen, vermeiden Sie es, Begründungsinhalte im Chatverlauf zu senden, da diese tendenziell lange Erklärungen erzeugen.

Einbettungen

import OpenAI from "openai";
import { getBearerTokenProvider, DefaultAzureCredential } from "@azure/identity";

const tokenProvider = getBearerTokenProvider(
    new DefaultAzureCredential(),
    'https://ai.azure.com/.default');
const client = new OpenAI({
    baseURL: "https://<resource>.openai.azure.com/openai/v1/",
    apiKey: tokenProvider
});

const embedding = await client.embeddings.create({
  model: "text-embedding-3-large", // Required: your deployment name
  input: "The quick brown fox jumped over the lazy dog",
  encoding_format: "float",
});

console.log(embedding);

Konfiguration

Fügen Sie das OpenAI SDK zu Ihrem Projekt hinzu. Überprüfen Sie das OpenAI Java GitHub Repository auf die neuesten Versions- und Installationsanweisungen.

Fügen Sie für Microsoft Entra ID Authentifizierung auch Folgendes hinzu:

<dependency>
    <groupId>com.azure</groupId>
    <artifactId>azure-identity</artifactId>
    <version>1.18.0</version>
</dependency>

Clientkonfiguration

Mit API-Schlüsselauthentifizierung:

import com.openai.client.OpenAIClient;
import com.openai.client.okhttp.OpenAIOkHttpClient;

OpenAIClient client = OpenAIOkHttpClient.builder()
    .baseUrl("https://<resource>.openai.azure.com/openai/v1/")
    .apiKey(System.getenv("AZURE_OPENAI_API_KEY"))
    .build();

Mit Microsoft Entra ID Authentifizierung:

import com.openai.client.OpenAIClient;
import com.openai.client.okhttp.OpenAIOkHttpClient;
import com.azure.identity.DefaultAzureCredential;
import com.azure.identity.DefaultAzureCredentialBuilder;

DefaultAzureCredential tokenCredential = new DefaultAzureCredentialBuilder().build();

OpenAIClient client = OpenAIOkHttpClient.builder()
    .baseUrl("https://<resource>.openai.azure.com/openai/v1/")
    .credential(BearerTokenCredential.create(
        AuthenticationUtil.getBearerTokenSupplier(
            tokenCredential, 
            "https://ai.azure.com/.default"
        )
    ))
    .build();

Chatvervollständigung

import com.openai.models.chat.completions.*;

ChatCompletionCreateParams params = ChatCompletionCreateParams.builder()
    .addSystemMessage("You are a helpful assistant.")
    .addUserMessage("How many languages are in the world?")
    .model("DeepSeek-V3.1") // Required: your deployment name
    .build();

ChatCompletion completion = client.chat().completions().create(params);
System.out.println(completion.choices().get(0).message().content());

Streaming

import com.openai.models.chat.completions.*;
import java.util.stream.Stream;

ChatCompletionCreateParams params = ChatCompletionCreateParams.builder()
    .addSystemMessage("You are a helpful assistant.")
    .addUserMessage("Write a poem about Azure.")
    .model("DeepSeek-V3.1") // Required: your deployment name
    .build();

Stream<ChatCompletionChunk> stream = client.chat().completions().createStreaming(params);

stream.forEach(chunk -> {
    if (chunk.choices() != null && !chunk.choices().isEmpty()) {
        String content = chunk.choices().get(0).delta().content();
        if (content != null) {
            System.out.print(content);
        }
    }
});

Responses

Die Antwort-API ist die zustandsbehaftete Schnittstelle von OpenAI, die ein strukturiertes output Array zurückgibt, das Nachrichten-, Toolaufrufe und Begründungselemente enthält.

import com.openai.models.responses.Response;
import com.openai.models.responses.ResponseCreateParams;

Response response = client.responses().create(
    ResponseCreateParams.builder()
        .model("DeepSeek-V3.1") // Required: your deployment name
        .input("How many languages are in the world?")
        .maxOutputTokens(2000)
        .build()
);

System.out.println(response.outputText());

Argumentation

Hinweis

Diese Informationen zu Inhalten zur Schlussfolgerung gelten nicht für Azure OpenAI-Modelle. Azure OpenAI-Begründungsmodelle verwenden die Funktion reasoning summaries.

Einige Begründungsmodelle, z. B. DeepSeek-R1, generieren Fertigstellungen und enthalten die Gründe dafür. Die Antwort-API zeigt dies als strukturiertes reasoning Ausgabeelement an, das summary[].text das Denken des Modells zusammen mit der endgültigen Antwort enthält.

import com.openai.models.responses.Response;
import com.openai.models.responses.ResponseCreateParams;

Response response = client.responses().create(
    ResponseCreateParams.builder()
        .model("DeepSeek-R1-0528") // Required: your deployment name
        .input("How many languages are in the world?")
        .maxOutputTokens(2000)
        .build()
);

// Walk response.output() for items of type "reasoning" and join summary[].text.
StringBuilder sb = new StringBuilder();
response.output().stream()
    .flatMap(item -> item.reasoning().stream())
    .flatMap(reasoning -> reasoning.summary().stream())
    .forEach(summary -> {
        String text = summary.text();
        if (text != null && !text.isEmpty()) {
            if (sb.length() > 0) sb.append("\n");
            sb.append(text);
        }
    });

System.out.println("Thinking: " + sb.toString().trim());

Die Ausgabe lautet wie folgt:

Thinking: Okay, the user is asking how many languages exist in the world. I need to provide a clear and accurate answer...

Hinweis

Bekanntes Problem: Bei Foundry-Modellen (Nicht-Azure OpenAI-Modelle) wie DeepSeek-R1-0528 wird der Text der Begründungszusammenfassung für jedes reasoning Ausgabeelement zwar zuverlässig ausgefüllt, doch die Anzahl der Token für die Begründung in den Nutzungsdetails der Antwort (reasoning_tokens im Datenverkehr) wird derzeit mit 0 angegeben, selbst wenn der Text der Zusammenfassung vorhanden ist. Verlassen Sie sich bei der Verwendung von Foundry-Modellen nicht auf die Anzahl der Begründungs-Token für die Abrechnung oder Kontingentberechnung. Diese Einschränkung gilt nicht für Azure OpenAI in Foundry Models.

Wenn Sie mehrteilige Unterhaltung führen, vermeiden Sie es, Begründungsinhalte im Chatverlauf zu senden, da diese tendenziell lange Erklärungen erzeugen.

Einbettungen

package com.openai.example;

import com.openai.client.OpenAIClient;
import com.openai.client.okhttp.OpenAIOkHttpClient;
import com.openai.models.embeddings.EmbeddingCreateParams;
import com.openai.models.embeddings.EmbeddingModel;

public final class EmbeddingsExample {
    private EmbeddingsExample() {}

    public static void main(String[] args) {
        // Configures using one of:
        // - The `OPENAI_API_KEY` environment variable
        // - The `OPENAI_BASE_URL` and `AZURE_OPENAI_KEY` environment variables
        OpenAIClient client = OpenAIOkHttpClient.fromEnv();

        EmbeddingCreateParams createParams = EmbeddingCreateParams.builder()
                .input("The quick brown fox jumped over the lazy dog")
                .model(EmbeddingModel.TEXT_EMBEDDING_3_SMALL)
                .build();

        System.out.println(client.embeddings().create(createParams));
    }
}

Konfiguration

Installieren Sie das OpenAI SDK:

go get github.com/openai/openai-go/v3

Installieren Sie für Microsoft Entra ID Authentifizierung auch Folgendes:

go get -u github.com/Azure/azure-sdk-for-go/sdk/azidentity

Clientkonfiguration

Mit API-Schlüsselauthentifizierung:

import (
    "github.com/openai/openai-go/v3"
    "github.com/openai/openai-go/v3/option"
)

client := openai.NewClient(
    option.WithBaseURL("https://<resource>.openai.azure.com/openai/v1/"),
    option.WithAPIKey(os.Getenv("AZURE_OPENAI_API_KEY")),
)

Mit Microsoft Entra ID Authentifizierung:

import (
    "github.com/Azure/azure-sdk-for-go/sdk/azidentity"
    "github.com/openai/openai-go/v3"
    "github.com/openai/openai-go/v3/azure"
    "github.com/openai/openai-go/v3/option"
)

tokenCredential, err := azidentity.NewDefaultAzureCredential(nil)
if err != nil {
    panic(err)
}

client := openai.NewClient(
    option.WithBaseURL("https://<resource>.openai.azure.com/openai/v1/"),
    azure.WithTokenCredential(tokenCredential),
)

Chatvervollständigung

import (
    "context"
    "fmt"
    "github.com/openai/openai-go/v3"
)

chatCompletion, err := client.Chat.Completions.New(context.TODO(), openai.ChatCompletionNewParams{
    Messages: []openai.ChatCompletionMessageParamUnion{
        openai.SystemMessage("You are a helpful assistant."),
        openai.UserMessage("What is Azure AI?"),
    },
    Model: "DeepSeek-V3.1", // Required: your deployment name
})

if err != nil {
    panic(err.Error())
}

fmt.Println(chatCompletion.Choices[0].Message.Content)

Streaming

import (
    "context"
    "fmt"
    "github.com/openai/openai-go/v3"
)

stream := client.Chat.Completions.NewStreaming(context.TODO(), openai.ChatCompletionNewParams{
    Messages: []openai.ChatCompletionMessageParamUnion{
        openai.SystemMessage("You are a helpful assistant."),
        openai.UserMessage("Write a poem about Azure."),
    },
    Model: "DeepSeek-V3.1", // Required: your deployment name
})

for stream.Next() {
    chunk := stream.Current()
    if len(chunk.Choices) > 0 && chunk.Choices[0].Delta.Content != "" {
        fmt.Print(chunk.Choices[0].Delta.Content)
    }
}

if err := stream.Err(); err != nil {
    panic(err.Error())
}

Responses

Die Antwort-API ist die zustandsbehaftete Schnittstelle von OpenAI, die ein strukturiertes output Array zurückgibt, das Nachrichten-, Toolaufrufe und Begründungselemente enthält.

import (
    "context"
    "fmt"

    "github.com/openai/openai-go/v3"
    "github.com/openai/openai-go/v3/responses"
)

resp, err := client.Responses.New(context.TODO(), responses.ResponseNewParams{
    Model: "DeepSeek-V3.1", // Required: your deployment name
    Input: responses.ResponseNewParamsInputUnion{
        OfString: openai.String("How many languages are in the world?"),
    },
    MaxOutputTokens: openai.Int(2000),
})
if err != nil {
    panic(err.Error())
}

fmt.Println(resp.OutputText())

Argumentation

Hinweis

Diese Informationen zu Inhalten zur Schlussfolgerung gelten nicht für Azure OpenAI-Modelle. Azure OpenAI-Begründungsmodelle verwenden die Funktion reasoning summaries.

Einige Begründungsmodelle, z. B. DeepSeek-R1, generieren Fertigstellungen und enthalten die Gründe dafür. Die Antwort-API zeigt dies als strukturiertes reasoning Ausgabeelement an, das summary[].text das Denken des Modells zusammen mit der endgültigen Antwort enthält.

import (
    "context"
    "fmt"
    "strings"

    "github.com/openai/openai-go/v3"
    "github.com/openai/openai-go/v3/responses"
)

resp, err := client.Responses.New(context.TODO(), responses.ResponseNewParams{
    Model: "DeepSeek-R1-0528", // Required: your deployment name
    Input: responses.ResponseNewParamsInputUnion{
        OfString: openai.String("How many languages are in the world?"),
    },
    MaxOutputTokens: openai.Int(2000),
})
if err != nil {
    panic(err.Error())
}

// Walk resp.Output for items of type "reasoning" and join summary[].text.
var parts []string
for _, item := range resp.Output {
    if item.Type != "reasoning" {
        continue
    }
    for _, s := range item.Summary {
        if s.Text != "" {
            parts = append(parts, s.Text)
        }
    }
}
reasoningSummary := strings.TrimSpace(strings.Join(parts, "\n"))

fmt.Println("Thinking:", reasoningSummary)
fmt.Println("Answer:  ", resp.OutputText())

Die Ausgabe lautet wie folgt:

Thinking: Okay, the user is asking how many languages exist in the world. I need to provide a clear and accurate answer...
Answer:   There are approximately 7,000 languages spoken around the world today.

Hinweis

Bekanntes Problem: Bei Foundry-Modellen (Nicht-Azure OpenAI-Modelle) wie DeepSeek-R1-0528 wird der Text der Begründungszusammenfassung für jedes reasoning Ausgabeelement zwar zuverlässig ausgefüllt, doch die Anzahl der Token für die Begründung in den Nutzungsdetails der Antwort (reasoning_tokens im Datenverkehr) wird derzeit mit 0 angegeben, selbst wenn der Text der Zusammenfassung vorhanden ist. Verlassen Sie sich bei der Verwendung von Foundry-Modellen nicht auf die Anzahl der Begründungs-Token für die Abrechnung oder Kontingentberechnung. Diese Einschränkung gilt nicht für Azure OpenAI in Foundry Models.

Wenn Sie mehrteilige Unterhaltung führen, vermeiden Sie es, Begründungsinhalte im Chatverlauf zu senden, da diese tendenziell lange Erklärungen erzeugen.

Einbettungen

package main

import (
    "context"
    "fmt"
    "log"

    "github.com/Azure/azure-sdk-for-go/sdk/azidentity"
    "github.com/openai/openai-go/v3"
    "github.com/openai/openai-go/v3/azure"
    "github.com/openai/openai-go/v3/option"
)

func main() {
    tokenCredential, err := azidentity.NewDefaultAzureCredential(nil)
    if err != nil {
        log.Fatalf("Error creating credential:%s", err)
    }
    // Create a client with Azure OpenAI endpoint and Entra ID credentials
    client := openai.NewClient(
        option.WithBaseURL("https://YOUR-RESOURCE-NAME.openai.azure.com/openai/v1/"),
        azure.WithTokenCredential(tokenCredential),
    )

    inputText := "The quick brown fox jumped over the lazy dog"

    // Make the embedding request synchronously
    resp, err := client.Embeddings.New(context.Background(), openai.EmbeddingNewParams{
        Model: openai.EmbeddingModel("text-embedding-3-large"), // Use your deployed model name on Azure
        Input: openai.EmbeddingNewParamsInputUnion{
            OfArrayOfStrings: []string{inputText},
        },
    })
    if err != nil {
        log.Fatalf("Failed to get embedding: %s", err)
    }

    if len(resp.Data) == 0 {
        log.Fatalf("No embedding data returned.")
    }

    // Print embedding information
    embedding := resp.Data[0].Embedding
    fmt.Printf("Embedding Length: %d\n", len(embedding))
    fmt.Println("Embedding Values:")
    for _, value := range embedding {
        fmt.Printf("%f, ", value)
    }
    fmt.Println()
}

Allgemeine Migrationsmuster

Modellparameterbehandlung

  • Azure AI Inference SDK: Der Parameter model ist für Endpunkte mit einem Modell optional, aber für Multimodellendpunkte erforderlich.
  • OpenAI SDK: Der model Parameter ist immer erforderlich und sollte auf Ihren Bereitstellungsnamen festgelegt werden.

Endpunkt-URL-Format

  • Azure AI Inference SDK: Verwendet https://<resource>.services.ai.azure.com/models.
  • OpenAI SDK: Verwendet https://<resource>.openai.azure.com/openai/v1 (stellt eine Verbindung mit der OpenAI v1-API bereit).

Antwortstruktur

Die Antwortstruktur ist ähnlich, weist jedoch einige Unterschiede auf:

  • Azure AI Inference SDK: Gibt ChatCompletions-Objekt mit choices[].message.content zurück.
  • OpenAI SDK: Gibt ChatCompletion objekt mit choices[].message.content.

Beide SDKs bieten ähnliche Zugriffsmuster für Antwortdaten, darunter:

  • Nachrichteninhalt
  • Tokenverwendung
  • Modellinformationen
  • Abschlussgrund

Migrationscheckliste

Verwenden Sie diese Checkliste, um eine reibungslose Migration sicherzustellen:

  • Installieren des OpenAI SDK für Ihre Programmiersprache
  • Aktualisieren des Authentifizierungscodes (API-Schlüssel oder Microsoft Entra ID)
  • Ändern von Endpunkt-URLs von .services.ai.azure.com/models zu .openai.azure.com/openai/v1/
  • Ändern Sie den Anmeldeinformationsbereich von https://cognitiveservices.azure.com/.default auf https://ai.azure.com/.default
  • Aktualisieren des Clientinitialisierungscodes
  • Geben Sie immer den model Parameter mit dem Bereitstellungsnamen an.
  • Aktualisierungsanforderungsmethodeaufrufe (completechat.completions.create)
  • Aktualisieren von Streamingcode bei Bedarf
  • Aktualisieren der Fehlerbehandlung zur Verwendung von OpenAI SDK-Ausnahmen
  • Gründliches Testen aller Funktionen
  • Aktualisieren von Dokumentationen und Codekommentaren

Problembehandlung

Authentifizierungsfehler

Wenn Authentifizierungsfehler auftreten:

  • Überprüfen Sie, ob Der API-Schlüssel korrekt ist und nicht abgelaufen ist.
  • Stellen Sie für Microsoft Entra ID sicher, dass Ihre Anwendung über die richtigen Berechtigungen verfügt.
  • Prüfen Sie, ob der Bereich der Anmeldeinformationen auf https://ai.azure.com/.default festgelegt ist.

Endpunktfehler

Wenn Endpunktfehler angezeigt werden:

  • Überprüfen Sie, ob das Endpunkt-URL-Format /openai/v1/ am Ende enthält.
  • Stellen Sie sicher, dass der Ressourcenname korrekt ist.
  • Überprüfen Sie, ob die Modellbereitstellung vorhanden ist und aktiv ist.

Fehler „Modell nicht gefunden“

Wenn die Fehlermeldung "Modell nicht gefunden" angezeigt wird:

  • Überprüfen Sie, ob Sie Ihren Bereitstellungsnamen verwenden, nicht den Modellnamen.
  • Überprüfen Sie, ob die Bereitstellung in Ihrer Microsoft Foundry-Ressource aktiv ist.
  • Stellen Sie sicher, dass der Bereitstellungsname exakt übereinstimmt (Groß-/Kleinschreibung wird beachtet).