Migrieren zur OpenAI Python-API-Bibliothek 1.x
OpenAI hat eine neue Version der OpenAI Python-API-Bibliothek veröffentlicht. Dieser Leitfaden ist ergänzend zum Migrationsleitfaden von OpenAI und hilft Ihnen, die für Azure OpenAI spezifischen Änderungen zu beschleunigen.
Updates
- Dies ist eine neue Version der OpenAI Python-API-Bibliothek.
- Ab dem 6. November 2023 installieren
pip install openai
undpip install openai --upgrade
version 1.x
der OpenAI Python-Bibliothek. - Das Upgrade von
version 0.28.1
aufversion 1.x
ist ein Breaking Change. Sie müssen Ihren Code testen und aktualisieren. - Automatische Wiederholung mit Backoff, wenn ein Fehler auftritt
- Geeignete Typen (für mypy/pyright/editors)
- Sie können jetzt einen Client instanziieren, anstatt einen globalen Standard zu verwenden.
- Wechseln zur expliziten Clientinstanziierung
- Namensänderungen
Bekannte Probleme
DALL-E3
wird mit der neuesten Version von 1.x vollständig unterstützt.DALL-E2
kann mit 1.x verwendet werden, indem Sie die folgenden Änderungen an Ihrem Code vornehmen.embeddings_utils.py
wurde verwendet, um Funktionen wie die Kosinus-Ähnlichkeit für die semantische Textsuche bereitzustellen, ist jedoch nicht mehr Teil der OpenAI Python-API-Bibliothek.- Sie sollten sich auch die aktiven GitHub-Issues für die OpenAI Python-Bibliothek ansehen.
Testen vor der Migration
Wichtig
Die automatische Migration Ihres Codes mit openai migrate
wird von Azure OpenAI nicht unterstützt.
Da es sich um eine neue Version der Bibliothek mit Breaking Changes handelt, sollten Sie den Code umfassend mit dem neuen Release testen, bevor Sie Produktionsanwendungen migrieren, die von Version 1.x abhängig wären. Sie sollten auch Ihren Code und interne Prozesse überprüfen, um sicherzustellen, dass Sie bewährte Methoden befolgen und Ihren Produktionscode nur an Versionen anheften, die Sie vollständig getestet haben.
Um den Migrationsprozess zu vereinfachen, führen wir Registerkarten für vorhandene Codebeispiele in unserer Dokumentation für Python ein:
pip install openai --upgrade
Auf diese Weise sehen Sie, was sich geändert hat, und können die neue Bibliothek parallel testen, während Version 0.28.1
weiterhin unterstützt wird. Wenn Sie ein Upgrade auf 1.x
durchführen und feststellen, dass Sie vorübergehend zur vorherigen Version zurückkehren müssen, können Sie jederzeit pip uninstall openai
verwenden und dann gezielt 0.28.1
mit pip install openai==0.28.1
neu installieren.
Chatvervollständigungen
Sie müssen die Variable model
auf den Bereitstellungsnamen festlegen, den Sie bei der Bereitstellung der GPT-3.5-Turbo- oder GPT-4-Modelle ausgewählt haben. Die Eingabe des Modellnamens führt zu einem Fehler, sofern Sie keinen Bereitstellungsnamen ausgewählt haben, der mit dem zugrunde liegenden Modellnamen identisch ist.
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)
Weitere Beispiele finden Sie in unserem ausführlichen Artikel über Chatvervollständigung.
Vervollständigungen
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)
Einbettungen
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))
Weitere Beispiele, auch für die semantische Textsuche ohne embeddings_utils.py
, finden Sie in unserem Tutorial zu Einbettungen.
Asynchron
OpenAI unterstützt das Aufrufen asynchroner Methoden im Client auf Modulebene nicht. Stattdessen sollten Sie einen asynchronen Client instanziieren.
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())
Authentifizierung
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))
Verwenden Ihrer Daten
Die vollständigen Konfigurationsschritte, die zum Ausführen dieser Codebeispiele erforderlich sind, finden Sie in der Schnellstartanleitung zur Verwendung Ihrer Daten.
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-Fix
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)
Namensänderungen
Hinweis
Alle a*-Methoden wurden entfernt. Stattdessen muss der asynchrone Client verwendet werden.
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 |
Entfernt
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 verwendet jetzthttpx
)openai.aiosession
(OpenAI verwendet jetzthttpx
)openai.Deployment
(zuvor für Azure OpenAI verwendet)openai.Engine
openai.File.find_matching_files()