Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[translation] Migrate @azure-rest/ai-translation-document to ESM/vitest #31918

Open
wants to merge 29 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
29 commits
Select commit Hold shift + click to select a range
f4ff711
Migration: Update package.json, tsconfig.json, and api-extractor.json
mpodwysocki Nov 23, 2024
6ae78f6
Migration: Update test config
mpodwysocki Nov 23, 2024
69f7445
Migration: Clean up files
mpodwysocki Nov 23, 2024
61acf0c
Migration: Apply codemod: "fixSourceFile"
mpodwysocki Nov 23, 2024
cb2d665
Migration: Apply codemod: "fixTestingImports"
mpodwysocki Nov 23, 2024
d76b0d5
Migration: Apply codemod: "replaceAssertIsRejected"
mpodwysocki Nov 23, 2024
ac29d63
Migration: Apply codemod: "replaceSinonStub"
mpodwysocki Nov 23, 2024
cee339a
Migration: Apply codemod: "addViHelper"
mpodwysocki Nov 23, 2024
c9f2499
Migration: Apply codemod: "replaceSupportTracing"
mpodwysocki Nov 23, 2024
dd1c279
Migration: Apply codemod: "replaceTestUtils"
mpodwysocki Nov 23, 2024
3b616cf
Migration: rushx format
mpodwysocki Nov 23, 2024
296d2b7
[translation] Migrate @azure-rest/ai-translation-text to ESM/vitest
mpodwysocki Nov 23, 2024
243c8da
[translation] Migrate @azure-rest/ai-translation-text to ESM/vitest
mpodwysocki Nov 23, 2024
50ae03f
[translation] Migrate @azure-rest/ai-translation-text to ESM/vitest
mpodwysocki Nov 23, 2024
951a5f9
[translation] Migrate @azure-rest/ai-translation-text to ESM/vitest
mpodwysocki Nov 25, 2024
f75f0ec
[translation] Migrate @azure-rest/ai-translation-text to ESM/vitest
mpodwysocki Nov 25, 2024
51ef3c9
Migration: Update package.json, tsconfig.json, and api-extractor.json
mpodwysocki Nov 25, 2024
4422497
Migration: Update test config
mpodwysocki Nov 25, 2024
818ba79
Migration: Clean up files
mpodwysocki Nov 25, 2024
1bac59e
Migration: Apply codemod: "fixSourceFile"
mpodwysocki Nov 25, 2024
80108aa
Migration: Apply codemod: "fixTestingImports"
mpodwysocki Nov 25, 2024
4c4f856
Migration: Apply codemod: "replaceAssertIsRejected"
mpodwysocki Nov 25, 2024
839d39f
Migration: Apply codemod: "replaceSinonStub"
mpodwysocki Nov 25, 2024
0a63583
Migration: Apply codemod: "addViHelper"
mpodwysocki Nov 25, 2024
5c28702
Migration: Apply codemod: "replaceSupportTracing"
mpodwysocki Nov 25, 2024
4928c8f
Migration: Apply codemod: "replaceTestUtils"
mpodwysocki Nov 25, 2024
41cf90b
Migration: rushx format
mpodwysocki Nov 25, 2024
912d99f
[translation] Migrate @azure-rest/ai-translation-document to ESM/vitest
mpodwysocki Nov 25, 2024
4644cf4
[translation] Migrate @azure-rest/ai-translation-document to ESM/vitest
mpodwysocki Nov 25, 2024
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
48 changes: 40 additions & 8 deletions common/config/rush/pnpm-lock.yaml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

161 changes: 87 additions & 74 deletions sdk/translation/ai-translation-document-rest/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -54,13 +54,15 @@ npm install @azure-rest/ai-translation-document
You can create Translator resource following [Create a Translator resource][translator_resource_create].

#### Setup Azure Blob Storage Account
For more information about creating an Azure Blob Storage account see [here][azure_blob_storage_account]. For creating containers for your source and target files see [here][container]. Make sure to authorize your Translation resource storage access, more info [here][storage_container_authorization].

