Migrando para a biblioteca de API de Python do OpenAI 1.x (clássica)

Aplica-se somente a:Portal Foundry (clássico). Este artigo não está disponível para o novo portal do Foundry. Saiba mais sobre o novo portal.

Observação

Links neste artigo podem abrir conteúdo na nova documentação do Microsoft Foundry em vez da documentação da Foundry (clássica) que você está exibindo agora.

Importante

Para obter os exemplos de API mais recentes, consulte o artigo de ciclo de vida da API.

O OpenAI lançou uma nova versão da OpenAI Python biblioteca de API. Este guia é suplementar ao guia de migração do OpenAI e ajudará a atualizá-lo sobre as mudanças específicas para o Azure OpenAI.

Observação

Essa orientação não é mais recomendada. Para aproveitar a API v1 mais recente, consulte o guia da linguagem de programação Python.

Atualizações

  • Esta é uma nova versão da biblioteca de API de Python do OpenAI.
  • A partir de 6 de novembro de 2023, pip install openai e pip install openai --upgrade instalarão version 1.x da biblioteca de Python OpenAI.
  • Atualizar de version 0.28.1 para version 1.x é uma alteração interruptiva, então você precisará testar e atualizar seu código.
  • Tente novamente automaticamente com a retirada se houver um erro
  • Tipos adequados (para mypy/pyright/editores)
  • Agora você pode criar uma instância de um cliente, em vez de usar um padrão global.
  • Alternar para a instanciação explícita do cliente
  • Alterações de nome

Problemas conhecidos

Testar antes de migrar

Importante

Não há suporte para a migração automática do código usando openai migrate com Azure OpenAI.

Como esta é uma nova versão da biblioteca com alterações interruptivas, você deve testar seu código extensivamente em relação à nova versão antes de migrar os aplicativos de produção para depender da versão 1.x. Você também deve examinar seu código e processos internos para verificar se está seguindo as práticas recomendadas e fixando seu código de produção apenas em versões que você testou totalmente.

Para facilitar o processo de migração, estamos atualizando exemplos de código existentes na nossa documentação para Python para uma interface com abas.

pip install openai --upgrade

Isso fornece contexto para o que foi alterado e permite que você teste a nova biblioteca em paralelo, continuando a fornecer suporte para a versão 0.28.1. Se você atualizar para 1.x e perceber que precisa reverter temporariamente para a versão anterior, sempre poderá pip uninstall openai e reinstalar direcionado para 0.28.1 com pip install openai==0.28.1.

Finalizações de chat

Você precisa definir a variável model para o nome da implantação que você escolheu quando implantou os modelos do GPT-3.5-Turbo ou do GPT-4. Inserir o nome do modelo resulta em um erro, a menos que você tenha escolhido um nome de implantação idêntico ao nome do modelo subjacente.

import os
from openai import AzureOpenAI

client = AzureOpenAI(
  azure_endpoint = os.getenv("AZURE_OPENAI_ENDPOINT"), 
  api_key=os.getenv("AZURE_OPENAI_API_KEY"),  
  api_version="2024-02-01"
)

response = client.chat.completions.create(
    model="gpt-35-turbo", # model = "deployment_name"
    messages=[
        {"role": "system", "content": "You are a helpful assistant."},
        {"role": "user", "content": "Does Azure OpenAI support customer managed keys?"},
        {"role": "assistant", "content": "Yes, customer managed keys are supported by Azure OpenAI."},
        {"role": "user", "content": "Do other Azure services support this too?"}
    ]
)

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

Exemplos adicionais podem ser encontrados em nosso artigo detalhado sobre conclusão de chat.

Conclusões

import os
from openai import AzureOpenAI
    
client = AzureOpenAI(
    api_key=os.getenv("AZURE_OPENAI_API_KEY"),  
    api_version="2024-02-01",
    azure_endpoint = os.getenv("AZURE_OPENAI_ENDPOINT")
)
    
deployment_name='REPLACE_WITH_YOUR_DEPLOYMENT_NAME' #This will correspond to the custom name you chose for your deployment when you deployed a model. 
    
