From 44976362b5ddc653f50af533ca9a78360a763c6d Mon Sep 17 00:00:00 2001 From: Anton Fesenko Date: Tue, 3 Feb 2026 17:44:13 +0200 Subject: [PATCH 1/3] refactor BaseActions.ExecuteChatCompletion to identify which api params to use, add StartBackgroundProcessRequest.MaximumTokens, add error parsing for the 'Get background result' action --- Apps.OpenAI/Actions/BackgroundActions.cs | 51 ++++++---------- Apps.OpenAI/Actions/Base/BaseActions.cs | 23 +++++-- Apps.OpenAI/Actions/EditActions.cs | 60 +++++++++---------- Apps.OpenAI/Apps.OpenAI.csproj | 2 +- Apps.OpenAI/Dtos/AssistantDto.cs | 8 --- Apps.OpenAI/Dtos/AssistantMessageDto.cs | 14 ----- Apps.OpenAI/Dtos/MqmReportResponse.cs | 11 ++++ .../Models/Entities/MqmReportEntity.cs | 12 ++++ .../StartBackgroundProcessRequest.cs | 5 +- .../Models/Responses/Batch/BatchResponse.cs | 4 ++ .../Responses/Batch/Error/BatchErrorDetail.cs | 9 +++ .../Batch/Error/BatchItemErrorResponse.cs | 9 +++ .../Batch/Error/BatchResponseBody.cs | 12 ++++ .../Batch/Error/BatchResponseInfo.cs | 9 +++ Apps.OpenAI/Utils/DictionaryHelper.cs | 2 +- Tests.OpenAI/BackgroundActionsTests.cs | 10 ++-- Tests.OpenAI/ChatActionsTests.cs | 6 +- Tests.OpenAI/DataSourcesTests.cs | 5 +- Tests.OpenAI/EditTests.cs | 9 +-- 19 files changed, 152 insertions(+), 109 deletions(-) delete mode 100644 Apps.OpenAI/Dtos/AssistantDto.cs delete mode 100644 Apps.OpenAI/Dtos/AssistantMessageDto.cs create mode 100644 Apps.OpenAI/Dtos/MqmReportResponse.cs create mode 100644 Apps.OpenAI/Models/Entities/MqmReportEntity.cs create mode 100644 Apps.OpenAI/Models/Responses/Batch/Error/BatchErrorDetail.cs create mode 100644 Apps.OpenAI/Models/Responses/Batch/Error/BatchItemErrorResponse.cs create mode 100644 Apps.OpenAI/Models/Responses/Batch/Error/BatchResponseBody.cs create mode 100644 Apps.OpenAI/Models/Responses/Batch/Error/BatchResponseInfo.cs diff --git a/Apps.OpenAI/Actions/BackgroundActions.cs b/Apps.OpenAI/Actions/BackgroundActions.cs index e7fb284..191e62d 100644 --- a/Apps.OpenAI/Actions/BackgroundActions.cs +++ b/Apps.OpenAI/Actions/BackgroundActions.cs @@ -1,16 +1,11 @@ -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using Apps.OpenAI.Actions.Base; +using Apps.OpenAI.Actions.Base; using Apps.OpenAI.Api.Requests; -using Apps.OpenAI.Constants; using Apps.OpenAI.Dtos; using Apps.OpenAI.Models.Entities; using Apps.OpenAI.Models.Requests.Background; using Apps.OpenAI.Models.Responses.Background; using Apps.OpenAI.Models.Responses.Batch; +using Apps.OpenAI.Models.Responses.Batch.Error; using Apps.OpenAI.Models.Responses.Review; using Apps.OpenAI.Utils; using Blackbird.Applications.Sdk.Common; @@ -26,6 +21,11 @@ using Blackbird.Filters.Xliff.Xliff1; using Newtonsoft.Json; using RestSharp; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using System.Threading.Tasks; namespace Apps.OpenAI.Actions; @@ -186,20 +186,13 @@ public async Task DownloadContentFromBackground([Acti }; } - [Action("Get background result", - Description = "Get the MQM report results from a background batch process")] + [Action("Get background result", Description = "Get the MQM report results from a background batch process")] public async Task GetMqmReportFromBackground( [ActionParameter] BackgroundDownloadRequest request) { var batchRequests = await GetBatchRequestsAsync(request.BatchId); var batchResponse = await GetBatchStatusAsync(request.BatchId); - - if (batchResponse.Status != "completed") - { - throw new PluginApplicationException( - $"The batch process is not completed yet. Current status: {batchResponse.Status}"); - } - + var stream = await fileManagementClient.DownloadAsync(request.TransformationFile); var content = await Transformation.Parse(stream, request.TransformationFile.Name); var units = content.GetUnits(); @@ -324,8 +317,15 @@ private async Task> GetBatchRequestsAsync(string batchId) $"The batch process failed. Errors: {batch.Errors}"); } - var fileContentResponse = await UniversalClient.ExecuteWithErrorHandling( - new OpenAIRequest($"/files/{batch.OutputFileId}/content", Method.Get)); + if (string.IsNullOrEmpty(batch.OutputFileId) && !string.IsNullOrEmpty(batch.ErrorFileId)) + { + var errorRequest = new OpenAIRequest($"/files/{batch.ErrorFileId}/content", Method.Get); + var errorBatchResponse = await UniversalClient.ExecuteWithErrorHandling(errorRequest); + throw new PluginApplicationException(errorBatchResponse.Response.Body.Error.Message); + } + + var fileContentRequest = new OpenAIRequest($"/files/{batch.OutputFileId}/content", Method.Get); + var fileContentResponse = await UniversalClient.ExecuteWithErrorHandling(fileContentRequest); var batchRequests = new List(); using var reader = new StringReader(fileContentResponse.Content!); @@ -345,19 +345,4 @@ private async Task GetBatchStatusAsync(string batchId) } #endregion - - private class MqmReportResponse - { - [JsonProperty("reports")] - public List Reports { get; set; } = new(); - } - - private class MqmReportEntity - { - [JsonProperty("segment_id")] - public string SegmentId { get; set; } = string.Empty; - - [JsonProperty("mqm_report")] - public string MqmReport { get; set; } = string.Empty; - } } \ No newline at end of file diff --git a/Apps.OpenAI/Actions/Base/BaseActions.cs b/Apps.OpenAI/Actions/Base/BaseActions.cs index 0d7d358..3dc3193 100644 --- a/Apps.OpenAI/Actions/Base/BaseActions.cs +++ b/Apps.OpenAI/Actions/Base/BaseActions.cs @@ -244,6 +244,15 @@ protected async Task DownloadXliffDocumentAsync(FileReference fil } protected async Task ExecuteChatCompletion(IEnumerable messages, string model, BaseChatRequest input = null, object responseFormat = null) + { + var body = GenerateChatBody(messages, model, input); + return await UniversalClient.ExecuteChatCompletion(body); + } + + protected static Dictionary GenerateChatBody( + IEnumerable messages, + string model, + BaseChatRequest input = null) { var body = new Dictionary { @@ -254,15 +263,19 @@ protected async Task ExecuteChatCompletion(IEnumerable IdentifySourceLanguage(TextChatModelIdentifier modelIdentifier, string content) diff --git a/Apps.OpenAI/Actions/EditActions.cs b/Apps.OpenAI/Actions/EditActions.cs index 7b03945..759a311 100644 --- a/Apps.OpenAI/Actions/EditActions.cs +++ b/Apps.OpenAI/Actions/EditActions.cs @@ -165,7 +165,8 @@ async Task> BatchTranslate(IEnumerable<(Unit Unit [Action("Edit in background", Description = "Start background editing process for a translated file. This action will return a batch ID that can be used to download the results later.")] - public async Task EditInBackground([ActionParameter] StartBackgroundProcessRequest processRequest) + public async Task EditInBackground( + [ActionParameter] StartBackgroundProcessRequest processRequest) { var stream = await fileManagementClient.DownloadAsync(processRequest.File); var content = await ErrorHandler.ExecuteWithErrorHandlingAsync(async () => @@ -173,26 +174,29 @@ await Transformation.Parse(stream, processRequest.File.Name) ); var units = content.GetUnits(); - var segments = units.SelectMany(x => x.Segments); - segments = segments.GetSegmentsForEditing().ToList(); + var segments = units.SelectMany(x => x.Segments).GetSegmentsForEditing().ToList(); - Glossary? blackbirdGlossary = await ProcessGlossaryFromFile(processRequest.Glossary); - Dictionary>? glossaryLookup = null; + Glossary blackbirdGlossary = await ProcessGlossaryFromFile(processRequest.Glossary); + Dictionary> glossaryLookup = null; if (blackbirdGlossary != null) { glossaryLookup = CreateGlossaryLookup(blackbirdGlossary); } - var systemPromptBase = "You are receiving source texts that were translated into target texts. " + - "Review the target texts and respond with edits of the target texts as necessary. " + - "If no edits required, respond with the original target texts. Return the edits in the specified JSON format."; + string systemPromptBase = + "You are receiving source texts that were translated into target texts. " + + "Review the target texts and respond with edits of the target texts as necessary. " + + "If no edits required, respond with the original target texts. " + + "Return the edits in the specified JSON format." + + "The JSON must strictly follow this structure: " + + "{ \"reports\": [ { \"segment_id\": \"(string matching custom_id)\", \"mqm_report\": \"(the edited text)\" } ] }"; if (processRequest.AdditionalInstructions != null) { systemPromptBase += $" Additional instructions: {processRequest.AdditionalInstructions}."; } - if(glossaryLookup != null) + if (glossaryLookup != null) { systemPromptBase += " Use the provided glossary to ensure accurate translations of specific terms."; } @@ -232,34 +236,26 @@ await Transformation.Parse(stream, processRequest.File.Name) } } + string modelId = UniversalClient.GetModel(processRequest.ModelId); + var chatInput = new BaseChatRequest + { + MaximumTokens = processRequest.MaximumTokens, + Temperature = 0.3f + }; + + var messages = new object[] + { + new { role = MessageRoles.System, content = systemPromptBase }, + new { role = MessageRoles.User, content = userPrompt } + }; + + var bodyDict = GenerateChatBody(messages, modelId, chatInput); var batchRequest = new { custom_id = bucketIndex.ToString(), method = "POST", url = "/v1/chat/completions", - body = new - { - model = UniversalClient.GetModel(processRequest.ModelId), - messages = new object[] - { - new - { - role = "system", - content = systemPromptBase - }, - new - { - role = "user", - content = userPrompt - } - }, - response_format = ResponseFormats.GetXliffResponseFormat(), - temperature = 0.3, - max_tokens = 4000, - top_p = 1.0, - frequency_penalty = 0.0, - presence_penalty = 0.0 - } + body = bodyDict }; batchRequests.Add(batchRequest); diff --git a/Apps.OpenAI/Apps.OpenAI.csproj b/Apps.OpenAI/Apps.OpenAI.csproj index 4fa3daf..4832d8d 100644 --- a/Apps.OpenAI/Apps.OpenAI.csproj +++ b/Apps.OpenAI/Apps.OpenAI.csproj @@ -4,7 +4,7 @@ net8.0 OpenAI Creating safe artificial general intelligence that benefits all of humanity - 2.8.15 + 2.8.16 Apps.OpenAI diff --git a/Apps.OpenAI/Dtos/AssistantDto.cs b/Apps.OpenAI/Dtos/AssistantDto.cs deleted file mode 100644 index e1961a4..0000000 --- a/Apps.OpenAI/Dtos/AssistantDto.cs +++ /dev/null @@ -1,8 +0,0 @@ -namespace Apps.OpenAI.Dtos -{ - public class AssistantDto - { - public string Id { get; set; } - public string Name { get; set; } - } -} diff --git a/Apps.OpenAI/Dtos/AssistantMessageDto.cs b/Apps.OpenAI/Dtos/AssistantMessageDto.cs deleted file mode 100644 index 88a8ee0..0000000 --- a/Apps.OpenAI/Dtos/AssistantMessageDto.cs +++ /dev/null @@ -1,14 +0,0 @@ -using Newtonsoft.Json; -using System.Collections.Generic; - -namespace Apps.OpenAI.Dtos -{ - public class AssistantMessageDto - { - public string Role { get; set; } - public string Content { get; set; } - - [JsonProperty("file_ids")] - public IEnumerable FileIds { get; set;} - } -} diff --git a/Apps.OpenAI/Dtos/MqmReportResponse.cs b/Apps.OpenAI/Dtos/MqmReportResponse.cs new file mode 100644 index 0000000..4588ee1 --- /dev/null +++ b/Apps.OpenAI/Dtos/MqmReportResponse.cs @@ -0,0 +1,11 @@ +using Newtonsoft.Json; +using System.Collections.Generic; +using Apps.OpenAI.Models.Entities; + +namespace Apps.OpenAI.Dtos; + +public class MqmReportResponse +{ + [JsonProperty("reports")] + public List Reports { get; set; } +} \ No newline at end of file diff --git a/Apps.OpenAI/Models/Entities/MqmReportEntity.cs b/Apps.OpenAI/Models/Entities/MqmReportEntity.cs new file mode 100644 index 0000000..14c3461 --- /dev/null +++ b/Apps.OpenAI/Models/Entities/MqmReportEntity.cs @@ -0,0 +1,12 @@ +using Newtonsoft.Json; + +namespace Apps.OpenAI.Models.Entities; + +public class MqmReportEntity +{ + [JsonProperty("segment_id")] + public string SegmentId { get; set; } + + [JsonProperty("mqm_report")] + public string MqmReport { get; set; } +} \ No newline at end of file diff --git a/Apps.OpenAI/Models/Requests/Background/StartBackgroundProcessRequest.cs b/Apps.OpenAI/Models/Requests/Background/StartBackgroundProcessRequest.cs index dd69746..34489cc 100644 --- a/Apps.OpenAI/Models/Requests/Background/StartBackgroundProcessRequest.cs +++ b/Apps.OpenAI/Models/Requests/Background/StartBackgroundProcessRequest.cs @@ -18,7 +18,10 @@ public class StartBackgroundProcessRequest : TextChatModelIdentifier [Display("Additional instructions", Description = "Additional instructions to guide the translation process.")] public string? AdditionalInstructions { get; set; } - + + [Display("Maximum tokens")] + public int? MaximumTokens { get; set; } + public FileReference? Glossary { get; set; } [Display("Bucket size", Description = "Specify the number of source texts to be translated at once. Default value: 25.")] diff --git a/Apps.OpenAI/Models/Responses/Batch/BatchResponse.cs b/Apps.OpenAI/Models/Responses/Batch/BatchResponse.cs index 458c94f..7b183a4 100644 --- a/Apps.OpenAI/Models/Responses/Batch/BatchResponse.cs +++ b/Apps.OpenAI/Models/Responses/Batch/BatchResponse.cs @@ -31,6 +31,10 @@ public class BatchResponse [JsonProperty("expectedCompletionTime")] public string ExpectedCompletionTime { get; set; } + + [DefinitionIgnore] + [JsonProperty("error_file_id")] + public string ErrorFileId { get; set; } = string.Empty; } public class BatchPaginationResponse diff --git a/Apps.OpenAI/Models/Responses/Batch/Error/BatchErrorDetail.cs b/Apps.OpenAI/Models/Responses/Batch/Error/BatchErrorDetail.cs new file mode 100644 index 0000000..329226a --- /dev/null +++ b/Apps.OpenAI/Models/Responses/Batch/Error/BatchErrorDetail.cs @@ -0,0 +1,9 @@ +using Newtonsoft.Json; + +namespace Apps.OpenAI.Models.Responses.Batch.Error; + +public class BatchErrorDetail +{ + [JsonProperty("message")] + public string Message { get; set; } +} \ No newline at end of file diff --git a/Apps.OpenAI/Models/Responses/Batch/Error/BatchItemErrorResponse.cs b/Apps.OpenAI/Models/Responses/Batch/Error/BatchItemErrorResponse.cs new file mode 100644 index 0000000..3bd792e --- /dev/null +++ b/Apps.OpenAI/Models/Responses/Batch/Error/BatchItemErrorResponse.cs @@ -0,0 +1,9 @@ +using Newtonsoft.Json; + +namespace Apps.OpenAI.Models.Responses.Batch.Error; + +public class BatchItemErrorResponse +{ + [JsonProperty("response")] + public BatchResponseInfo Response { get; set; } +} \ No newline at end of file diff --git a/Apps.OpenAI/Models/Responses/Batch/Error/BatchResponseBody.cs b/Apps.OpenAI/Models/Responses/Batch/Error/BatchResponseBody.cs new file mode 100644 index 0000000..8b9f4ef --- /dev/null +++ b/Apps.OpenAI/Models/Responses/Batch/Error/BatchResponseBody.cs @@ -0,0 +1,12 @@ +using Newtonsoft.Json; + +namespace Apps.OpenAI.Models.Responses.Batch.Error; + +public class BatchResponseBody +{ + [JsonProperty("error")] + public BatchErrorDetail Error { get; set; } + + [JsonProperty("choices")] + public object Choices { get; set; } +} \ No newline at end of file diff --git a/Apps.OpenAI/Models/Responses/Batch/Error/BatchResponseInfo.cs b/Apps.OpenAI/Models/Responses/Batch/Error/BatchResponseInfo.cs new file mode 100644 index 0000000..8c429b1 --- /dev/null +++ b/Apps.OpenAI/Models/Responses/Batch/Error/BatchResponseInfo.cs @@ -0,0 +1,9 @@ +using Newtonsoft.Json; + +namespace Apps.OpenAI.Models.Responses.Batch.Error; + +public class BatchResponseInfo +{ + [JsonProperty("body")] + public BatchResponseBody Body { get; set; } +} diff --git a/Apps.OpenAI/Utils/DictionaryHelper.cs b/Apps.OpenAI/Utils/DictionaryHelper.cs index 8476618..dbd5995 100644 --- a/Apps.OpenAI/Utils/DictionaryHelper.cs +++ b/Apps.OpenAI/Utils/DictionaryHelper.cs @@ -4,7 +4,7 @@ namespace Apps.OpenAI.Utils; public static class DictionaryHelper { - public static Dictionary AppendIfNotNull(this Dictionary dictionary, string key, T? value) + public static Dictionary AppendIfNotNull(this Dictionary dictionary, string key, T value) { if (value != null) dictionary[key] = value; diff --git a/Tests.OpenAI/BackgroundActionsTests.cs b/Tests.OpenAI/BackgroundActionsTests.cs index ffd466a..e323d6f 100644 --- a/Tests.OpenAI/BackgroundActionsTests.cs +++ b/Tests.OpenAI/BackgroundActionsTests.cs @@ -48,18 +48,18 @@ public async Task DownloadContentFromBackground_AzureOpenAiCompletedBatchWithXli Assert.IsNotNull(result); } - [TestMethod, ContextDataSource(ConnectionTypes.OpenAiEmbedded)] - public async Task GetMqmReportFromBackground_OpenAiEmbeddedCompletedBatch_Success(InvocationContext context) + [TestMethod, ContextDataSource(ConnectionTypes.OpenAi)] + public async Task GetMqmReportFromBackground_OpenAiCompletedBatch_Success(InvocationContext context) { // Arrange var actions = new BackgroundActions(context, FileManagementClient); var downloadRequest = new BackgroundDownloadRequest { - BatchId = "batch_68e4168ac48c81909609edd7ea536873", - TransformationFile = new FileReference { Name = "mqm.xlf" } + BatchId = "batch_6982072a17bc8190aee422d34b698d0a", + TransformationFile = new FileReference { Name = "The Hobbit, or There and Back Again_en-US.html.xlf" } }; - // Act + // Act var result = await actions.GetMqmReportFromBackground(downloadRequest); // Assert diff --git a/Tests.OpenAI/ChatActionsTests.cs b/Tests.OpenAI/ChatActionsTests.cs index b30cccc..25f8f7e 100644 --- a/Tests.OpenAI/ChatActionsTests.cs +++ b/Tests.OpenAI/ChatActionsTests.cs @@ -17,11 +17,11 @@ public async Task ChatMessageRequest_OpenAiEmbeddedWithSimpleTextMessage_Returns { // Arrange var actions = new ChatActions(context, FileManagementClient); - var model = new TextChatModelIdentifier { ModelId = "gpt-5" }; + var model = new TextChatModelIdentifier { ModelId = "gpt-4" }; var chatRequest = new ChatRequest { - Message = "Who are you? State your model, creator, and your main responsibilities.", - File = new FileReference { Name = "2-2025 payoneer.pdf", ContentType = "application/pdf" } + Message = "Tell me about Scania S", + MaximumTokens = 300 }; var glossary = new GlossaryRequest(); diff --git a/Tests.OpenAI/DataSourcesTests.cs b/Tests.OpenAI/DataSourcesTests.cs index b2185b3..fa871e7 100644 --- a/Tests.OpenAI/DataSourcesTests.cs +++ b/Tests.OpenAI/DataSourcesTests.cs @@ -1,4 +1,5 @@ -using Apps.OpenAI.DataSourceHandlers; +using Apps.OpenAI.Constants; +using Apps.OpenAI.DataSourceHandlers; using Apps.OpenAI.DataSourceHandlers.ModelDataSourceHandlers; using Blackbird.Applications.Sdk.Common.Dynamic; using Blackbird.Applications.Sdk.Common.Invocation; @@ -9,7 +10,7 @@ namespace Tests.OpenAI; [TestClass] public class DataSourceHandlerTests : TestBaseWithContext { - [TestMethod, ContextDataSource] + [TestMethod, ContextDataSource(ConnectionTypes.OpenAi)] public async Task GetDataAsync_ForTextChatModels_ReturnsNonEmptyCollection(InvocationContext context) { var handler = new TextChatModelDataSourceHandler(context); diff --git a/Tests.OpenAI/EditTests.cs b/Tests.OpenAI/EditTests.cs index ceca081..381a271 100644 --- a/Tests.OpenAI/EditTests.cs +++ b/Tests.OpenAI/EditTests.cs @@ -59,8 +59,8 @@ public async Task Taus_edit(InvocationContext context) PrintResult(result); } - [TestMethod, ContextDataSource(ConnectionTypes.OpenAiEmbedded)] - public async Task EditInBackground_OpenAiEmbeddedWithXliffFile_Success(InvocationContext context) + [TestMethod, ContextDataSource(ConnectionTypes.OpenAi)] + public async Task EditInBackground_OpenAiWithXliffFile_Success(InvocationContext context) { // Arrange var actions = new EditActions(context, FileManagementClient); @@ -72,9 +72,10 @@ public async Task EditInBackground_OpenAiEmbeddedWithXliffFile_Success(Invocatio var editRequest = new StartBackgroundProcessRequest { - ModelId = "gpt-4.1", + ModelId = "gpt-5-mini", File = file, - TargetLanguage = "fr" + TargetLanguage = "fr", + //MaximumTokens = 4096 }; // Act From 07bf4f6de2f4517f0c981605a491928b0a9df363 Mon Sep 17 00:00:00 2001 From: Anton Fesenko Date: Tue, 3 Feb 2026 18:16:37 +0200 Subject: [PATCH 2/3] fix NRE in the 'Get background result' action --- Apps.OpenAI/Actions/BackgroundActions.cs | 3 +++ Apps.OpenAI/Dtos/MqmReportResponse.cs | 2 +- Tests.OpenAI/BackgroundActionsTests.cs | 2 +- 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/Apps.OpenAI/Actions/BackgroundActions.cs b/Apps.OpenAI/Actions/BackgroundActions.cs index 191e62d..6b3a1be 100644 --- a/Apps.OpenAI/Actions/BackgroundActions.cs +++ b/Apps.OpenAI/Actions/BackgroundActions.cs @@ -223,6 +223,9 @@ public async Task GetMqmReportFromBackground( { mqmResponse = JsonConvert.DeserializeObject(cleaned) ?? throw new PluginApplicationException($"Invalid JSON MQM report format in batch {bucketIndex}."); + + if (mqmResponse == null || mqmResponse.Reports == null) + mqmResponse = new MqmReportResponse(); } else { diff --git a/Apps.OpenAI/Dtos/MqmReportResponse.cs b/Apps.OpenAI/Dtos/MqmReportResponse.cs index 4588ee1..d9ffe2b 100644 --- a/Apps.OpenAI/Dtos/MqmReportResponse.cs +++ b/Apps.OpenAI/Dtos/MqmReportResponse.cs @@ -7,5 +7,5 @@ namespace Apps.OpenAI.Dtos; public class MqmReportResponse { [JsonProperty("reports")] - public List Reports { get; set; } + public List Reports { get; set; } = []; } \ No newline at end of file diff --git a/Tests.OpenAI/BackgroundActionsTests.cs b/Tests.OpenAI/BackgroundActionsTests.cs index e323d6f..150bcc7 100644 --- a/Tests.OpenAI/BackgroundActionsTests.cs +++ b/Tests.OpenAI/BackgroundActionsTests.cs @@ -55,7 +55,7 @@ public async Task GetMqmReportFromBackground_OpenAiCompletedBatch_Success(Invoca var actions = new BackgroundActions(context, FileManagementClient); var downloadRequest = new BackgroundDownloadRequest { - BatchId = "batch_6982072a17bc8190aee422d34b698d0a", + BatchId = "batch_6981d173a1248190ae03665c6fa26b74", TransformationFile = new FileReference { Name = "The Hobbit, or There and Back Again_en-US.html.xlf" } }; From 0c1b49d64b40dfa971d0f2f28f6e9a5e72cf23d3 Mon Sep 17 00:00:00 2001 From: Anton Fesenko Date: Tue, 3 Feb 2026 18:21:35 +0200 Subject: [PATCH 3/3] cicd commit --- Tests.OpenAI/BackgroundActionsTests.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Tests.OpenAI/BackgroundActionsTests.cs b/Tests.OpenAI/BackgroundActionsTests.cs index 150bcc7..af9b922 100644 --- a/Tests.OpenAI/BackgroundActionsTests.cs +++ b/Tests.OpenAI/BackgroundActionsTests.cs @@ -1,9 +1,9 @@ -using Apps.OpenAI.Actions; +using Tests.OpenAI.Base; +using Apps.OpenAI.Actions; using Apps.OpenAI.Constants; using Apps.OpenAI.Models.Requests.Background; using Blackbird.Applications.Sdk.Common.Files; using Blackbird.Applications.Sdk.Common.Invocation; -using Tests.OpenAI.Base; namespace Tests.OpenAI;