For more information about creating an Azure Blob Storage account see [here][azure_blob_storage_account]. For creating containers for your source and target files see [here][container]. Make sure to authorize your Translation resource storage access, more info [here][storage_container_authorization].

When "Allow Storage Account Key Access" is disabled on the storage account , Managed Identity is enabled on the Translator resource and it is assigned the role "Storage Blob Data Contributor" on the storage account, then you can use the container URLs directly and no SAS URIs will be need to be generated.

### Create a `DocumentTranslationClient` using an endpoint URL and API key `KeyCredential`

Once you have the value for API key, create a credential

```typescript
const credentials = { key: apiKey ?? "" };
```
Expand Down Expand Up @@ -101,10 +103,11 @@ const response = await client.path("/document:translate").post(options);
if (isUnexpected(response)) {
throw response.body;
}
console.log('Response code: ' + response.status + ', Response body: ' + response.body);
console.log("Response code: " + response.status + ", Response body: " + response.body);
```

### Batch Document Translation

Used to execute an asynchronous batch translation request. The method requires an Azure Blob storage account with storage containers for your source and translated documents.

```typescript
Expand All @@ -118,15 +121,16 @@ const targetInput = createTargetInput(targetUrl, "fr");
const batchRequest = createBatchRequest(sourceInput, [targetInput]);

//Start translation
const batchRequests = {inputs: [batchRequest]};
const batchRequests = { inputs: [batchRequest] };
const poller = await client.path("/document/batches").post({
body: batchRequests
});
body: batchRequests,
});
const id = getTranslationOperationID(poller.headers["operation-location"]);
console.log('Translation started and the operationID is: ' + id);
console.log("Translation started and the operationID is: " + id);
```

### Cancel Document Translation

This cancels a translation job that is currently processing or queued (pending) as indicated in the request by the id query parameter. An operation isn't canceled if already completed, failed, or still canceling. In those instances, a bad request is returned. Completed translations can't be canceled and are charged.

```typescript
Expand All @@ -140,10 +144,10 @@ const targetInput = createTargetInput(targetUrl, "fr");
const batchRequest = createBatchRequest(sourceInput, [targetInput]);

//Start translation
const batchRequests = {inputs: [batchRequest]};
const batchRequests = { inputs: [batchRequest] };
const poller = await client.path("/document/batches").post({
body: batchRequests
});
body: batchRequests,
});
const id = getTranslationOperationID(poller.headers["operation-location"]);