# Send a completion call to generate an answer
print('Sending a test completion job')
start_phrase = 'Write a tagline for an ice cream shop. '
response = client.completions.create(model=deployment_name, prompt=start_phrase, max_tokens=10) # model = "deployment_name"
print(response.choices[0].text)

Embeddings

import os
from openai import AzureOpenAI

client = AzureOpenAI(
  api_key = os.getenv("AZURE_OPENAI_API_KEY"),  
  api_version = "2024-02-01",
  azure_endpoint =os.getenv("AZURE_OPENAI_ENDPOINT") 
)

response = client.embeddings.create(
    input = "Your text string goes here",
    model= "text-embedding-ada-002"  # model = "deployment_name".
)

print(response.model_dump_json(indent=2))

Exemplos adicionais, incluindo como lidar com a pesquisa semântica de texto sem embeddings_utils.py podem ser encontrados em nosso tutorial de inserções.

Async

O OpenAI não dá suporte à chamada de métodos assíncronos no cliente no nível do módulo, em vez disso, você deve criar uma instância de um cliente assíncrono.

import os
import asyncio
from openai import AsyncAzureOpenAI

async def main():
    client = AsyncAzureOpenAI(  
      api_key = os.getenv("AZURE_OPENAI_API_KEY"),  
      api_version = "2024-02-01",
      azure_endpoint = os.getenv("AZURE_OPENAI_ENDPOINT")
    )
    response = await client.chat.completions.create(model="gpt-35-turbo", messages=[{"role": "user", "content": "Hello world"}]) # model = model deployment name

    print(response.model_dump_json(indent=2))

asyncio.run(main())

Autenticação

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

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

api_version = "2024-02-01"
endpoint = "https://my-resource.openai.azure.com"

client = AzureOpenAI(
    api_version=api_version,
    azure_endpoint=endpoint,
    azure_ad_token_provider=token_provider,
)

completion = client.chat.completions.create(
    model="deployment-name",  # model = "deployment_name"
    messages=[
        {
            "role": "user",
            "content": "How do I output all files in a directory using Python?",
        },
    ],
)
print(completion.model_dump_json(indent=2))

Usar seus dados

Para obter as etapas completas de configuração necessárias para que esses exemplos de código funcionem, consulte o uso do início rápido de seus dados.

import os
import openai
import dotenv

dotenv.load_dotenv()

endpoint = os.environ.get("AZURE_OPENAI_ENDPOINT")
api_key = os.environ.get("AZURE_OPENAI_API_KEY")
deployment = os.environ.get("AZURE_OPEN_AI_DEPLOYMENT_ID")

client = openai.AzureOpenAI(
    base_url=f"{endpoint}/openai/deployments/{deployment}/extensions",
    api_key=api_key,
    api_version="2023-08-01-preview",
)

completion = client.chat.completions.create(
    model=deployment, # model = "deployment_name"
    messages=[
        {
            "role": "user",
            "content": "How is Azure machine learning different than Azure OpenAI?",
        },
    ],
    extra_body={
        "dataSources": [
            {
                "type": "AzureCognitiveSearch",
                "parameters": {
                    "endpoint": os.environ["AZURE_AI_SEARCH_ENDPOINT"],
                    "key": os.environ["AZURE_AI_SEARCH_API_KEY"],
                    "indexName": os.environ["AZURE_AI_SEARCH_INDEX"]
                }
            }
        ]
    }
)

print(completion.model_dump_json(indent=2))

DALL-E correção

import time
import json
import httpx
import openai

