Skip to content

Commit

Permalink
samples hero scenarios (#16936)
Browse files Browse the repository at this point in the history
* [samples] added 'batch_translation_async' sample

* [samples] added 'batch_translation_with_storage_async' sample

* [samples] added remianing async samples

* [samples] update file names

* [samples] added self to instance methods

* [samples][async] fix import textanalytics :)

* [samples] fix self. when calling instance methods

* [samples] fixed async check status to use AsyncItemPaged used in Async Client

* [samples] async -> some async operations instead of sync ones

* [samples][async] use async blob operations

* [samples][async] blob download async

* [samples][async] check_documents async

* [samples][async] added some missing await methods

* [async samples] change await time to recommended period

* [samples] updated async samples to comply with new changes
  • Loading branch information
Mohamed Shaban authored Mar 3, 2021
1 parent b972486 commit 28aabfb
Show file tree
Hide file tree
Showing 10 changed files with 582 additions and 7 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,113 @@
# coding=utf-8
# ------------------------------------
# Copyright (c) Microsoft Corporation.
# Licensed under the MIT License.
# ------------------------------------

import os
import asyncio


class BatchTranslationSampleAsync(object):

async def batch_translation_async(self):
# import libraries
from azure.core.credentials import AzureKeyCredential
from azure.ai.documenttranslation.aio import DocumentTranslationClient
from azure.ai.documenttranslation import (
BatchDocumentInput,
StorageTarget
)

# get service secrets
endpoint = os.environ["AZURE_DOCUMENT_TRANSLATION_ENDPOINT"]
key = os.environ["AZURE_DOCUMENT_TRANSLATION_KEY"]
source_container_url_en = os.environ["AZURE_SOURCE_CONTAINER_URL_EN"]
source_container_url_de = os.environ["AZURE_SOURCE_CONTAINER_URL_DE"]
target_container_url_es = os.environ["AZURE_TARGET_CONTAINER_URL_ES"]
target_container_url_fr = os.environ["AZURE_TARGET_CONTAINER_URL_FR"]

# create service client
client = DocumentTranslationClient(endpoint, AzureKeyCredential(key))

# prepare translation job input
batch = [
BatchDocumentInput(
source_url=source_container_url_en,
targets=[
StorageTarget(
target_url=target_container_url_es,
language="es"
),
StorageTarget(
target_url=target_container_url_fr,
language="fr"
)
]
),
BatchDocumentInput(
source_url=source_container_url_de,
targets=[
StorageTarget(
target_url=target_container_url_es,
language="es"
),
StorageTarget(
target_url=target_container_url_fr,
language="fr"
)
]
)
]

# run translation job
async with client:
job_detail = await client.create_translation_job(batch) # type: JobStatusDetail

print("Job initial status: {}".format(job_detail.status))
print("Number of translations on documents: {}".format(job_detail.documents_total_count))

# get job result
job_result = await client.wait_until_done(job_detail.id) # type: JobStatusDetail
if job_result.status == "Succeeded":
print("We translated our documents!")
if job_result.documents_failed_count > 0:
await self.check_documents(client, job_result.id)

elif job_result.status in ["Failed", "ValidationFailed"]:
if job_result.error:
print("Translation job failed: {}: {}".format(job_result.error.code, job_result.error.message))
await self.check_documents(client, job_result.id)
exit(1)


async def check_documents(self, client, job_id):
from azure.core.exceptions import ResourceNotFoundError

try:
doc_statuses = client.list_documents_statuses(job_id) # type: AsyncItemPaged[DocumentStatusDetail]
except ResourceNotFoundError as err:
print("Failed to process any documents in source/target container due to insufficient permissions.")
raise err

docs_to_retry = []
async for document in doc_statuses:
if document.status == "Failed":
print("Document at {} failed to be translated to {} language".format(
document.url, document.translate_to
))
print("Document ID: {}, Error Code: {}, Message: {}".format(
document.id, document.error.code, document.error.message
))
if document.url not in docs_to_retry:
docs_to_retry.append(document.url)


async def main():
sample = BatchTranslationSampleAsync()
await sample.batch_translation_async()


if __name__ == '__main__':
loop = asyncio.get_event_loop()
loop.run_until_complete(main())
Original file line number Diff line number Diff line change
@@ -0,0 +1,142 @@
# coding=utf-8
# ------------------------------------
# Copyright (c) Microsoft Corporation.
# Licensed under the MIT License.
# ------------------------------------

import os
import asyncio


class BatchTranslationWithStorageSampleAsync(object):

async def batch_translation_with_storage_async(self):
# import libraries
from azure.core.credentials import AzureKeyCredential
from azure.ai.documenttranslation.aio import DocumentTranslationClient
from azure.ai.documenttranslation import (
BatchDocumentInput,
StorageTarget
)
from azure.storage.blob.aio import ContainerClient
from azure.storage.blob import (
generate_container_sas,
ContainerSasPermissions
)

