Migration vers la bibliothèque d’API Python OpenAI 1.x
OpenAI a publié une nouvelle version de la bibliothèque d’API Python d’OpenAI. Ce guide complète le guide de migration d’OpenAI et vous permet de vous mettre à jour sur les changements spécifiques à Azure OpenAI.
Mises à jour
- Il s’agit d’une nouvelle version de la bibliothèque d’API Python OpenAI.
- À compter du 6 novembre 2023,
pip install openai
etpip install openai --upgrade
installent laversion 1.x
de la bibliothèque Python OpenAI. - La mise à niveau de
version 0.28.1
versversion 1.x
est un changement cassant, c’est pourquoi vous devrez tester et mettre à jour votre code. - Nouvelle tentative automatique avec interruption en cas d’erreur
- Types appropriés (pour mypy/pyright/éditeurs)
- Vous pouvez maintenant instancier un client au lieu d’utiliser une instanciation globale par défaut.
- Passage à une instanciation client explicite
- Changements de noms
Problèmes connus
DALL-E3
est entièrement pris en charge avec la dernière version 1.x.DALL-E2
peut être utilisé avec la version 1.x en effectuant les modifications suivantes dans votre code.embeddings_utils.py
qui était utilisé pour fournir des fonctionnalités telles que la similarité cosinus pour la recherche de texte sémantique ne fait plus partie de la bibliothèque d’API Python OpenAI.- Vous devez également vérifier les Problèmes GitHub actifs concernant la bibliothèque Python OpenAI.
Tester avant de migrer
Important
La migration automatique de votre code en utilisant openai migrate
n’est pas prise en charge avec Azure OpenAI.
Étant donné qu’il s’agit d’une nouvelle version de la bibliothèque avec des changements cassants, vous devez tester intégralement votre code par rapport à la nouvelle version avant de migrer des applications de production qui s’appuient sur la version 1.x. Vous devez également vérifier votre code et vos processus internes pour veiller à suivre les bonnes pratiques et à épingler votre code de production aux seules versions que vous avez entièrement testées.
Pour faciliter le processus de migration, nous mettons à jour les exemples de code existants dans nos documentations pour Python avec une expérience à plusieurs onglets :
pip install openai --upgrade
Cela permet d’avoir un contexte sur ce qui a changé et de tester la nouvelle bibliothèque en parallèle tout en continuant à fournir une prise en charge de la version 0.28.1
. Si vous passez à la version 1.x
et que vous vous rendez compte que vous devez temporairement rétablir la version précédente, vous pouvez toujours utiliser pip uninstall openai
, puis réinstaller en ciblant la version 0.28.1
avec pip install openai==0.28.1
.
Complétions de conversation
Vous devez définir la variable model
sur le nom de déploiement que vous avez choisi quand vous avez déployé les modèles GPT-3.5-Turbo ou GPT-4. L’entrée du nom du modèle entraîne une erreur, sauf si vous avez choisi un nom de déploiement identique au nom du modèle sous-jacent.
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 AI services support this too?"}
]
)
print(response.choices[0].message.content)
Vous trouverez des exemples supplémentaires dans notre article détaillé sur la complétion de conversation.
Saisies semi-automatiques
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)
Incorporations
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))
Vous trouverez d’autres exemples, notamment comment gérer la recherche de texte sémantique sans embeddings_utils.py
, dans notre tutoriel sur les incorporations.
Asynchrone
OpenAI ne prend pas en charge l’appel de méthodes asynchrones dans le client au niveau du module. Vous devez instancier un client asynchrone à la place.
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())
Authentification
from azure.identity import DefaultAzureCredential, get_bearer_token_provider
from openai import AzureOpenAI
token_provider = get_bearer_token_provider(DefaultAzureCredential(), "https://cognitiveservices.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))
Utiliser vos données
Pour connaître les étapes de configuration complètes requises pour que ces exemples de code fonctionnent, consultez utiliser le guide de démarrage rapide de vos données.
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))
Correctif DALL-E
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)
Changements de noms
Remarque
Toutes les méthodes a* ont été supprimées. Le client asynchrone doit être utilisé à la place.
Python OpenAI 0.28.1 | Python OpenAI 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 |
Supprimé
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
(OpenAI utilise maintenanthttpx
)openai.aiosession
(OpenAI utilise maintenanthttpx
)openai.Deployment
(précédemment utilisé pour Azure OpenAI)openai.Engine
openai.File.find_matching_files()