Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
A partir de junho de 2024, recomendamos migrar para a biblioteca JavaScript da API OpenAI 4.x, a versão mais recente da biblioteca oficial do cliente JavaScript do OpenAI, que dá suporte ao Azure OpenAI na versão 2022-12-01
e posteriores da API de Modelos Azure AI Foundry. Este artigo ajuda você a atualizar as alterações específicas para o OpenAI do Azure.
Autenticação do usuário
Há várias maneiras de autenticar solicitações de API no OpenAI do Azure. É altamente recomendável usar tokens do Microsoft Entra. Consulte a Documentação da Identidade do Azure para obter mais informações.
Microsoft Entra ID
Há várias maneiras de autenticar com o Azure OpenAI usando tokens de ID do Microsoft Entra. A maneira padrão é usar a classe DefaultAzureCredential
do pacote @azure/identity
, mas seu aplicativo pode estar usando uma classe de credencial diferente. Para os fins deste guia, presumimos que você esteja usando a classe DefaultAzureCredential
. Uma credencial pode ser criada da seguinte maneira:
import { DefaultAzureCredential } from "@azure/identity";
const credential = new DefaultAzureCredential();
Em seguida, esse objeto é passado para o segundo argumento dos construtores OpenAIClient
e AssistantsClient
do cliente.
No entanto, para autenticar o cliente AzureOpenAI
, precisamos usar a função getBearerTokenProvider
do pacote @azure/identity
. Essa função cria um provedor de token que usa AzureOpenAI
internamente para obter tokens para cada solicitação. O provedor de token é criado da seguinte maneira:
import { DefaultAzureCredential, getBearerTokenProvider } from "@azure/identity";
const credential = new DefaultAzureCredential();
const scope = "https://cognitiveservices.azure.com/.default";
const azureADTokenProvider = getBearerTokenProvider(credential, scope);
azureADTokenProvider
é passado para o objeto de opções ao criar o AzureOpenAI
cliente.
(Altamente Desencorajado) Chave de API
As chaves de API não são recomendadas para uso em produção porque são menos seguras do que outros métodos de autenticação. Anteriormente, objetos AzureKeyCredential
eram criados da seguinte maneira para autenticar OpenAIClient
ou AssistantsClient
:
import { AzureKeyCredential } from "@azure/openai";
const apiKey = new AzureKeyCredential("your API key");
Por outro lado, o AzureOpenAI
pode ser autenticado com uma chave de API definindo a variável de ambiente AZURE_OPENAI_API_KEY
ou definindo a propriedade cadeia de caracteres apiKey
no objeto de opções ao criar o cliente AzureOpenAI
.
Importante
Use as chaves de API com cautela. Não inclua a chave da API diretamente no seu código e nunca a publique publicamente. Se você usar uma chave de API, armazene-a com segurança no Azure Key Vault. Para obter mais informações sobre como usar chaves de API com segurança em seus aplicativos, confira Chaves de API com o Azure Key Vault.
Para obter mais informações sobre a segurança dos serviços de IA, veja Autenticar solicitações para serviços de IA do Azure.
Como construir o cliente
import { AzureOpenAI } from "openai";
const deployment = "Your Azure OpenAI deployment";
const apiVersion = "2024-04-01-preview";
const options = { azureADTokenProvider, deployment, apiVersion }
const client = new AzureOpenAI(options);
O ponto de extremidade do recurso OpenAI do Azure pode ser especificado definindo a opção endpoint
, mas também pode ser carregado pelo cliente da variável de ambienteAZURE_OPENAI_ENDPOINT
. Essa é a maneira recomendada de definir o ponto de extremidade porque permite que o cliente seja usado em ambientes diferentes sem alterar o código e também proteger o ponto de extremidade de ser exposto no código.
A versão da API é necessária para ser especificada, isso é necessário para garantir que o código existente não interrompa entre as versões de API de visualização. Consulte a documentação de controle de versão da API para saber mais sobre as versões da API do OpenAI do Azure. Além disso, a propriedade deployment
não é necessária, mas é recomendável que seja definida. Uma vez que definimos deployment
, ele é usado como a implantação padrão para todas as operações que exigem isso. Se o cliente não for criado com a opção deployment
, a propriedade model
no objeto de opções deverá ser definida com o nome da implantação. No entanto, operações de áudio, como audio.transcriptions.create
exigir que o cliente seja criado com a opção deployment
definida como o nome da implantação.
Diferenças de API
Há diferenças importantes entre os clientes OpenAIClient
e AssistantsClient
e o cliente AzureOpenAI
:
- As operações são representadas como uma lista simples de métodos em
OpenAIClient
eAssistantsClient
, por exemploclient.getChatCompletions
. EmAzureOpenAI
, as operações são agrupadas em grupos aninhados, por exemploclient.chat.completions.create
. OpenAIClient
eAssistantsClient
renomeiam muitos dos nomes usados na API OpenAI do Azure. Por exemplo, o caso snake é usado na API, mas o caso camel é usado no cliente. EmAzureOpenAI
, os nomes são mantidos da mesma forma que na API openai do Azure.
Exemplos de migração
As seções a seguir fornecem exemplos de como migrar de OpenAIClient
e AssistantsClient
para AzureOpenAI
.
Preenchimentos de chat
const result = await client.chat.completions.create({ messages, model: '', max_tokens: 100 });
Observe o seguinte:
- O método
getChatCompletions
foi substituído pelo métodochat.completions.create
. - O parâmetro
messages
agora é passado no objeto opções com a propriedademessages
. - A propriedade
maxTokens
foi renomeada comomax_tokens
e o parâmetrodeploymentName
foi removido. Geralmente, os nomes das propriedades no objetooptions
são os mesmos da API OpenAI do Azure, seguindo a convenção snake_case em vez da convenção camelCase usada noAssistantsClient
. Isso é verdadeiro para todas as propriedades em todas as solicitações e respostas no clienteAzureOpenAI
. - O parâmetro
deploymentName
não será necessário se o cliente tiver sido criado com a opçãodeployment
. Se o cliente não tiver sido criado com a opçãodeployment
, a propriedademodel
no objeto option deverá ser definida com o nome da implantação.
Conclusões de chat de streaming
const stream = await client.chat.completions.create({ model: '', messages, max_tokens: 100, stream: true });
Azure nos seus dados
import "@azure/openai/types";
const azureSearchEndpoint = "Your Azure Search resource endpoint";
const azureSearchIndexName = "Your Azure Search index name";
const result = await client.chat.completions.create({ model: '', messages, data_sources: [{
type: "azure_search",
parameters: {
endpoint: azureSearchEndpoint,
index_name: azureSearchIndexName,
authentication: {
type: "system_assigned_managed_identity",
}
}
}]
});
"@azure/openai/types"
é importado, o que adiciona definições específicas do Azure (por exemplo,data_sources
) aos tipos de cliente.- A propriedade
azureExtensionOptions
foi substituída pela propriedade internadata_sources
. - A
parameters
propriedade foi adicionada para encapsular os parâmetros da extensão, que espelha o esquema da API openai do Azure. - As propriedades do caso camel foram substituídas por propriedades de casos de cobra.
Transcrição de áudio
import { createReadStream } from "fs";
const result = await client.audio.transcriptions.create({
model: '',
file: createReadStream(audioFilePath),
});
- O método
getAudioTranscription
foi substituído pelo métodoaudio.transcriptions.create
. - O
AzureOpenAI
deve ser construído com a opçãodeployment
definida como o nome da implantação para usar operações de áudio, comoaudio.transcriptions.create
. - A propriedade
model
é necessária para ser definida no objeto de opções, mas seu valor não é usado na operação, portanto, fique à vontade para defini-la como qualquer valor. - A propriedade
file
aceita vários tipos, incluindoBuffer
,fs.ReadaStream
eBlob
mas, nesse exemplo, um arquivo é transmitido do disco usandofs.createReadStream
.
Tradução de áudio
import { createReadStream } from "fs";
const result = await client.audio.translations.create({
model: '',
file: createReadStream(audioFilePath),
});
- O método
getAudioTranslation
foi substituído pelo métodoaudio.translations.create
. - Todas as outras alterações são as mesmas do exemplo de transcrição de áudio.
Assistentes
Os exemplos a seguir mostram como migrar alguns dos métodos AssistantsClient
.
Criação do Assistente
const options = ...;
const assistantResponse = await assistantsClient.beta.assistants.create(
options
);
- O método
createAssistant
foi substituído pelo métodobeta.assistants.create
Criação de Thread
O exemplo a seguir mostra como migrar a chamada de método createThread
.
const assistantThread = await assistantsClient.beta.threads.create();
- O método
createThread
foi substituído pelo métodobeta.threads.create
Criação de Mensagem
O exemplo a seguir mostra como migrar a chamada de método createMessage
.
const threadResponse = await assistantsClient.beta.threads.messages.create(
assistantThread.id,
{
role,
content: message,
}
);
- O método
createMessage
foi substituído pelo métodobeta.threads.messages.create
. - A especificação da mensagem foi movida de uma lista de parâmetros para um objeto.
Execuções
Para executar um assistente em um thread, o método createRun
é usado para criar uma execução e, em seguida, um loop é usado para sondar o status de execução até que ele esteja em um estado terminal. O exemplo a seguir mostra como migrar a criação e a sondagem da execução.
Esse código pode ser migrado e simplificado usando o método createAndPoll
, que cria uma execução e o sonda até estar em um estado terminal.
const runResponse = await assistantsClient.beta.threads.runs.createAndPoll(
assistantThread.id,
{
assistant_id: assistantResponse.id,
},
{ pollIntervalMs: 500 }
);
- O método
createRun
foi substituído pelos métodosbeta.threads.runs.create
ecreateAndPoll
. - O método
createAndPoll
é usado para criar uma execução e sondar até que ele esteja em um estado terminal.
Resultados da Execução de Processamento
As páginas podem ser executadas em loop usando o loop for await
.
for await (const runMessageDatum of runMessages) {
for (const item of runMessageDatum.content) {
...
}
}
Inserções
O exemplo a seguir mostra como migrar a chamada de método getEmbeddings
.
const embeddings = await client.embeddings.create({ input, model: '' });
- O método
getEmbeddings
foi substituído pelo métodoembeddings.create
. - O parâmetro
input
agora é passado no objeto opções com a propriedadeinput
. - O parâmetro
deploymentName
foi removido. O parâmetrodeploymentName
não será necessário se o cliente tiver sido criado com a opçãodeployment
. Se o cliente não tiver sido criado com a opçãodeployment
, a propriedademodel
no objeto option deverá ser definida com o nome da implantação.
Geração de imagem
O exemplo a seguir mostra como migrar a chamada de método getImages
.
const results = await client.images.generate({ prompt, model: '', n, size });
- O método
getImages
foi substituído pelo métodoimages.generate
. - O parâmetro
prompt
agora é passado no objeto opções com a propriedadeprompt
. - O parâmetro
deploymentName
foi removido. O parâmetrodeploymentName
não será necessário se o cliente tiver sido criado com a opçãodeployment
. Se o cliente não tiver sido criado com a opçãodeployment
, a propriedademodel
no objeto option deverá ser definida com o nome da implantação.
Filtro de conteúdo
Os resultados do filtro de conteúdo fazem parte dos tipos de resposta de conclusões de chat em OpenAIClient
. No entanto, AzureOpenAI
não tem um equivalente direto à propriedade contentFilterResults
na interface ChatCompletion.Choice
. Os resultados do filtro de conteúdo podem ser acessados importando "@azure/openai/types"
e acessando a propriedadecontent_filter_results
. O exemplo a seguir mostra como acessar os resultados do filtro de conteúdo.
import "@azure/openai/types";
const result = await client.chat.completions.create({ model: '', messages });
for (const choice of results.choices) {
const filterResults = choice.content_filter_results;
if (!filterResults) {
console.log("No content filter is found");
return;
}
if (filterResults.error) {
console.log(
`Content filter ran into the error ${filterResults.error.code}: ${filterResults.error.message}`);
}
const { hate, sexual, self_harm, violence } = filterResults;
...
}
- As propriedades do caso camel foram substituídas por propriedades de casos de cobra.
"@azure/openai/types"
é importado, o que adiciona definições específicas do Azure (por exemplo, content_filter_results) aos tipos de cliente, consulte a seção deTipos do Azure para obter mais informações.
Comparando Tipos
A tabela a seguir explora vários nomes de tipo de @azure/openai
e mostra seu openai
equivalente mais próximo. As diferenças de nomes ilustram várias das alterações mencionadas acima. Esta tabela fornece uma visão geral e mais detalhes e exemplos de código são fornecidos nas seções a seguir.
Nome do tipo antigo | Novo Tipo Mais Próximo | Tipo de Símbolo | Descrição das alterações |
---|---|---|---|
OpenAIClient |
AzureOpenAI |
Classe | Essa classe substitui a primeira e não tem métodos em comum com ela. Consulte a seção no AzureOpenAI abaixo. |
AudioResult |
Transcription /Transcription |
Interfase | Dependendo da operação de chamada, as duas interfaces substituem a anterior |
AudioResultFormat |
tipo de união embutida da propriedade response_format |
Apelido | Não existe |
AudioResultSimpleJson |
Transcription /Transcription |
Interfase | Dependendo da operação de chamada, as duas interfaces substituem a anterior |
AudioResultVerboseJson |
N/D | Interfase | |
AudioSegment |
N/D | Interfase | |
AudioTranscriptionTask |
N/D | Apelido | |
AzureChatEnhancementConfiguration , AzureChatEnhancements , AzureChatExtensionConfiguration , AzureChatExtensionConfigurationUnion , AzureChatExtensionDataSourceResponseCitation , AzureChatExtensionsMessageContext , AzureChatExtensionType , AzureChatGroundingEnhancementConfiguration , AzureChatOCREnhancementConfiguration , AzureCosmosDBChatExtensionConfiguration , AzureCosmosDBFieldMappingOptions , AzureExtensionsOptions , AzureGroundingEnhancement , AzureGroundingEnhancementCoordinatePoint , AzureGroundingEnhancementLine , AzureGroundingEnhancementLineSpan , AzureMachineLearningIndexChatExtensionConfiguration , AzureSearchChatExtensionConfiguration , AzureSearchIndexFieldMappingOptions , AzureSearchQueryType , ContentFilterBlocklistIdResult , ContentFilterCitedDetectionResult , ContentFilterDetectionResult , ContentFilterErrorResults , ContentFilterResult , ContentFilterResultDetailsForPrompt , ContentFilterResultsForChoice , ContentFilterSeverity , ContentFilterResultsForPrompt , ContentFilterSuccessResultDetailsForPrompt , ContentFilterSuccessResultsForChoice , ElasticsearchChatExtensionConfiguration , ElasticsearchIndexFieldMappingOptions , ElasticsearchQueryType , ImageGenerationContentFilterResults , ImageGenerationPromptFilterResults , OnYourDataAccessTokenAuthenticationOptions , OnYourDataApiKeyAuthenticationOptions , OnYourDataAuthenticationOptions , OnYourDataAuthenticationOptionsUnion , OnYourDataConnectionStringAuthenticationOptions , OnYourDataDeploymentNameVectorizationSource , OnYourDataEncodedApiKeyAuthenticationOptions , OnYourDataEndpointVectorizationSource , OnYourDataKeyAndKeyIdAuthenticationOptions , OnYourDataModelIdVectorizationSource , OnYourDataSystemAssignedManagedIdentityAuthenticationOptions , OnYourDataUserAssignedManagedIdentityAuthenticationOptions , OnYourDataVectorizationSource , OnYourDataVectorizationSourceType , OnYourDataVectorizationSourceUnion , PineconeChatExtensionConfiguration , PineconeFieldMappingOptions |
N/D | Interfaces e Aliases | Consulte a seção Tipos do Azure abaixo |
AzureKeyCredential |
N/D | Classe | A chave de API pode ser fornecida como um valor de cadeia de caracteres |
ChatChoice |
ChatCompletion.Choice |
Interfase | |
ChatChoiceLogProbabilityInfo |
Logprobs |
Interfase | |
ChatCompletions |
ChatCompletion e ChatCompletionChunk |
Interfase | |
ChatCompletionsFunctionToolCall |
ChatCompletionMessageToolCall |
Interfase | |
ChatRequestFunctionMessage |
ChatCompletionFunctionMessageParam |
Interfase | |
ChatRequestMessage |
ChatCompletionMessageParam |
Interfase | |
ChatRequestMessageUnion |
ChatCompletionMessageParam |
||
ChatRequestSystemMessage |
ChatCompletionSystemMessageParam |
Interfase | |
ChatRequestToolMessage |
ChatCompletionToolMessageParam |
Interfase | |
ChatRequestUserMessage |
ChatCompletionUserMessageParam |
Interfase | |
ChatResponseMessage |
Delta / ChatCompletionMessage |
Interfase | |
ChatRole |
N/D | Apelido | |
ChatTokenLogProbabilityInfo |
TopLogprob |
Interfase | |
ChatTokenLogProbabilityResult |
ChatCompletionTokenLogprob |
Interfase | |
Choice |
Choice |
Interfase | |
Completions |
Completion |
Interfase | |
CompletionsFinishReason |
N/D | Apelido | |
CompletionsLogProbabilityModel |
Logprobs |
Interfase | |
CompletionsUsage |
CompletionUsage |
Interfase | |
EmbeddingItem |
Embedding |
Interfase | |
Embeddings |
CreateEmbeddingResponse |
Interfase | |
EmbeddingsUsage |
CreateEmbeddingResponse.Usage |
Interfase | |
EventStream |
Stream |
Interfase | |
FunctionCall |
FunctionCall |
Interfase | |
FunctionCallPreset |
N/D | Apelido | |
FunctionDefinition |
Function |
Interfase | |
FunctionName |
N/D | Apelido | |
GetAudioTranscriptionOptions |
TranscriptionCreateParams |
Interfase | |
GetAudioTranslationOptions |
TranslationCreateParams |
Interfase | |
GetChatCompletionsOptions |
ChatCompletionCreateParamsNonStreaming e ChatCompletionCreateParamsStreaming |
Interfase | |
GetCompletionsOptions |
CompletionCreateParams |
Interfase | |
GetEmbeddingsOptions |
EmbeddingCreateParams |
Interfase | |
GetImagesOptions |
ImageGenerateParams |
Interfase | |
ImageGenerationData |
Image |
Interfase | |
ImageGenerationQuality |
N/D | Apelido | |
ImageGenerationResponseFormat |
N/D | Apelido | |
ImageGenerations |
ImagesResponse |
Interfase | |
ImageGenerationStyle |
N/D | Apelido | |
ImageSize |
N/D | Apelido | |
MaxTokensFinishDetails |
N/D | Interfase | |
OpenAIClientOptions |
AzureClientOptions |
Interfase | |
OpenAIError |
OpenAIError |
Interfase | |
OpenAIKeyCredential |
N/D | Classe | |
StopFinishDetails |
N/D | Interfase |
Tipos do Azure
AzureOpenAI
conecta-se ao Azure OpenAI e pode chamar todas as operações disponíveis no serviço. No entanto, os tipos de solicitações e respostas são herdados e OpenAI
ainda não são atualizados para refletir os recursos adicionais compatíveis exclusivamente com o serviço OpenAI do Azure. Os usuários do TypeScript precisarão importar "@azure/openai/types"
de @azure/openai@2.0.0-beta.1
o que irá mesclar definições específicas do Azure em tipos existentes. Os exemplos na seção Exemplos de Migração mostram como fazer isso.