# get service secrets
endpoint = os.environ["AZURE_DOCUMENT_TRANSLATION_ENDPOINT"]
key = os.environ["AZURE_DOCUMENT_TRANSLATION_KEY"]
source_storage_endpoint = os.environ["AZURE_STORAGE_SOURCE_ENDPOINT"]
source_storage_account_name = os.environ["AZURE_STORAGE_SOURCE_ACCOUNT_NAME"]
source_storage_container_name = os.environ["AZURE_STORAGE_SOURCE_CONTAINER_NAME"]
source_storage_key = os.environ["AZURE_STORAGE_SOURCE_KEY"]
target_storage_endpoint = os.environ["AZURE_STORAGE_TARGET_ENDPOINT"]
target_storage_account_name = os.environ["AZURE_STORAGE_TARGET_ACCOUNT_NAME"]
target_storage_container_name = os.environ["AZURE_STORAGE_TARGET_CONTAINER_NAME"]
target_storage_key = os.environ["AZURE_STORAGE_TARGET_KEY"]

# create service clients
translation_client = DocumentTranslationClient(
endpoint, AzureKeyCredential(key)
)

container_client = ContainerClient(
source_storage_endpoint,
container_name=source_storage_container_name,
credential=source_storage_key
)

# upload some document for translation
with open("document.txt", "rb") as doc:
await container_client.upload_blob(name="document.txt", data=doc)

# prepare translation job input
source_container_sas = generate_container_sas(
account_name=source_storage_account_name,
container_name=source_storage_container_name,
account_key=source_storage_key,
permission=ContainerSasPermissions.from_string("rl")
)

target_container_sas = generate_container_sas(
account_name=target_storage_account_name,
container_name=target_storage_container_name,
account_key=target_storage_key,
permission=ContainerSasPermissions.from_string("rlwd")
)

source_container_url = source_storage_endpoint + "/" + source_storage_container_name + "?" + source_container_sas
target_container_url = target_storage_endpoint + "/" + target_storage_container_name + "?" + target_container_sas

batch = [
BatchDocumentInput(
source_url=source_container_url,
targets=[
StorageTarget(
target_url=target_container_url,
language="es"
)
],
prefix="document"
)
]

# run job
async with translation_client:
job_detail = await translation_client.create_translation_job(batch)
job_result = await translation_client.wait_until_done(job_detail.id)

# poll status result
if job_result.status == "Succeeded":
print("We translated our documents!")
if job_result.documents_failed_count > 0:
await self.check_documents(translation_client, job_result.id)

elif job_result.status in ["Failed", "ValidationFailed"]:
if job_result.error:
print("Translation job failed: {}: {}".format(job_result.error.code, job_result.error.message))
await self.check_documents(translation_client, job_result.id)
exit(1)

# store result documents
container_client = ContainerClient(
target_storage_endpoint,
container_name=target_storage_container_name,
credential=target_storage_key
)

with open("translated.txt", "wb") as my_blob:
download_stream = await container_client.download_blob("document.txt")
my_blob.write(await download_stream.readall())


async def check_documents(self, client, job_id):
from azure.core.exceptions import ResourceNotFoundError

try:
doc_statuses = client.list_documents_statuses(job_id) # type: AsyncItemPaged[DocumentStatusDetail]
except ResourceNotFoundError as err:
print("Failed to process any documents in source/target container due to insufficient permissions.")
raise err

docs_to_retry = []
async for document in doc_statuses:
if document.status == "Failed":
print("Document at {} failed to be translated to {} language".format(
document.url, document.translate_to
))
print("Document ID: {}, Error Code: {}, Message: {}".format(
document.id, document.error.code, document.error.message
))
if document.url not in docs_to_retry:
docs_to_retry.append(document.url)

async def main():
sample = BatchTranslationWithStorageSampleAsync()
await sample.batch_translation_with_storage_async()


if __name__ == '__main__':
loop = asyncio.get_event_loop()
loop.run_until_complete(main())
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
# coding=utf-8
# ------------------------------------
# Copyright (c) Microsoft Corporation.
# Licensed under the MIT License.
# ------------------------------------

import os
import asyncio

class CancelTranslationJobSampleAsync(object):

async def cancel_translation_job_async(self):
# import libraries
from azure.core.credentials import AzureKeyCredential
from azure.ai.documenttranslation.aio import DocumentTranslationClient
from azure.ai.documenttranslation import (
BatchDocumentInput,
StorageTarget
)

# get service secrets
endpoint = os.environ["AZURE_DOCUMENT_TRANSLATION_ENDPOINT"]
key = os.environ["AZURE_DOCUMENT_TRANSLATION_KEY"]
source_container_url = os.environ["AZURE_SOURCE_CONTAINER_URL"]
target_container_url_es = os.environ["AZURE_TARGET_CONTAINER_URL_ES"]

# prepare translation job input
batch = [
BatchDocumentInput(
source_url=source_container_url,
targets=[
StorageTarget(
target_url=target_container_url_es,
language="es"
)
],
storage_type="file"
)
]

# create translation client
client = DocumentTranslationClient(endpoint, AzureKeyCredential(key))

# run job
async with client:
job_detail = await client.create_translation_job(batch)

print("Job initial status: {}".format(job_detail.status))
print("Number of translations on documents: {}".format(job_detail.documents_total_count))

await client.cancel_job(job_detail.id)
job_detail = await client.get_job_status(job_detail.id) # type: JobStatusDetail

if job_detail.status in ["Cancelled", "Cancelling"]:
print("We cancelled job with ID: {}".format(job_detail.id))


async def main():
sample = CancelTranslationJobSampleAsync()
await sample.cancel_translation_job_async()


if __name__ == '__main__':
loop = asyncio.get_event_loop()
loop.run_until_complete(main())


Loading

0 comments on commit 28aabfb

Please sign in to comment.