//Cancel translation
Expand All @@ -158,6 +162,7 @@ console.log("The status after cancelling the batch operation is:" + response.bod
```

### Get Documents Status

Used to request the status for all documents in a translation job.

```typescript
Expand All @@ -171,10 +176,10 @@ const targetInput = createTargetInput(targetUrl, "fr");
const batchRequest = createBatchRequest(sourceInput, [targetInput]);

//Start translation
const batchRequests = {inputs: [batchRequest]};
const response = await StartTranslationAndWait(client, batchRequests);
const batchRequests = { inputs: [batchRequest] };
const response = await StartTranslationAndWait(client, batchRequests);

const operationLocationUrl = response.headers["operation-location"]
const operationLocationUrl = response.headers["operation-location"];
const operationId = getTranslationOperationID(operationLocationUrl);

//get Documents Status
Expand All @@ -185,13 +190,14 @@ if (isUnexpected(documentResponse)) {

const responseBody = documentResponse.body;
for (const documentStatus of responseBody.value) {
console.log("Document Status is: " + documentStatus.status);
console.log("Characters charged is: " + documentStatus.characterCharged);
break;
console.log("Document Status is: " + documentStatus.status);
console.log("Characters charged is: " + documentStatus.characterCharged);
break;
}
```

### Get Document Status

This returns the status for a specific document in a job as indicated in the request by the id and documentId query parameters.

```typescript
Expand All @@ -205,9 +211,9 @@ const targetInput = createTargetInput(targetUrl, "fr");
const batchRequest = createBatchRequest(sourceInput, [targetInput]);

//Start translation
const batchRequests = {inputs: [batchRequest]};
const response = await StartTranslationAndWait(client, batchRequests);
const operationLocationUrl = response.headers["operation-location"]
const batchRequests = { inputs: [batchRequest] };
const response = await StartTranslationAndWait(client, batchRequests);
const operationLocationUrl = response.headers["operation-location"];
const operationId = getTranslationOperationID(operationLocationUrl);

//get Documents Status
Expand All @@ -218,60 +224,64 @@ if (isUnexpected(documentResponse)) {

const responseBody = documentResponse.body;
for (const document of responseBody.value) {
//get document status
const documentStatus = await client.path("/document/batches/{id}/documents/{documentId}", operationId, document.id).get();
console.log("Document Status = " + documentStatus.status);
const documentStatusOutput = documentStatus.body as DocumentStatusOutput;
console.log("Document ID = " +documentStatusOutput.id);
console.log("Document source path = " + documentStatusOutput.sourcePath);
console.log("Document path = " + documentStatusOutput.path);
console.log("Target language = " + documentStatusOutput.to);
console.log("Document created dateTime = " + documentStatusOutput.createdDateTimeUtc);
console.log("Document last action date time = " + documentStatusOutput.lastActionDateTimeUtc);
//get document status
const documentStatus = await client
.path("/document/batches/{id}/documents/{documentId}", operationId, document.id)
.get();
console.log("Document Status = " + documentStatus.status);
const documentStatusOutput = documentStatus.body as DocumentStatusOutput;
console.log("Document ID = " + documentStatusOutput.id);
console.log("Document source path = " + documentStatusOutput.sourcePath);
console.log("Document path = " + documentStatusOutput.path);
console.log("Target language = " + documentStatusOutput.to);
console.log("Document created dateTime = " + documentStatusOutput.createdDateTimeUtc);
console.log("Document last action date time = " + documentStatusOutput.lastActionDateTimeUtc);
}
```

### Get Translations Status

Used to request a list and the status of all translation jobs submitted by the user (associated with the resource).

```typescript
console.log("== Get Translations Status ==");
const client = createClient(endpoint, credentials);

const sourceUrl = await createSourceContainer(ONE_TEST_DOCUMENTS);
const sourceInput = createSourceInput(sourceUrl);
const targetUrl = await createTargetContainer();
const targetInput = createTargetInput(targetUrl, "fr");
const batchRequest = createBatchRequest(sourceInput, [targetInput]);
//Start translation
const batchRequests = {inputs: [batchRequest]};
const translationResponse = await StartTranslationAndWait(client, batchRequests);
const operationLocationUrl = translationResponse.headers["operation-location"]
const operationId = getTranslationOperationID(operationLocationUrl);

//get Translation Statusby ID filter
const queryParams = {
ids: [operationId]
};
const response = await client.path("/document/batches").get({
queryParameters: queryParams
});
if (isUnexpected(response)) {
throw response.body;
}
const responseBody = response.body;
for (const translationStatus of responseBody.value) {
console.log("Translation ID = " + translationStatus.id);
console.log("Translation Status = " + translationStatus.status);
console.log("Translation createdDateTimeUtc = " + translationStatus.createdDateTimeUtc);
console.log("Translation lastActionDateTimeUtc = " + translationStatus.lastActionDateTimeUtc);
console.log("Total documents submitted for translation = " + translationStatus.summary.total);
console.log("Total characters charged = " + translationStatus.summary.totalCharacterCharged);
}
const client = createClient(endpoint, credentials);

const sourceUrl = await createSourceContainer(ONE_TEST_DOCUMENTS);
const sourceInput = createSourceInput(sourceUrl);
const targetUrl = await createTargetContainer();
const targetInput = createTargetInput(targetUrl, "fr");
const batchRequest = createBatchRequest(sourceInput, [targetInput]);

//Start translation
const batchRequests = { inputs: [batchRequest] };
const translationResponse = await StartTranslationAndWait(client, batchRequests);
const operationLocationUrl = translationResponse.headers["operation-location"];
const operationId = getTranslationOperationID(operationLocationUrl);

//get Translation Statusby ID filter
const queryParams = {
ids: [operationId],
};
const response = await client.path("/document/batches").get({
queryParameters: queryParams,
});
if (isUnexpected(response)) {
throw response.body;
}
const responseBody = response.body;
for (const translationStatus of responseBody.value) {
console.log("Translation ID = " + translationStatus.id);
console.log("Translation Status = " + translationStatus.status);
console.log("Translation createdDateTimeUtc = " + translationStatus.createdDateTimeUtc);
console.log("Translation lastActionDateTimeUtc = " + translationStatus.lastActionDateTimeUtc);
console.log("Total documents submitted for translation = " + translationStatus.summary.total);
console.log("Total characters charged = " + translationStatus.summary.totalCharacterCharged);
}
```

### Get Translation Status

Used to request the status of a specific translation job. The response includes the overall job status and the status for documents that are being translated as part of that job.

```typescript
Expand All @@ -285,16 +295,18 @@ const targetInput = createTargetInput(targetUrl, "fr");
const batchRequest = createBatchRequest(sourceInput, [targetInput]);

//Start translation
const batchRequests = {inputs: [batchRequest]};
const translationResponse = await StartTranslationAndWait(client, batchRequests);
const batchRequests = { inputs: [batchRequest] };
const translationResponse = await StartTranslationAndWait(client, batchRequests);

const operationLocationUrl = translationResponse.headers["operation-location"]
const operationId = getTranslationOperationID(operationLocationUrl);
const operationLocationUrl = translationResponse.headers["operation-location"];
const operationId = getTranslationOperationID(operationLocationUrl);

//get Translation Status
const response = await client.path("/document/batches/{id}",operationId).get() as GetTranslationStatus200Response;
const response = (await client
.path("/document/batches/{id}", operationId)
.get()) as GetTranslationStatus200Response;
if (isUnexpected(response)) {
throw response.body;
throw response.body;
}

console.log("Translation ID = " + response.body.id);
Expand All @@ -305,7 +317,6 @@ console.log("Total documents submitted for translation = " + response.body.summa
console.log("Total characters charged = " + response.body.summary.totalCharacterCharged);
```


### Get Supported Formats

This returns a list of document or glossary formats supported by the Document Translation feature. The list includes common file extensions and content-type if using the upload API.
Expand All @@ -317,11 +328,13 @@ const documentTranslationClient = DocumentTranslationClient(endpoint);
const response = await documentTranslationClient.path("/document/formats").get();

const fileFormatTypes = response.body;
fileFormatTypes.value.forEach((fileFormatType: { format: any; contentTypes: any; fileExtensions: any; }) => {
console.log(fileFormatType.format);
console.log(fileFormatType.contentTypes);
console.log(fileFormatType.fileExtensions);
});
fileFormatTypes.value.forEach(
(fileFormatType: { format: any; contentTypes: any; fileExtensions: any }) => {
console.log(fileFormatType.format);
console.log(fileFormatType.contentTypes);
console.log(fileFormatType.fileExtensions);
},
);
```

## Troubleshooting
Expand All @@ -336,7 +349,7 @@ You can find the different error codes returned by the service in the [Service D

Enabling logging may help uncover useful information about failures. In order to see a log of HTTP requests and responses, set the `AZURE_LOG_LEVEL` environment variable to `info`. Alternatively, logging can be enabled at runtime by calling `setLogLevel` in the `@azure/logger`:

```javascript
```ts
const { setLogLevel } = require("@azure/logger");

setLogLevel("info");
Expand Down
Loading
Loading