Поддерживаемые языки программирования Azure OpenAI
Статья
Клиентская библиотека Azure OpenAI для .NET является компаньоном к официальной клиентской библиотеке OpenAI для .NET. Библиотека Azure OpenAI настраивает клиент для использования с Azure OpenAI и предоставляет дополнительную поддержку строго типизированных расширений для моделей запросов и ответов, относящихся к сценариям Azure OpenAI.
В отличие от клиентских библиотек Azure OpenAI для Python и JavaScript, пакет Azure OpenAI .NET ограничивается назначением определенного подмножества версий API Azure OpenAI. Как правило, каждый пакет Azure OpenAI .NET разблокирует доступ к новым функциям выпуска API OpenAI Azure. Доступ к последним версиям API влияет на доступность компонентов.
Безопасный подход к проверке подлинности без ключа — использовать идентификатор Microsoft Entra (ранее Azure Active Directory) через библиотеку удостоверений Azure. Чтобы использовать библиотеку, выполните следующие действия.
using Azure.AI.OpenAI;
using Azure.Identity;
using OpenAI.Audio;
AzureOpenAIClient azureClient = new(
new Uri("https://your-azure-openai-resource.com"),
new DefaultAzureCredential());
AudioClient client = azureClient.GetAudioClient("tts-hd"); //Replace with your Azure OpenAI model deploymentstring input = "Testing, testing, 1, 2, 3";
BinaryData speech = client.GenerateSpeech(input, GeneratedSpeechVoice.Alloy);
using FileStream stream = File.OpenWrite($"{Guid.NewGuid()}.mp3");
speech.ToStream().CopyTo(stream);
AzureOpenAIClient azureClient = new(
new Uri("https://your-azure-openai-resource.com"),
new DefaultAzureCredential());
ChatClient chatClient = azureClient.GetChatClient("my-gpt-4o-deployment");
ChatCompletion completion = chatClient.CompleteChat(
[
// System messages represent instructions or other guidance about how the assistant should behave
new SystemChatMessage("You are a helpful assistant that talks like a pirate."),
// User messages represent user input, whether historical or the most recent input
new UserChatMessage("Hi, can you help me?"),
// Assistant messages in a request represent conversation history for responses
new AssistantChatMessage("Arrr! Of course, me hearty! What can I do for ye?"),
new UserChatMessage("What's the best way to train a parrot?"),
]);
Console.WriteLine($"{completion.Role}: {completion.Content[0].Text}");
Потоковая передача сообщений чата
Завершения потокового чата используют CompleteChatStreaming метод и CompleteChatStreamingAsync метод, возвращающий ResultCollection<StreamingChatCompletionUpdate> или AsyncCollectionResult<StreamingChatCompletionUpdate> вместо ClientResult<ChatCompletion>него.
Эти коллекции результатов можно итерировать с помощью foreach или await foreach, при этом каждое обновление, прибывающее в виде новых данных, доступно из потокового ответа.
C#
AzureOpenAIClient azureClient = new(
new Uri("https://your-azure-openai-resource.com"),
new DefaultAzureCredential());
ChatClient chatClient = azureClient.GetChatClient("my-gpt-4o-deployment");
CollectionResult<StreamingChatCompletionUpdate> completionUpdates = chatClient.CompleteChatStreaming(
[
new SystemChatMessage("You are a helpful assistant that talks like a pirate."),
new UserChatMessage("Hi, can you help me?"),
new AssistantChatMessage("Arrr! Of course, me hearty! What can I do for ye?"),
new UserChatMessage("What's the best way to train a parrot?"),
]);
foreach (StreamingChatCompletionUpdate completionUpdate in completionUpdates)
{
foreach (ChatMessageContentPart contentPart in completionUpdate.ContentUpdate)
{
Console.Write(contentPart.Text);
}
}
using Azure.AI.OpenAI;
using Azure.Identity;
using OpenAI.Embeddings;
AzureOpenAIClient azureClient = new(
new Uri("https://your-azure-openai-resource.com"),
new DefaultAzureCredential());
EmbeddingClient client = azureClient.GetEmbeddingClient("text-embedding-3-large"); //Replace with your model deployment namestring description = "This is a test embedding";
OpenAIEmbedding embedding = client.GenerateEmbedding(description);
ReadOnlyMemory<float> vector = embedding.ToFloats();
Console.WriteLine(string.Join(", ", vector.ToArray()));
Точная настройка
В настоящее время не поддерживается пакетами Azure OpenAI .NET.
Пакетная служба
В настоящее время не поддерживается пакетами Azure OpenAI .NET.
В отличие от клиентских библиотек Azure OpenAI для Python и JavaScript, библиотека Azure OpenAI Go ориентирована на определенную версию API OpenAI Azure. Доступ к последним версиям API влияет на доступность компонентов.
Текущая целевая версия API OpenAI Для Azure: 2024-10-01-preview
Модуль azidentity используется для проверки подлинности Azure Active Directory с помощью Azure OpenAI.
Go
package main
import (
"log""github.com/Azure/azure-sdk-for-go/sdk/ai/azopenai""github.com/Azure/azure-sdk-for-go/sdk/azidentity"
)
funcmain() {
dac, err := azidentity.NewDefaultAzureCredential(nil)
if err != nil {
// TODO: Update the following line with your application specific error handling logic
log.Printf("ERROR: %s", err)
return
}
// NOTE: this constructor creates a client that connects to an Azure OpenAI endpoint.// To connect to the public OpenAI endpoint, use azopenai.NewClientForOpenAI
client, err := azopenai.NewClient("https://<your-azure-openai-host>.openai.azure.com", dac, nil)
if err != nil {
// TODO: Update the following line with your application specific error handling logic
log.Printf("ERROR: %s", err)
return
}
_ = client
}
package main
import (
"log""github.com/Azure/azure-sdk-for-go/sdk/ai/azopenai""github.com/Azure/azure-sdk-for-go/sdk/azcore"
)
funcmain() {
keyCredential := azcore.NewKeyCredential("<Azure-OpenAI-APIKey>")
// NOTE: this constructor creates a client that connects to an Azure OpenAI endpoint.// To connect to the public OpenAI endpoint, use azopenai.NewClientForOpenAI
client, err := azopenai.NewClientWithKeyCredential("https://<your-azure-openai-host>.openai.azure.com", keyCredential, nil)
if err != nil {
// TODO: Update the following line with your application specific error handling logic
log.Printf("ERROR: %s", err)
return
}
_ = client
}
Аудио
Client.GenerateSpeechFromText
Go
ackage main
import (
"context""fmt""io""log""os""github.com/Azure/azure-sdk-for-go/sdk/ai/azopenai""github.com/Azure/azure-sdk-for-go/sdk/azcore""github.com/Azure/azure-sdk-for-go/sdk/azcore/to"
)
funcmain() {
openAIKey := os.Getenv("OPENAI_API_KEY")
// Ex: "https://api.openai.com/v1"
openAIEndpoint := os.Getenv("OPENAI_ENDPOINT")
modelDeploymentID := "tts-1"if openAIKey == "" || openAIEndpoint == "" || modelDeploymentID == "" {
fmt.Fprintf(os.Stderr, "Skipping example, environment variables missing\n")
return
}
keyCredential := azcore.NewKeyCredential(openAIKey)
client, err := azopenai.NewClientForOpenAI(openAIEndpoint, keyCredential, nil)
if err != nil {
// TODO: Update the following line with your application specific error handling logic
log.Printf("ERROR: %s", err)
return
}
audioResp, err := client.GenerateSpeechFromText(context.Background(), azopenai.SpeechGenerationOptions{
Input: to.Ptr("i am a computer"),
Voice: to.Ptr(azopenai.SpeechVoiceAlloy),
ResponseFormat: to.Ptr(azopenai.SpeechGenerationResponseFormatFlac),
DeploymentName: to.Ptr("tts-1"),
}, nil)
if err != nil {
// TODO: Update the following line with your application specific error handling logic
log.Printf("ERROR: %s", err)
return
}
defer audioResp.Body.Close()
audioBytes, err := io.ReadAll(audioResp.Body)
if err != nil {
// TODO: Update the following line with your application specific error handling logic
log.Printf("ERROR: %s", err)
return
}
fmt.Fprintf(os.Stderr, "Got %d bytes of FLAC audio\n", len(audioBytes))
}
Client.GetAudioTranscription
Go
package main
import (
"context""fmt""log""os""github.com/Azure/azure-sdk-for-go/sdk/ai/azopenai""github.com/Azure/azure-sdk-for-go/sdk/azcore""github.com/Azure/azure-sdk-for-go/sdk/azcore/to"
)
funcmain() {
azureOpenAIKey := os.Getenv("AOAI_WHISPER_API_KEY")
// Ex: "https://<your-azure-openai-host>.openai.azure.com"
azureOpenAIEndpoint := os.Getenv("AOAI_WHISPER_ENDPOINT")
modelDeploymentID := os.Getenv("AOAI_WHISPER_MODEL")
if azureOpenAIKey == "" || azureOpenAIEndpoint == "" || modelDeploymentID == "" {
fmt.Fprintf(os.Stderr, "Skipping example, environment variables missing\n")
return
}
keyCredential := azcore.NewKeyCredential(azureOpenAIKey)
client, err := azopenai.NewClientWithKeyCredential(azureOpenAIEndpoint, keyCredential, nil)
if err != nil {
// TODO: Update the following line with your application specific error handling logic
log.Printf("ERROR: %s", err)
return
}
mp3Bytes, err := os.ReadFile("testdata/sampledata_audiofiles_myVoiceIsMyPassportVerifyMe01.mp3")
if err != nil {
// TODO: Update the following line with your application specific error handling logic
log.Printf("ERROR: %s", err)
return
}
resp, err := client.GetAudioTranscription(context.TODO(), azopenai.AudioTranscriptionOptions{
File: mp3Bytes,
// this will return _just_ the translated text. Other formats are available, which return// different or additional metadata. See [azopenai.AudioTranscriptionFormat] for more examples.
ResponseFormat: to.Ptr(azopenai.AudioTranscriptionFormatText),
DeploymentName: &modelDeploymentID,
}, nil)
if err != nil {
// TODO: Update the following line with your application specific error handling logic
log.Printf("ERROR: %s", err)
return
}
fmt.Fprintf(os.Stderr, "Transcribed text: %s\n", *resp.Text)
}
Чат
Client.GetChatCompletions
Go
package main
import (
"context""fmt""log""os""github.com/Azure/azure-sdk-for-go/sdk/ai/azopenai""github.com/Azure/azure-sdk-for-go/sdk/azcore"
)
funcmain() {
azureOpenAIKey := os.Getenv("AOAI_CHAT_COMPLETIONS_API_KEY")
modelDeploymentID := os.Getenv("AOAI_CHAT_COMPLETIONS_MODEL")
// Ex: "https://<your-azure-openai-host>.openai.azure.com"
azureOpenAIEndpoint := os.Getenv("AOAI_CHAT_COMPLETIONS_ENDPOINT")
if azureOpenAIKey == "" || modelDeploymentID == "" || azureOpenAIEndpoint == "" {
fmt.Fprintf(os.Stderr, "Skipping example, environment variables missing\n")
return
}
keyCredential := azcore.NewKeyCredential(azureOpenAIKey)
// In Azure OpenAI you must deploy a model before you can use it in your client. For more information// see here: https://learn.microsoft.com/azure/cognitive-services/openai/how-to/create-resource
client, err := azopenai.NewClientWithKeyCredential(azureOpenAIEndpoint, keyCredential, nil)
if err != nil {
// TODO: Update the following line with your application specific error handling logic
log.Printf("ERROR: %s", err)
return
}
// This is a conversation in progress.// NOTE: all messages, regardless of role, count against token usage for this API.
messages := []azopenai.ChatRequestMessageClassification{
// You set the tone and rules of the conversation with a prompt as the system role.
&azopenai.ChatRequestSystemMessage{Content: azopenai.NewChatRequestSystemMessageContent("You are a helpful assistant. You will talk like a pirate.")},
// The user asks a question
&azopenai.ChatRequestUserMessage{Content: azopenai.NewChatRequestUserMessageContent("Can you help me?")},
// The reply would come back from the ChatGPT. You'd add it to the conversation so we can maintain context.
&azopenai.ChatRequestAssistantMessage{Content: azopenai.NewChatRequestAssistantMessageContent("Arrrr! Of course, me hearty! What can I do for ye?")},
// The user answers the question based on the latest reply.
&azopenai.ChatRequestUserMessage{Content: azopenai.NewChatRequestUserMessageContent("What's the best way to train a parrot?")},
// from here you'd keep iterating, sending responses back from ChatGPT
}
gotReply := false
resp, err := client.GetChatCompletions(context.TODO(), azopenai.ChatCompletionsOptions{
// This is a conversation in progress.// NOTE: all messages count against token usage for this API.
Messages: messages,
DeploymentName: &modelDeploymentID,
}, nil)
if err != nil {
// TODO: Update the following line with your application specific error handling logic
log.Printf("ERROR: %s", err)
return
}
for _, choice := range resp.Choices {
gotReply = trueif choice.ContentFilterResults != nil {
fmt.Fprintf(os.Stderr, "Content filter results\n")
if choice.ContentFilterResults.Error != nil {
fmt.Fprintf(os.Stderr, " Error:%v\n", choice.ContentFilterResults.Error)
}
fmt.Fprintf(os.Stderr, " Hate: sev: %v, filtered: %v\n", *choice.ContentFilterResults.Hate.Severity, *choice.ContentFilterResults.Hate.Filtered)
fmt.Fprintf(os.Stderr, " SelfHarm: sev: %v, filtered: %v\n", *choice.ContentFilterResults.SelfHarm.Severity, *choice.ContentFilterResults.SelfHarm.Filtered)
fmt.Fprintf(os.Stderr, " Sexual: sev: %v, filtered: %v\n", *choice.ContentFilterResults.Sexual.Severity, *choice.ContentFilterResults.Sexual.Filtered)
fmt.Fprintf(os.Stderr, " Violence: sev: %v, filtered: %v\n", *choice.ContentFilterResults.Violence.Severity, *choice.ContentFilterResults.Violence.Filtered)
}
if choice.Message != nil && choice.Message.Content != nil {
fmt.Fprintf(os.Stderr, "Content[%d]: %s\n", *choice.Index, *choice.Message.Content)
}
if choice.FinishReason != nil {
// this choice's conversation is complete.
fmt.Fprintf(os.Stderr, "Finish reason[%d]: %s\n", *choice.Index, *choice.FinishReason)
}
}
if gotReply {
fmt.Fprintf(os.Stderr, "Got chat completions reply\n")
}
}
Client.GetChatCompletionsStream
Go
package main
import (
"context""errors""fmt""io""log""os""github.com/Azure/azure-sdk-for-go/sdk/ai/azopenai""github.com/Azure/azure-sdk-for-go/sdk/azcore""github.com/Azure/azure-sdk-for-go/sdk/azcore/to"
)
funcmain() {
azureOpenAIKey := os.Getenv("AOAI_CHAT_COMPLETIONS_API_KEY")
modelDeploymentID := os.Getenv("AOAI_CHAT_COMPLETIONS_MODEL")
// Ex: "https://<your-azure-openai-host>.openai.azure.com"
azureOpenAIEndpoint := os.Getenv("AOAI_CHAT_COMPLETIONS_ENDPOINT")
if azureOpenAIKey == "" || modelDeploymentID == "" || azureOpenAIEndpoint == "" {
fmt.Fprintf(os.Stderr, "Skipping example, environment variables missing\n")
return
}
keyCredential := azcore.NewKeyCredential(azureOpenAIKey)
// In Azure OpenAI you must deploy a model before you can use it in your client. For more information// see here: https://learn.microsoft.com/azure/cognitive-services/openai/how-to/create-resource
client, err := azopenai.NewClientWithKeyCredential(azureOpenAIEndpoint, keyCredential, nil)
if err != nil {
// TODO: Update the following line with your application specific error handling logic
log.Printf("ERROR: %s", err)
return
}
// This is a conversation in progress.// NOTE: all messages, regardless of role, count against token usage for this API.
messages := []azopenai.ChatRequestMessageClassification{
// You set the tone and rules of the conversation with a prompt as the system role.
&azopenai.ChatRequestSystemMessage{Content: azopenai.NewChatRequestSystemMessageContent("You are a helpful assistant. You will talk like a pirate and limit your responses to 20 words or less.")},
// The user asks a question
&azopenai.ChatRequestUserMessage{Content: azopenai.NewChatRequestUserMessageContent("Can you help me?")},
// The reply would come back from the ChatGPT. You'd add it to the conversation so we can maintain context.
&azopenai.ChatRequestAssistantMessage{Content: azopenai.NewChatRequestAssistantMessageContent("Arrrr! Of course, me hearty! What can I do for ye?")},
// The user answers the question based on the latest reply.
&azopenai.ChatRequestUserMessage{Content: azopenai.NewChatRequestUserMessageContent("What's the best way to train a parrot?")},
// from here you'd keep iterating, sending responses back from ChatGPT
}
resp, err := client.GetChatCompletionsStream(context.TODO(), azopenai.ChatCompletionsStreamOptions{
// This is a conversation in progress.// NOTE: all messages count against token usage for this API.
Messages: messages,
N: to.Ptr[int32](1),
DeploymentName: &modelDeploymentID,
}, nil)
if err != nil {
// TODO: Update the following line with your application specific error handling logic
log.Printf("ERROR: %s", err)
return
}
defer resp.ChatCompletionsStream.Close()
gotReply := falsefor {
chatCompletions, err := resp.ChatCompletionsStream.Read()
if errors.Is(err, io.EOF) {
break
}
if err != nil {
// TODO: Update the following line with your application specific error handling logic
log.Printf("ERROR: %s", err)
return
}
for _, choice := range chatCompletions.Choices {
gotReply = true
text := ""if choice.Delta.Content != nil {
text = *choice.Delta.Content
}
role := ""if choice.Delta.Role != nil {
role = string(*choice.Delta.Role)
}
fmt.Fprintf(os.Stderr, "Content[%d], role %q: %q\n", *choice.Index, role, text)
}
}
if gotReply {
fmt.Fprintf(os.Stderr, "Got chat completions streaming reply\n")
}
}
Внедрение
Client.GetEmbeddings
Go
package main
import (
"context""fmt""log""os""github.com/Azure/azure-sdk-for-go/sdk/ai/azopenai""github.com/Azure/azure-sdk-for-go/sdk/azcore"
)
funcmain() {
azureOpenAIKey := os.Getenv("AOAI_EMBEDDINGS_API_KEY")
modelDeploymentID := os.Getenv("AOAI_EMBEDDINGS_MODEL")
// Ex: "https://<your-azure-openai-host>.openai.azure.com"
azureOpenAIEndpoint := os.Getenv("AOAI_EMBEDDINGS_ENDPOINT")
if azureOpenAIKey == "" || modelDeploymentID == "" || azureOpenAIEndpoint == "" {
fmt.Fprintf(os.Stderr, "Skipping example, environment variables missing\n")
return
}
keyCredential := azcore.NewKeyCredential(azureOpenAIKey)
// In Azure OpenAI you must deploy a model before you can use it in your client. For more information// see here: https://learn.microsoft.com/azure/cognitive-services/openai/how-to/create-resource
client, err := azopenai.NewClientWithKeyCredential(azureOpenAIEndpoint, keyCredential, nil)
if err != nil {
// TODO: Update the following line with your application specific error handling logic
log.Printf("ERROR: %s", err)
return
}
resp, err := client.GetEmbeddings(context.TODO(), azopenai.EmbeddingsOptions{
Input: []string{"Testing, testing, 1,2,3."},
DeploymentName: &modelDeploymentID,
}, nil)
if err != nil {
// TODO: Update the following line with your application specific error handling logic
log.Printf("ERROR: %s", err)
return
}
for _, embed := range resp.Data {
// embed.Embedding contains the embeddings for this input index.
fmt.Fprintf(os.Stderr, "Got embeddings for input %d\n", *embed.Index)
}
}
Создание образа
Client.GetImageGenerations
Go
package main
import (
"context""fmt""log""net/http""os""github.com/Azure/azure-sdk-for-go/sdk/ai/azopenai""github.com/Azure/azure-sdk-for-go/sdk/azcore""github.com/Azure/azure-sdk-for-go/sdk/azcore/to"
)
funcmain() {
azureOpenAIKey := os.Getenv("AOAI_DALLE_API_KEY")
// Ex: "https://<your-azure-openai-host>.openai.azure.com"
azureOpenAIEndpoint := os.Getenv("AOAI_DALLE_ENDPOINT")
azureDeployment := os.Getenv("AOAI_DALLE_MODEL")
if azureOpenAIKey == "" || azureOpenAIEndpoint == "" || azureDeployment == "" {
fmt.Fprintf(os.Stderr, "Skipping example, environment variables missing\n")
return
}
keyCredential := azcore.NewKeyCredential(azureOpenAIKey)
client, err := azopenai.NewClientWithKeyCredential(azureOpenAIEndpoint, keyCredential, nil)
if err != nil {
// TODO: Update the following line with your application specific error handling logic
log.Printf("ERROR: %s", err)
return
}
resp, err := client.GetImageGenerations(context.TODO(), azopenai.ImageGenerationOptions{
Prompt: to.Ptr("a cat"),
ResponseFormat: to.Ptr(azopenai.ImageGenerationResponseFormatURL),
DeploymentName: &azureDeployment,
}, nil)
if err != nil {
// TODO: Update the following line with your application specific error handling logic
log.Printf("ERROR: %s", err)
return
}
for _, generatedImage := range resp.Data {
// the underlying type for the generatedImage is dictated by the value of// ImageGenerationOptions.ResponseFormat. In this example we used `azopenai.ImageGenerationResponseFormatURL`,// so the underlying type will be ImageLocation.
resp, err := http.Head(*generatedImage.URL)
if err != nil {
// TODO: Update the following line with your application specific error handling logic
log.Printf("ERROR: %s", err)
return
}
_ = resp.Body.Close()
fmt.Fprintf(os.Stderr, "Image generated, HEAD request on URL returned %d\n", resp.StatusCode)
}
}
Завершение (устаревшая версия)
Client.GetChatCompletions
Go
package main
import (
"context""fmt""log""os""github.com/Azure/azure-sdk-for-go/sdk/ai/azopenai""github.com/Azure/azure-sdk-for-go/sdk/azcore""github.com/Azure/azure-sdk-for-go/sdk/azcore/to"
)
funcmain() {
azureOpenAIKey := os.Getenv("AOAI_COMPLETIONS_API_KEY")
modelDeployment := os.Getenv("AOAI_COMPLETIONS_MODEL")
// Ex: "https://<your-azure-openai-host>.openai.azure.com"
azureOpenAIEndpoint := os.Getenv("AOAI_COMPLETIONS_ENDPOINT")
if azureOpenAIKey == "" || modelDeployment == "" || azureOpenAIEndpoint == "" {
fmt.Fprintf(os.Stderr, "Skipping example, environment variables missing\n")
return
}
keyCredential := azcore.NewKeyCredential(azureOpenAIKey)
// In Azure OpenAI you must deploy a model before you can use it in your client. For more information// see here: https://learn.microsoft.com/azure/cognitive-services/openai/how-to/create-resource
client, err := azopenai.NewClientWithKeyCredential(azureOpenAIEndpoint, keyCredential, nil)
if err != nil {
// TODO: Update the following line with your application specific error handling logic
log.Printf("ERROR: %s", err)
return
}
resp, err := client.GetCompletions(context.TODO(), azopenai.CompletionsOptions{
Prompt: []string{"What is Azure OpenAI, in 20 words or less"},
MaxTokens: to.Ptr(int32(2048)),
Temperature: to.Ptr(float32(0.0)),
DeploymentName: &modelDeployment,
}, nil)
if err != nil {
// TODO: Update the following line with your application specific error handling logic
log.Printf("ERROR: %s", err)
return
}
for _, choice := range resp.Choices {
fmt.Fprintf(os.Stderr, "Result: %s\n", *choice.Text)
}
}
Обработка ошибок
Все методы, отправляющие HTTP-запросы, возвращаются *azcore.ResponseError при сбое этих запросов.
ResponseError содержит сведения об ошибках и необработанный ответ от службы.
Ведение журнала
Этот модуль использует реализацию ведения журнала в azcore. Чтобы включить ведение журнала для всех модулей пакета SDK Azure, задайте для всех AZURE_SDK_GO_LOGGING. По умолчанию средство ведения журнала записывает в stderr. Используйте пакет azcore/log для управления выходными данными журнала. Например, ведение журнала только событий HTTP-запроса и ответа и печать их в stdout:
Go
import azlog "github.com/Azure/azure-sdk-for-go/sdk/azcore/log"// Print log events to stdout
azlog.SetListener(func(cls azlog.Event, msg string) {
fmt.Println(msg)
})
// Includes only requests and responses in credential logs
azlog.SetEvents(azlog.EventRequest, azlog.EventResponse)
В отличие от клиентских библиотек Azure OpenAI для Python и JavaScript, чтобы обеспечить совместимость пакета Azure OpenAI Java, ограничена назначением определенного подмножества версий API Azure OpenAI. Как правило, каждый пакет Azure OpenAI Java разблокирует доступ к новым функциям выпуска API OpenAI Azure. Доступ к последним версиям API влияет на доступность компонентов.
Для взаимодействия со службой Azure OpenAI необходимо создать экземпляр клиентского класса OpenAIAsyncClient или OpenAIClient с помощью OpenAIClientBuilder. Чтобы настроить клиент для использования с Azure OpenAI, предоставьте допустимый URI конечной точки ресурсу Azure OpenAI вместе с соответствующими учетными данными ключа, учетными данными маркера или учетными данными удостоверения Azure, авторизованными для использования ресурса Azure OpenAI.
После установки можно выбрать тип учетных данных, используемых azure.identity . Например, DefaultAzureCredential можно использовать для проверки подлинности клиента: задайте значения идентификатора клиента, идентификатора клиента и секрета клиента приложения Microsoft Entra ID в качестве переменных среды: AZURE_CLIENT_ID, AZURE_TENANT_ID, AZURE_CLIENT_SECRET.
Авторизация проще всего использовать DefaultAzureCredential. Он находит лучшие учетные данные для использования в своей работающей среде.
Java
TokenCredential defaultCredential = new DefaultAzureCredentialBuilder().build();
OpenAIClient client = new OpenAIClientBuilder()
.credential(defaultCredential)
.endpoint("{endpoint}")
.buildClient();
String deploymentOrModelId = "{azure-open-ai-deployment-model-id}";
SpeechGenerationOptions options = new SpeechGenerationOptions(
"Today is a wonderful day to build something people love!",
SpeechVoice.ALLOY);
BinaryData speech = client.generateSpeechFromText(deploymentOrModelId, options);
// Checkout your generated speech in the file system.
Path path = Paths.get("{your-local-file-path}/speech.wav");
Files.write(path, speech.toBytes());
Чат
client.getChatCompletions
Java
List<ChatRequestMessage> chatMessages = new ArrayList<>();
chatMessages.add(new ChatRequestSystemMessage("You are a helpful assistant. You will talk like a pirate."));
chatMessages.add(new ChatRequestUserMessage("Can you help me?"));
chatMessages.add(new ChatRequestAssistantMessage("Of course, me hearty! What can I do for ye?"));
chatMessages.add(new ChatRequestUserMessage("What's the best way to train a parrot?"));
ChatCompletions chatCompletions = client.getChatCompletions("{deploymentOrModelName}",
new ChatCompletionsOptions(chatMessages));
System.out.printf("Model ID=%s is created at %s.%n", chatCompletions.getId(), chatCompletions.getCreatedAt());
for (ChatChoice choice : chatCompletions.getChoices()) {
ChatResponseMessage message = choice.getMessage();
System.out.printf("Index: %d, Chat Role: %s.%n", choice.getIndex(), message.getRole());
System.out.println("Message:");
System.out.println(message.getContent());
}
Потоковая передача
Java
List<ChatRequestMessage> chatMessages = new ArrayList<>();
chatMessages.add(new ChatRequestSystemMessage("You are a helpful assistant. You will talk like a pirate."));
chatMessages.add(new ChatRequestUserMessage("Can you help me?"));
chatMessages.add(new ChatRequestAssistantMessage("Of course, me hearty! What can I do for ye?"));
chatMessages.add(new ChatRequestUserMessage("What's the best way to train a parrot?"));
ChatCompletions chatCompletions = client.getChatCompletions("{deploymentOrModelName}",
new ChatCompletionsOptions(chatMessages));
System.out.printf("Model ID=%s is created at %s.%n", chatCompletions.getId(), chatCompletions.getCreatedAt());
for (ChatChoice choice : chatCompletions.getChoices()) {
ChatResponseMessage message = choice.getMessage();
System.out.printf("Index: %d, Chat Role: %s.%n", choice.getIndex(), message.getRole());
System.out.println("Message:");
System.out.println(message.getContent());
}
Завершение чата с изображениями
Java
List<ChatRequestMessage> chatMessages = new ArrayList<>();
chatMessages.add(new ChatRequestSystemMessage("You are a helpful assistant that describes images"));
chatMessages.add(new ChatRequestUserMessage(Arrays.asList(
new ChatMessageTextContentItem("Please describe this image"),
new ChatMessageImageContentItem(
new ChatMessageImageUrl("https://raw.githubusercontent.com/MicrosoftDocs/azure-ai-docs/main/articles/ai-services/openai/media/how-to/generated-seattle.png"))
)));
ChatCompletionsOptions chatCompletionsOptions = new ChatCompletionsOptions(chatMessages);
ChatCompletions chatCompletions = client.getChatCompletions("{deploymentOrModelName}", chatCompletionsOptions);
System.out.println("Chat completion: " + chatCompletions.getChoices().get(0).getMessage().getContent());
Внедрение
client.getEmbeddings
Java
EmbeddingsOptions embeddingsOptions = new EmbeddingsOptions(
Arrays.asList("Your text string goes here"));
Embeddings embeddings = client.getEmbeddings("{deploymentOrModelName}", embeddingsOptions);
for (EmbeddingItem item : embeddings.getData()) {
System.out.printf("Index: %d.%n", item.getPromptIndex());
for (Float embedding : item.getEmbedding()) {
System.out.printf("%f;", embedding);
}
}
Генерирование изображений
Java
ImageGenerationOptions imageGenerationOptions = new ImageGenerationOptions(
"A drawing of the Seattle skyline in the style of Van Gogh");
ImageGenerations images = client.getImageGenerations("{deploymentOrModelName}", imageGenerationOptions);
for (ImageGenerationData imageGenerationData : images.getData()) {
System.out.printf(
"Image location URL that provides temporary access to download the generated image is %s.%n",
imageGenerationData.getUrl());
}
Обработка ошибок
Включение ведения журнала клиента
Чтобы устранить неполадки с библиотекой Azure OpenAI, важно сначала включить ведение журнала для мониторинга поведения приложения. Ошибки и предупреждения в журналах обычно предоставляют полезные сведения о том, что пошло не так, а иногда и включают корректирующие действия для устранения проблем. Клиентские библиотеки Azure для Java предоставляют два варианта ведения журнала:
Встроенная платформа ведения журнала.
Поддержка ведения журнала с помощью интерфейса SLF4J.
Ознакомьтесь с инструкциями в этом справочном документе о том, как [настроить ведение журнала в пакете SDK для Azure для Java][logging_overview].
Включение ведения журнала HTTP-запросов и ответов
Проверка HTTP-запроса, отправленного или ответа, полученного через проводную службу Azure OpenAI, может оказаться полезной при устранении неполадок. Чтобы включить ведение журнала полезных данных HTTP-запроса и ответа, можно настроить [OpenAIClient][openai_client], как показано ниже. Если на пути к классу нет SLF4J Logger , задайте переменную среды [AZURE_LOG_LEVEL][azure_log_level] на компьютере, чтобы включить ведение журнала.
Java
OpenAIClient openAIClient = new OpenAIClientBuilder()
.endpoint("{endpoint}")
.credential(new AzureKeyCredential("{key}"))
.httpLogOptions(new HttpLogOptions().setLogLevel(HttpLogDetailLevel.BODY_AND_HEADERS))
.buildClient();
// or
DefaultAzureCredential credential = new DefaultAzureCredentialBuilder().build();
OpenAIClient configurationClientAad = new OpenAIClientBuilder()
.credential(credential)
.endpoint("{endpoint}")
.httpLogOptions(new HttpLogOptions().setLogLevel(HttpLogDetailLevel.BODY_AND_HEADERS))
.buildClient();
Кроме того, можно настроить протоколирование HTTP-запросов и ответов для всего приложения, задав следующую переменную среды. Обратите внимание, что это изменение включает ведение журнала для каждого клиента Azure, поддерживающего ведение журнала HTTP-запроса/ответа.
Имя переменной среды: AZURE_HTTP_LOG_DETAIL_LEVEL
Значение
Уровень ведения журнала
ничего
Ведение журнала HTTP-запросов и ответов отключено
базовая
Регистрирует только URL-адреса, методы HTTP и время завершения запроса.
заголовки
Регистрирует все в BASIC, а также все заголовки запросов и ответов.
текст
Записывает все данные в BASIC, а также весь текст запроса и ответа.
body_and_headers
Записывает все данные в заголовки и текст.
Примечание
При ведении журнала текста запроса и ответа убедитесь, что они не содержат конфиденциальную информацию. При регистрации заголовков клиентская библиотека имеет набор заголовков по умолчанию, которые считаются безопасными для журнала, но этот набор можно обновить, обновив параметры журнала в построителе, как показано ниже.
Методы службы Azure OpenAI вызывают или[HttpResponseException его подкласс при сбое.
Создаваемый HttpResponseException клиентской библиотекой OpenAI содержит подробный объект ошибки ответа, который предоставляет конкретные полезные сведения о том, что произошло неправильно, и включает в себя корректирующие действия для устранения распространенных проблем.
Эти сведения об ошибке можно найти внутри свойства HttpResponseException сообщения объекта.
Ниже приведен пример того, как перехватывать его с помощью синхронного клиента
Java
List<ChatRequestMessage> chatMessages = new ArrayList<>();
chatMessages.add(new ChatRequestSystemMessage("You are a helpful assistant. You will talk like a pirate."));
chatMessages.add(new ChatRequestUserMessage("Can you help me?"));
chatMessages.add(new ChatRequestAssistantMessage("Of course, me hearty! What can I do for ye?"));
chatMessages.add(new ChatRequestUserMessage("What's the best way to train a parrot?"));
try {
ChatCompletions chatCompletions = client.getChatCompletions("{deploymentOrModelName}",
new ChatCompletionsOptions(chatMessages));
} catch (HttpResponseException e) {
System.out.println(e.getMessage());
// Do something with the exception
}
С помощью асинхронных клиентов можно перехватывать и обрабатывать исключения в обратных вызовах ошибок:
Java
asyncClient.getChatCompletions("{deploymentOrModelName}", new ChatCompletionsOptions(chatMessages))
.doOnSuccess(ignored -> System.out.println("Success!"))
.doOnError(
error -> error instanceof ResourceNotFoundException,
error -> System.out.println("Exception: 'getChatCompletions' could not be performed."));
Ошибки проверки подлинности
Azure OpenAI поддерживает проверку подлинности Идентификатора Microsoft Entra.
OpenAIClientBuilder имеет метод задания credential. Чтобы предоставить допустимые учетные данные, можно использовать azure-identity зависимость.
Доступность компонентов в Azure OpenAI зависит от используемой версии REST API. Для новейших функций нацелимся на последний api предварительной версии.
Существует несколько способов проверки подлинности в службе Azure OpenAI с помощью маркеров идентификатора Microsoft Entra. По умолчанию используется DefaultAzureCredential класс из @azure/identity пакета.
TypeScript
import { DefaultAzureCredential } from"@azure/identity";
const credential = new DefaultAzureCredential();
Затем этот объект передается как часть AzureClientOptions объекта конструкторам AzureOpenAI и AssistantsClient клиентским конструкторам.
Однако для проверки подлинности AzureOpenAI клиента необходимо использовать getBearerTokenProvider функцию из @azure/identity пакета. Эта функция создает поставщик токенов, который AzureOpenAI используется внутренне для получения маркеров для каждого запроса. Поставщик токенов создается следующим образом:
Дополнительные сведения о проверке подлинности Без ключей Azure OpenAI см. в статье "Начало работы со стандартным блоком безопасности Azure OpenAI".
Настройка
Объект AzureClientOptions расширяет объект OpenAI ClientOptions . Этот клиентский объект Azure используется для настройки подключения и поведения клиента Azure OpenAI. Он содержит свойства для указания свойств, уникальных для Azure.
Свойство
Сведения
apiVersion: string
Указывает используемую версию API.
azureADTokenProvider: (() => Promise<string>)
Функция, которая возвращает маркер доступа для Microsoft Entra (прежнее название — Azure Active Directory), вызываемая при каждом запросе.
развёртывание: string
Развертывание модели. Если задано, задает базовый URL-адрес клиента для включения /deployments/{deployment}. Конечные точки, отличные от развертывания, нельзя использовать (не поддерживается с API-интерфейсами Помощников).
конечная точка: string
Конечная точка Azure OpenAI со следующим форматом: https://RESOURCE-NAME.azure.openai.com/
Ключи API не рекомендуется использовать в рабочей среде, так как они менее безопасны, чем другие методы проверки подлинности.
Объект AzureClientOptions расширяет объект OpenAI ClientOptions . Этот клиентский объект Azure используется для настройки подключения и поведения клиента Azure OpenAI. Он содержит свойства для указания свойств, уникальных для Azure.
Свойство
Сведения
apiKey: string
Ключ API для проверки подлинности запросов.
apiVersion: string
Указывает используемую версию API.
развёртывание: string
Развертывание модели. Если задано, задает базовый URL-адрес клиента для включения /deployments/{deployment}. Конечные точки, отличные от развертывания, нельзя использовать (не поддерживается с API-интерфейсами Помощников).
конечная точка: string
Конечная точка Azure OpenAI со следующим форматом: https://RESOURCE-NAME.azure.openai.com/
Важно!
Используйте ключи API с осторожностью. Не включайте ключ API непосредственно в код и никогда не публикуйте его. Если вы используете ключ API, сохраните его безопасно в Azure Key Vault. Дополнительные сведения об использовании ключей API безопасно в приложениях см. в разделе "Ключи API" с помощью Azure Key Vault.
Следующие ошибки автоматически удаляются дважды по умолчанию с кратким экспоненциальным обратным выходом:
Ошибки подключения
408 — истекло время ожидания запроса
Ограничение скорости 429
>=500 внутренних ошибок
Используйте maxRetries для задания и отключения поведения повторных попыток:
TypeScript
// Configure the default for all requests:const client = new AzureOpenAI({
maxRetries: 0, // default is 2
});
// Or, configure per-request:await client.chat.completions.create({ messages: [{ role: 'user', content: 'How can I get the name of the current day in Node.js?' }], model: '' }, {
maxRetries: 5,
});
Эта библиотека поддерживается OpenAI. Ознакомьтесь с журналом выпуска, чтобы отслеживать последние обновления библиотеки.
Поддержка версий API OpenAI в Azure
Доступность компонентов в Azure OpenAI зависит от используемой версии REST API. Для новейших функций нацелимся на последний api предварительной версии.
import os
from openai import AzureOpenAI
from azure.identity import DefaultAzureCredential, get_bearer_token_provider
token_provider = get_bearer_token_provider(
DefaultAzureCredential(), "https://cognitiveservices.azure.com/.default"
)
client = AzureOpenAI(
azure_endpoint = os.getenv("AZURE_OPENAI_ENDPOINT"),
azure_ad_token_provider=token_provider,
api_version="2024-10-21"
)
Дополнительные сведения о проверке подлинности Без ключей Azure OpenAI см. в статье "Начало работы со стандартным блоком безопасности Azure OpenAI".
Важно!
Используйте ключи API с осторожностью. Не включайте ключ API непосредственно в код и никогда не публикуйте его. Если вы используете ключ API, сохраните его безопасно в Azure Key Vault. Дополнительные сведения об использовании ключей API безопасно в приложениях см. в разделе "Ключи API" с помощью Azure Key Vault.
# from openai import AzureOpenAI# client = AzureOpenAI()
completion = client.chat.completions.create(
model="gpt-4o", # Replace with your model dpeloyment name.
messages=[
{"role": "system", "content": "You are a helpful assistant."},
{"role": "user", "content": "When was Microsoft founded?"}
]
)
#print(completion.choices[0].message)
print(completion.model_dump_json(indent=2)
# from openai import AzureOpenAI# client = AzureOpenAI()
completion = client.chat.completions.create(
model="gpt-4o", # Replace with your model dpeloyment name.
messages=[
{"role": "system", "content": "You are a helpful assistant."},
{"role": "user", "content": "When was Microsoft founded?"}
],
stream=True
)
for chunk in completion:
if chunk.choices and chunk.choices[0].delta.content isnotNone:
print(chunk.choices[0].delta.content, end='',)
text
Microsoft was founded on April 4, 1975, by Bill Gates and Paul Allen.
chat.completions.create() — входные данные изображения
# from openai import AzureOpenAI# client = AzureOpenAI()
embedding = client.embeddings.create(
model="text-embedding-3-large", # Replace with your model deployment name
input="Attenion is all you need",
encoding_format="float"
)
print(embedding)
# from openai import AzureOpenAI# client = AzureOpenAI()import openai
try:
client.fine_tuning.jobs.create(
model="gpt-4o",
training_file="file-test",
)
except openai.APIConnectionError as e:
print("The server could not be reached")
print(e.__cause__) # an underlying Exception, likely raised within httpx.except openai.RateLimitError as e:
print("A 429 status code was received; we should back off a bit.")
except openai.APIStatusError as e:
print("Another non-200-range status code was received")
print(e.status_code)
print(e.response)
Коды ошибок
Код состояния
Тип ошибки
400
BadRequestError
401
AuthenticationError
403
PermissionDeniedError
404
NotFoundError
422
UnprocessableEntityError
429
RateLimitError
>=500
InternalServerError
Н/П
APIConnectionError
Идентификаторы запросов
Чтобы получить идентификатор запроса, можно использовать _request_id свойство, соответствующее заголовку x-request-id ответа.
Следующие ошибки автоматически удаляются дважды по умолчанию с кратким экспоненциальным обратным выходом:
Ошибки подключения
408 — истекло время ожидания запроса
Ограничение скорости 429
>=500 внутренних ошибок
Используйте max_retries для задания и отключения поведения повторных попыток:
Python
# For all requestsfrom openai import AzureOpenAI
client = AzureOpenAI(
max_retries=0
)
Python
# max retires for specific requests
client.with_options(max_retries=5).chat.completions.create(
messages=[
{
"role": "user",
"content": "When was Microsoft founded?",
}
],
model="gpt-4o",
)
Следующие шаги
Чтобы узнать, какие модели поддерживаются в настоящее время, ознакомьтесь со страницей моделей Azure OpenAI
Присоединитесь к серии встреч для создания масштабируемых решений искусственного интеллекта на основе реальных вариантов использования с другими разработчиками и экспертами.
Узнайте, как использовать мощные модели Azure OpenAI, включая GPT-4o, GPT-4o mini, GPT-4, GPT-4 Turbo с Vision, GPT-3.5-Turbo, DALL-E 3 и серии внедренных моделей