Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
В этой статье приводятся рекомендации по миграции ваших приложений с Azure AI Inference SDK на OpenAI SDK. Пакет SDK OpenAI обеспечивает более широкую совместимость, доступ к новейшим функциям OpenAI и упрощенному коду с унифицированными шаблонами в Azure OpenAI и Foundry Models.
Примечание
Пакет SDK OpenAI ссылается на клиентские библиотеки (например, пакет Python openai или пакет JavaScript openai npm), которые подключаются к конечным точкам API OpenAI версии 1. Эти SDK имеют собственное управление версиями, независимое от API. Например, SDK Go OpenAI в настоящее время находится на версии 3, но по-прежнему подключается к конечным точкам API OpenAI версии 1 с /openai/v1/ в пути URL.
Преимущества миграции
Миграция на пакет SDK OpenAI обеспечивает несколько преимуществ:
- поддержка модели Broader: работает с Azure OpenAI в модели Foundry и других моделях Foundry от поставщиков, таких как DeepSeek и Grok.
- Unified API: использует те же библиотеки и клиенты SDK для конечных точек OpenAI и Azure OpenAI.
- функции Последние: доступ к новейшим функциям OpenAI без ожидания обновлений Azure
- Simplified authentication: встроенная поддержка как ключа API, так и проверки подлинности Microsoft Entra ID
-
Неявное управление версиями API: API версии 1 устраняет необходимость часто обновлять
api-versionпараметры
Основные различия
В следующей таблице показаны основные различия между двумя пакетами SDK:
| Аспект | пакет SDK для вывода Azure ИИ | OpenAI SDK |
|---|---|---|
| Класс клиента | ChatCompletionsClient |
OpenAI |
| Формат конечной точки | https://<resource>.services.ai.azure.com/models |
https://<resource>.openai.azure.com/openai/v1/ |
| Версия API | Обязательный в URL-адресе или параметре | Не требуется (используется API версии 1) |
| Параметр модели | Необязательно (для конечных точек с несколькими моделями) | Обязательный (имя развертывания) |
| Проверки подлинности | только учетные данные Azure | Ключ API или учетные данные Azure |
Установка
Установите пакет SDK OpenAI:
pip install openai
Для проверки подлинности Microsoft Entra ID также установите следующее:
pip install azure-identity
Конфигурация клиента
С проверкой подлинности ключа API:
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/",
)
С помощью проверки подлинности Microsoft Entra ID:
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,
)
Завершение чата
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)
Выходные данные приведены следующим образом:
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.
Стриминг
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
API Responses — это интерфейс OpenAI с сохранением состояния, который возвращает структурированный массив output, содержащий сообщения, вызовы инструментов и элементы рассуждений.
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)
Reasoning
Примечание
Эта информация о контенте рассуждений не относится к моделям Azure OpenAI. Модели причин Azure OpenAI используют функцию сводки причин.
Некоторые модели рассуждений, такие как DeepSeek-R1, создают завершения и включают в них обоснования. API ответов представляет это как структурированный reasoning выходной элемент, содержащий summary[].text мышление модели, наряду с окончательным ответом.
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)
Выходные данные приведены следующим образом:
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.
Примечание
Известная проблема: Для моделей Foundry (не являющихся моделями Azure OpenAI), таких как DeepSeek-R1-0528, текст сводки рассуждений в каждом элементе вывода reasoning заполняется корректно, но число токенов рассуждений в сведениях об использовании ответа (reasoning_tokens на проводе) в настоящее время отображается как 0, даже если текст сводки присутствует. Не полагайтесь на количество токенов рассуждения при расчёте оплаты или квот при использовании моделей Foundry. Это предупреждение не относится к Azure OpenAI в модели Foundry.
При создании многоходовых диалогов избегайте отправки содержимого рассуждений в историю чата, поскольку рассуждения, как правило, приводят к длинным объяснениям.
Эмбеддинги
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)
Установка
Установите пакет SDK OpenAI:
dotnet add package OpenAI
Для проверки подлинности Microsoft Entra ID также установите следующее:
dotnet add package Azure.Identity
Конфигурация клиента
С проверкой подлинности ключа API:
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/")
}
);
С помощью проверки подлинности Microsoft Entra ID:
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/")
}
);
Завершение чата
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);
Стриминг
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
API Responses — это интерфейс OpenAI с сохранением состояния, который возвращает структурированный массив output, содержащий сообщения, вызовы инструментов и элементы рассуждений.
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());
Reasoning
Примечание
Эта информация о контенте рассуждений не относится к моделям Azure OpenAI. Модели причин Azure OpenAI используют функцию сводки причин.
Некоторые модели рассуждений, такие как DeepSeek-R1, создают завершения и включают в них обоснования. API ответов представляет это как структурированный reasoning выходной элемент, содержащий summary[].text мышление модели, а также окончательный ответ.
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()}");
Выходные данные приведены следующим образом:
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.
Примечание
Известная проблема: Для моделей Foundry (не являющихся моделями Azure OpenAI), таких как DeepSeek-R1-0528, текст сводки рассуждений в каждом элементе вывода reasoning заполняется корректно, но число токенов рассуждений в сведениях об использовании ответа (reasoning_tokens на проводе) в настоящее время отображается как 0, даже если текст сводки присутствует. Не полагайтесь на количество токенов рассуждения при расчёте оплаты или квот при использовании моделей Foundry. Это предупреждение не относится к Azure OpenAI в модели Foundry.
При создании многоходовых диалогов избегайте отправки содержимого рассуждений в историю чата, поскольку рассуждения, как правило, приводят к длинным объяснениям.
Эмбеддинги
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())}]");
Установка
Установите пакет SDK OpenAI:
npm install openai
Для проверки подлинности Microsoft Entra ID также установите следующее:
npm install @azure/identity
Конфигурация клиента
С проверкой подлинности ключа API:
import { OpenAI } from "openai";
const client = new OpenAI({
baseURL: "https://<resource>.openai.azure.com/openai/v1/",
apiKey: process.env.AZURE_OPENAI_API_KEY
});
С помощью проверки подлинности Microsoft Entra ID:
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
});
Завершение чата
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);
Стриминг
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
API Responses — это интерфейс OpenAI с сохранением состояния, который возвращает структурированный массив output, содержащий сообщения, вызовы инструментов и элементы рассуждений.
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);
Reasoning
Примечание
Эта информация о контенте рассуждений не относится к моделям Azure OpenAI. Модели причин Azure OpenAI используют функцию сводки причин.
Некоторые модели рассуждений, такие как DeepSeek-R1, создают завершения и включают в них обоснования. API ответов представляет это как структурированный reasoning выходной элемент, содержащий summary[].text мышление модели, наряду с окончательным ответом.
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);
Выходные данные приведены следующим образом:
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.
Примечание
Известная проблема: Для моделей Foundry (не являющихся моделями Azure OpenAI), таких как DeepSeek-R1-0528, текст сводки рассуждений в каждом элементе вывода reasoning заполняется корректно, но число токенов рассуждений в сведениях об использовании ответа (reasoning_tokens на проводе) в настоящее время отображается как 0, даже если текст сводки присутствует. Не полагайтесь на количество токенов рассуждения при расчёте оплаты или квот при использовании моделей Foundry. Это предупреждение не относится к Azure OpenAI в модели Foundry.
При создании многоходовых диалогов избегайте отправки содержимого рассуждений в историю чата, поскольку рассуждения, как правило, приводят к длинным объяснениям.
Эмбеддинги
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);
Установка
Добавьте пакет SDK OpenAI в проект. Проверьте репозиторий OpenAI Java GitHub для получения последней версии и инструкций по установке.
Для проверки подлинности Microsoft Entra ID также добавьте:
<dependency>
<groupId>com.azure</groupId>
<artifactId>azure-identity</artifactId>
<version>1.18.0</version>
</dependency>
Конфигурация клиента
С проверкой подлинности ключа API:
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();
С помощью проверки подлинности Microsoft Entra ID:
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();
Завершение чата
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());
Стриминг
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
API Responses — это интерфейс OpenAI с сохранением состояния, который возвращает структурированный массив output, содержащий сообщения, вызовы инструментов и элементы рассуждений.
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());
Reasoning
Примечание
Эта информация о содержимом рассуждений не относится к моделям Azure OpenAI. Модели причин Azure OpenAI используют функцию сводки причин.
Некоторые модели рассуждений, такие как DeepSeek-R1, создают завершения и включают в них обоснования. API ответов представляет это как структурированный reasoning выходной элемент, содержащий summary[].text мышление модели, наряду с окончательным ответом.
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());
Выходные данные приведены следующим образом:
Thinking: Okay, the user is asking how many languages exist in the world. I need to provide a clear and accurate answer...
Примечание
Известная проблема: Для моделей Foundry (не относящихся к Azure OpenAI), таких как DeepSeek-R1-0528, текст сводки рассуждений у каждого элемента вывода reasoning стабильно формируется, однако количество токенов рассуждений в сведениях об использовании ответа (reasoning_tokens в передаваемых данных) в настоящее время указывается как 0, даже если текст сводки присутствует. Не полагайтесь на количество токенов рассуждений при расчете оплаты или учете квоты при использовании моделей Foundry. Это предупреждение не относится к Azure OpenAI в модели Foundry.
При ведении многоходовых диалогов избегайте отправки содержимого рассуждений в истории чата, так как рассуждения, как правило, приводят к длинным объяснениям.
Эмбеддинги
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));
}
}
Установка
Установите пакет SDK OpenAI:
go get github.com/openai/openai-go/v3
Для проверки подлинности Microsoft Entra ID также установите следующее:
go get -u github.com/Azure/azure-sdk-for-go/sdk/azidentity
Конфигурация клиента
С проверкой подлинности ключа API:
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")),
)
С помощью проверки подлинности Microsoft Entra ID:
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),
)
Завершение чата
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)
Стриминг
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
API Responses — это интерфейс OpenAI с сохранением состояния, который возвращает структурированный массив output, содержащий сообщения, вызовы инструментов и элементы рассуждений.
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())
Reasoning
Примечание
Эта информация о контенте рассуждений не относится к моделям Azure OpenAI. Модели причин Azure OpenAI используют функцию сводки причин.
Некоторые модели рассуждений, такие как DeepSeek-R1, создают завершения и включают в них обоснования. API ответов представляет это как структурированный reasoning выходной элемент, содержащий summary[].text мышление модели, наряду с окончательным ответом.
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())
Выходные данные приведены следующим образом:
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.
Примечание
Известная проблема: Для моделей Foundry (не являющихся моделями Azure OpenAI), таких как DeepSeek-R1-0528, текст сводки рассуждений в каждом элементе вывода reasoning заполняется корректно, но число токенов рассуждений в сведениях об использовании ответа (reasoning_tokens на проводе) в настоящее время отображается как 0, даже если текст сводки присутствует. Не полагайтесь на количество токенов рассуждения при расчёте оплаты или квот при использовании моделей Foundry. Это предупреждение не относится к Azure OpenAI в модели Foundry.
При создании многоходовых диалогов избегайте отправки содержимого рассуждений в историю чата, поскольку рассуждения, как правило, приводят к длинным объяснениям.
Эмбеддинги
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()
}
Распространенные шаблоны миграции
Обработка параметров модели
-
Azure AI Inference SDK: параметр
modelнеобязателен для конечных точек с одной моделью, но требуется для многомодельных конечных точек. -
Пакет SDK OpenAI:
modelпараметр всегда обязателен и должен быть установлен как имя вашего развертывания.
Формат URL-адреса конечной точки
- SDK для инференса Azure AI: использует
https://<resource>.services.ai.azure.com/models. -
Пакет SDK OpenAI: использует
https://<resource>.openai.azure.com/openai/v1(подключается к API OpenAI версии 1).
Структура ответа
Структура отклика аналогична, но имеет некоторые отличия:
-
Azure AI Inference SDK: возвращает объект
ChatCompletionsсchoices[].message.content. -
Пакет SDK OpenAI: возвращает объект
ChatCompletionсchoices[].message.content.
Оба пакета SDK предоставляют аналогичные шаблоны доступа к данным ответа, в том числе:
- Содержимое сообщения
- Использование токена
- Сведения о модели
- Причина завершения
Контрольный список миграции
Используйте этот контрольный список для обеспечения плавной миграции:
- Установка пакета SDK OpenAI для языка программирования
- Обновление кода проверки подлинности (ключ API или Microsoft Entra ID)
- Измените URL-адреса конечной точки с
.services.ai.azure.com/modelsна.openai.azure.com/openai/v1/ - Измените область учетных данных с
https://cognitiveservices.azure.com/.defaultнаhttps://ai.azure.com/.default - Обновление кода инициализации клиента
- Всегда задавайте параметр
modelс названием вашего развертывания. - Обновление вызовов метода запроса (
complete→chat.completions.create) - Обновление кода потоковой передачи при необходимости
- Обновите обработку ошибок для использования исключений OpenAI SDK
- Тщательно протестируйте все функциональные возможности
- Обновление документации и комментариев кода
Устранение неполадок
Сбои проверки подлинности
Если возникают сбои проверки подлинности:
- Убедитесь, что ключ API является правильным и не истекает
- Для Microsoft Entra ID убедитесь, что приложение имеет правильные разрешения
- Убедитесь, что для области учетных данных задано значение
https://ai.azure.com/.default
Ошибки конечной точки
Если вы сталкиваетесь с ошибками конечного узла:
- Убедитесь, что формат URL-адреса конечной точки включает
/openai/v1/в конце. - Убедитесь, что имя ресурса правильно.
- Убедитесь, что развертывание модели существует и активно.
Ошибки модели не найдены
Если вы получаете ошибку "модель не найдена":
- Убедитесь, что вы используете имя развертывания, а не имя модели.
- Убедитесь, что развертывание активно в вашем ресурсе Microsoft Foundry.
- Убедитесь, что имя развертывания совпадает точно (с учетом регистра).