diff --git a/sdk/documenttranslation/azure-ai-documenttranslation/samples/async_samples/sample_batch_translation_async.py b/sdk/documenttranslation/azure-ai-documenttranslation/samples/async_samples/sample_batch_translation_async.py new file mode 100644 index 000000000000..5e9897646319 --- /dev/null +++ b/sdk/documenttranslation/azure-ai-documenttranslation/samples/async_samples/sample_batch_translation_async.py @@ -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()) diff --git a/sdk/documenttranslation/azure-ai-documenttranslation/samples/async_samples/sample_batch_translation_with_storage_async.py b/sdk/documenttranslation/azure-ai-documenttranslation/samples/async_samples/sample_batch_translation_with_storage_async.py new file mode 100644 index 000000000000..fa8af0255101 --- /dev/null +++ b/sdk/documenttranslation/azure-ai-documenttranslation/samples/async_samples/sample_batch_translation_with_storage_async.py @@ -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()) diff --git a/sdk/documenttranslation/azure-ai-documenttranslation/samples/async_samples/sample_cancel_translation_job_async.py b/sdk/documenttranslation/azure-ai-documenttranslation/samples/async_samples/sample_cancel_translation_job_async.py new file mode 100644 index 000000000000..2cb61c61e33d --- /dev/null +++ b/sdk/documenttranslation/azure-ai-documenttranslation/samples/async_samples/sample_cancel_translation_job_async.py @@ -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()) + + diff --git a/sdk/documenttranslation/azure-ai-documenttranslation/samples/async_samples/sample_custom_translation_async.py b/sdk/documenttranslation/azure-ai-documenttranslation/samples/async_samples/sample_custom_translation_async.py new file mode 100644 index 000000000000..6d0ec8d2d815 --- /dev/null +++ b/sdk/documenttranslation/azure-ai-documenttranslation/samples/async_samples/sample_custom_translation_async.py @@ -0,0 +1,96 @@ +# coding=utf-8 +# ------------------------------------ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. +# ------------------------------------ + +import os +import asyncio + +class CustomTranslationSampleAsync(object): + + async def custom_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 = os.environ["AZURE_SOURCE_CONTAINER_URL"] + target_container_url_fr = os.environ["AZURE_TARGET_CONTAINER_URL_FR"] + category_id = os.environ["AZURE_DOCUMENT_TRANSLATION_MODEL_ID"] + + # prepare translation job input + batch = [ + BatchDocumentInput( + source_url=source_container_url, + targets=[ + StorageTarget( + target_url=target_container_url_fr, + language="fr", + category_id=category_id, + glossaries=["https://exampleglossary"] + ) + ], + prefix="document_2021" + ) + ] + + # create translation client + client = DocumentTranslationClient(endpoint, AzureKeyCredential(key)) + + # run translation 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)) + + 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 = CustomTranslationSampleAsync() + await sample.custom_translation_async() + + +if __name__ == '__main__': + loop = asyncio.get_event_loop() + loop.run_until_complete(main()) \ No newline at end of file diff --git a/sdk/documenttranslation/azure-ai-documenttranslation/samples/async_samples/sample_list_all_submitted_jobs_async.py b/sdk/documenttranslation/azure-ai-documenttranslation/samples/async_samples/sample_list_all_submitted_jobs_async.py new file mode 100644 index 000000000000..ecb983cfe869 --- /dev/null +++ b/sdk/documenttranslation/azure-ai-documenttranslation/samples/async_samples/sample_list_all_submitted_jobs_async.py @@ -0,0 +1,54 @@ +# coding=utf-8 +# ------------------------------------ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. +# ------------------------------------ + +import os +import asyncio + +class ListAllSubmittedJobsSampleAsync(object): + + def list_all_submitted_jobs(self): + # import libraries + from azure.core.credentials import AzureKeyCredential + from azure.ai.documenttranslation.aio import DocumentTranslationClient + + # get service secrets + endpoint = os.environ["AZURE_DOCUMENT_TRANSLATION_ENDPOINT"] + key = os.environ["AZURE_DOCUMENT_TRANSLATION_KEY"] + + # create translation client + client = DocumentTranslationClient(endpoint, AzureKeyCredential(key)) + + # list submitted jobs + jobs = client.list_submitted_jobs() # type: AsyncItemPaged[JobStatusDetail] + + async for job in jobs: + # wait for job to finish + if job.status in ["NotStarted", "Running"]: + job = client.wait_until_done(job.id) + + print("Job ID: {}".format(job.id)) + print("Job status: {}".format(job.status)) + print("Job created on: {}".format(job.created_on)) + print("Job last updated on: {}".format(job.last_updated_on)) + print("Total number of translations on documents: {}".format(job.documents_total_count)) + print("Total number of characters charged: {}".format(job.total_characters_charged)) + + print("Of total documents...") + print("{} failed".format(job.documents_failed_count)) + print("{} succeeded".format(job.documents_succeeded_count)) + print("{} in progress".format(job.documents_in_progress_count)) + print("{} not yet started".format(job.documents_not_yet_started_count)) + print("{} cancelled".format(job.documents_cancelled_count)) + + +async def main(): + sample = ListAllSubmittedJobsSampleAsync() + await sample.list_all_submitted_jobs() + + +if __name__ == '__main__': + loop = asyncio.get_event_loop() + loop.run_until_complete(main()) \ No newline at end of file diff --git a/sdk/documenttranslation/azure-ai-documenttranslation/samples/async_samples/sample_translation_status_checks_async.py b/sdk/documenttranslation/azure-ai-documenttranslation/samples/async_samples/sample_translation_status_checks_async.py new file mode 100644 index 000000000000..3e0dcef5b8bb --- /dev/null +++ b/sdk/documenttranslation/azure-ai-documenttranslation/samples/async_samples/sample_translation_status_checks_async.py @@ -0,0 +1,103 @@ +# coding=utf-8 +# ------------------------------------ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. +# ------------------------------------ + +import os +import asyncio +import time + +class TranslationStatusChecksSampleAsync(object): + + async def translation_status_checks_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"] + target_container_url_fr = os.environ["AZURE_TARGET_CONTAINER_URL_FR"] + + # prepare translation input + batch = [ + BatchDocumentInput( + source_url=source_container_url, + targets=[ + StorageTarget( + target_url=target_container_url_es, + language="es" + ), + StorageTarget( + target_url=target_container_url_fr, + language="fr" + ) + ], + storage_type="folder", + prefix="document_2021" + ) + ] + + # create translation client + client = DocumentTranslationClient(endpoint, AzureKeyCredential(key)) + + # run translation job + async with client: + job_detail = await client.create_translation_job(batch) + while True: + job_detail = await client.get_job_status(job_detail.id) # type: JobStatusDetail + if job_detail.status in ["NotStarted", "Running"]: + await asyncio.sleep(30) + continue + + elif job_detail.status in ["Failed", "ValidationFailed"]: + if job_detail.error: + print("Translation job failed: {}: {}".format(job_detail.error.code, job_detail.error.message)) + await self.check_documents(client, job_detail.id) + exit(1) + + elif job_detail.status == "Succeeded": + print("We translated our documents!") + if job_detail.documents_failed_count > 0: + await self.check_documents(client, job_detail.id) + break + + + 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 = TranslationStatusChecksSampleAsync() + await sample.translation_status_checks_async() + + +if __name__ == '__main__': + loop = asyncio.get_event_loop() + loop.run_until_complete(main()) \ No newline at end of file diff --git a/sdk/documenttranslation/azure-ai-documenttranslation/samples/sample_azure_storage.py b/sdk/documenttranslation/azure-ai-documenttranslation/samples/sample_batch_translation_with_storage.py similarity index 97% rename from sdk/documenttranslation/azure-ai-documenttranslation/samples/sample_azure_storage.py rename to sdk/documenttranslation/azure-ai-documenttranslation/samples/sample_batch_translation_with_storage.py index dcbb9ec80298..d0968c411378 100644 --- a/sdk/documenttranslation/azure-ai-documenttranslation/samples/sample_azure_storage.py +++ b/sdk/documenttranslation/azure-ai-documenttranslation/samples/sample_batch_translation_with_storage.py @@ -5,7 +5,7 @@ # ------------------------------------ -def batch_translation_with_storage(): +def sample_batch_translation_with_storage(): import os from azure.core.credentials import AzureKeyCredential from azure.ai.documenttranslation import ( @@ -102,7 +102,7 @@ def check_documents(client, job_id): try: doc_statuses = client.list_documents_statuses(job_id) # type: ItemPaged[DocumentStatusDetail] except ResourceNotFoundError as err: - print("Failed to process any documents in source/target container.") + print("Failed to process any documents in source/target container due to insufficient permissions.") raise err docs_to_retry = [] @@ -119,4 +119,4 @@ def check_documents(client, job_id): if __name__ == '__main__': - batch_translation_with_storage() + sample_batch_translation_with_storage() diff --git a/sdk/documenttranslation/azure-ai-documenttranslation/samples/sample_cancel_translation_job.py b/sdk/documenttranslation/azure-ai-documenttranslation/samples/sample_cancel_translation_job.py index 619ada01740d..4ed96a711b31 100644 --- a/sdk/documenttranslation/azure-ai-documenttranslation/samples/sample_cancel_translation_job.py +++ b/sdk/documenttranslation/azure-ai-documenttranslation/samples/sample_cancel_translation_job.py @@ -5,7 +5,7 @@ # ------------------------------------ -def sample_cancel_job(): +def sample_cancel_translation_job(): import os from azure.core.credentials import AzureKeyCredential from azure.ai.documenttranslation import ( @@ -47,4 +47,4 @@ def sample_cancel_job(): if __name__ == '__main__': - sample_cancel_job() + sample_cancel_translation_job() diff --git a/sdk/documenttranslation/azure-ai-documenttranslation/samples/sample_list_batches.py b/sdk/documenttranslation/azure-ai-documenttranslation/samples/sample_list_all_submitted_jobs.py similarity index 95% rename from sdk/documenttranslation/azure-ai-documenttranslation/samples/sample_list_batches.py rename to sdk/documenttranslation/azure-ai-documenttranslation/samples/sample_list_all_submitted_jobs.py index 2961b9516301..d80d3de8a52d 100644 --- a/sdk/documenttranslation/azure-ai-documenttranslation/samples/sample_list_batches.py +++ b/sdk/documenttranslation/azure-ai-documenttranslation/samples/sample_list_all_submitted_jobs.py @@ -5,7 +5,7 @@ # ------------------------------------ -def sample_list_all_jobs(): +def sample_list_all_submitted_jobs(): import os from azure.core.credentials import AzureKeyCredential from azure.ai.documenttranslation import ( @@ -38,4 +38,4 @@ def sample_list_all_jobs(): if __name__ == '__main__': - sample_list_all_jobs() + sample_list_all_submitted_jobs() diff --git a/sdk/documenttranslation/azure-ai-documenttranslation/samples/sample_check_statuses.py b/sdk/documenttranslation/azure-ai-documenttranslation/samples/sample_translation_status_checks.py similarity index 100% rename from sdk/documenttranslation/azure-ai-documenttranslation/samples/sample_check_statuses.py rename to sdk/documenttranslation/azure-ai-documenttranslation/samples/sample_translation_status_checks.py