class CustomHTTPTransport(httpx.HTTPTransport):
    def handle_request(
        self,
        request: httpx.Request,
    ) -> httpx.Response:
        if "images/generations" in request.url.path and request.url.params[
            "api-version"
        ] in [
            "2023-06-01-preview",
            "2023-07-01-preview",
            "2023-08-01-preview",
            "2023-09-01-preview",
            "2023-10-01-preview",
        ]:
            request.url = request.url.copy_with(path="/openai/images/generations:submit")
            response = super().handle_request(request)
            operation_location_url = response.headers["operation-location"]
            request.url = httpx.URL(operation_location_url)
            request.method = "GET"
            response = super().handle_request(request)
            response.read()

            timeout_secs: int = 120
            start_time = time.time()
            while response.json()["status"] not in ["succeeded", "failed"]:
                if time.time() - start_time > timeout_secs:
                    timeout = {"error": {"code": "Timeout", "message": "Operation polling timed out."}}
                    return httpx.Response(
                        status_code=400,
                        headers=response.headers,
                        content=json.dumps(timeout).encode("utf-8"),
                        request=request,
                    )

                time.sleep(int(response.headers.get("retry-after")) or 10)
                response = super().handle_request(request)
                response.read()

            if response.json()["status"] == "failed":
                error_data = response.json()
                return httpx.Response(
                    status_code=400,
                    headers=response.headers,
                    content=json.dumps(error_data).encode("utf-8"),
                    request=request,
                )

            result = response.json()["result"]
            return httpx.Response(
                status_code=200,
                headers=response.headers,
                content=json.dumps(result).encode("utf-8"),
                request=request,
            )
        return super().handle_request(request)

client = openai.AzureOpenAI(
    azure_endpoint="<azure_endpoint>",
    api_key="<api_key>",
    api_version="<api_version>",
    http_client=httpx.Client(
        transport=CustomHTTPTransport(),
    ),
)
image = client.images.generate(prompt="a cute baby seal")

print(image.data[0].url)

Alterações de nome

Observação

Todos os a* métodos foram removidos; em vez disso, o cliente assíncrono deve ser usado.

OpenAI Python 0.28.1 OpenAI Python 1.x
openai.api_base openai.base_url
openai.proxy openai.proxies
openai.InvalidRequestError openai.BadRequestError
openai.Audio.transcribe() client.audio.transcriptions.create()
openai.Audio.translate() client.audio.translations.create()
openai.ChatCompletion.create() client.chat.completions.create()
openai.Completion.create() client.completions.create()
openai.Edit.create() client.edits.create()
openai.Embedding.create() client.embeddings.create()
openai.File.create() client.files.create()
openai.File.list() client.files.list()
openai.File.retrieve() client.files.retrieve()
openai.File.download() client.files.retrieve_content()
openai.FineTune.cancel() client.fine_tunes.cancel()
openai.FineTune.list() client.fine_tunes.list()
openai.FineTune.list_events() client.fine_tunes.list_events()
openai.FineTune.stream_events() client.fine_tunes.list_events(stream=True)
openai.FineTune.retrieve() client.fine_tunes.retrieve()
openai.FineTune.delete() client.fine_tunes.delete()
openai.FineTune.create() client.fine_tunes.create()
openai.FineTuningJob.create() client.fine_tuning.jobs.create()
openai.FineTuningJob.cancel() client.fine_tuning.jobs.cancel()
openai.FineTuningJob.delete() client.fine_tuning.jobs.create()
openai.FineTuningJob.retrieve() client.fine_tuning.jobs.retrieve()
openai.FineTuningJob.list() client.fine_tuning.jobs.list()
openai.FineTuningJob.list_events() client.fine_tuning.jobs.list_events()
openai.Image.create() client.images.generate()
openai.Image.create_variation() client.images.create_variation()
openai.Image.create_edit() client.images.edit()
openai.Model.list() client.models.list()
openai.Model.delete() client.models.delete()
openai.Model.retrieve() client.models.retrieve()
openai.Moderation.create() client.moderations.create()
openai.api_resources openai.resources

Removed

  • openai.api_key_path
  • openai.app_info
  • openai.debug
  • openai.log
  • openai.OpenAIError
  • openai.Audio.transcribe_raw()
  • openai.Audio.translate_raw()
  • openai.ErrorObject
  • openai.Customer
  • openai.api_version
  • openai.verify_ssl_certs
  • openai.api_type
  • openai.enable_telemetry
  • openai.ca_bundle_path
  • openai.requestssession (o OpenAI agora usa httpx)
  • openai.aiosession (o OpenAI agora usa httpx)
  • openai.Deployment (usado anteriormente para Azure OpenAI)
  • openai.Engine
  • openai.File.find_matching_files()