Я создал поток Power Automate, извлекающий заказ на покупку из счетов-фактур. Он срабатывал при каждом новом письме в почтовом ящике. Я просматриваю вложения в формате PDF, звоню разработчику ИИ, чтобы извлечь информацию из счета-фактуры и получить заказ на поставку.
Мне нужны были более точные варианты поиска заказа на поставку, поэтому я перешел логика извлечения заказа на покупку в вызов API. Теперь поток просто отправляет PDF-файл в конечную точку, и я могу обрабатывать все функции C# и возвращать необходимые данные, чтобы поток мог продолжиться.
Этот вызов API занимает около 20 секунд в Почтальон.
Когда я пытаюсь вызвать его в своем потоке, время ожидания истекает.
Я подключил отладчик к своему API и обнаружил, что это правильно, когда я жду ответ от AI-клиента, Flow повторно отправляет запрос. В результате получается бесконечный цикл.
Я знаю, что вызов конечной точки работает, потому что я могу вернуть ответ «ОК» до вызова AI, и это сработает.
Как мне это сделать? заставить мой HTTP-запрос ждать этого результата?
Или это проблема с асинхронностью AI-вызова клиента?
Во время отладки я заметил, что моя точка останова всегда теряется на первый вызов aiClient, который является первой асинхронной операцией в вызове.

Вот представление кода HTTP-вызова в Power Automate
Код: Выделить всё
"inputs": {
"method": "POST",
"uri": "REDACTED",
"headers": {
"Connection": "keep-alive",
"Accept": "*/*",
"Host": "REDACTED",
"Accept-Encoding": "gzip, deflate, br"
},
"body": {
"$content-type": "multipart/form-data",
"$multipart": [
{
"headers": {
"Content-Disposition": "form-data; name=\"invoicePdf\"; filename=\"invoicePdf.pdf\""
},
"body": "@outputs('Get_file_content')"
}
]
},
"authentication": {
"type": "Basic",
"username": "REDACTED",
"password": "REDACTED"
}
},
"operationOptions": "DisableAsyncPattern",
"metadata": {
"operationMetadataId": "38dae010-f79b-4c3e-ae7c-22a6047b4151"
}
}
Код: Выделить всё
{
// Check if a file was uploaded
if (invoicePdf == null || invoicePdf.Length == 0)
{
return BadRequest("No file uploaded.");
}
// Check if the file is a PDF
if (!invoicePdf.FileName.EndsWith(".pdf"))
{
return BadRequest("Only PDF files are allowed.");
}
AzureKeyCredential credential = new AzureKeyCredential(AppSettings.AzureAiServiceKey);
DocumentAnalysisClient aiClient = new DocumentAnalysisClient(new Uri(AppSettings.AzureAiServiceEndpoint), credential);
//var operation = await aiClient.AnalyzeDocumentAsync(WaitUntil.Completed, "prebuilt-invoice", invoicePdf.OpenReadStream());
var invoiceOperation = aiClient.AnalyzeDocumentAsync(WaitUntil.Completed, "prebuilt-invoice",
invoicePdf.OpenReadStream(), new AnalyzeDocumentOptions
{
Pages = { "1-2" }
}).Result;
var invoiceResult = invoiceOperation.Value;
//check default area
for (int i = 0; i < invoiceResult.Documents.Count; i++)
{
var document = invoiceResult.Documents[i];
//try to find the purchase order from the default area
if (document.Fields.ContainsKey("PurchaseOrder"))
{
document.Fields.TryGetValue("PurchaseOrder", out var purchaseOrderObject);
var purchaseOrderValue = purchaseOrderObject.Content;
var purchaseOrderConfidence = purchaseOrderObject.Confidence;
var sanitizedPurchaseOrderValue = SanitizePurchaseOrder(purchaseOrderValue);
return Ok(new
{
Found = true,
PurchaseOrderValue = sanitizedPurchaseOrderValue,
PurchaseOrderConfidence = purchaseOrderConfidence,
FoundIn = "Default Location"
});
}
}
var layoutOperation = aiClient.AnalyzeDocumentAsync(WaitUntil.Completed, "prebuilt-document",
invoicePdf.OpenReadStream(), new AnalyzeDocumentOptions
{
Pages = { "1-2" }
}).Result;
var layoutResult = layoutOperation.Value;
DocumentKeyValuePair? poKeyValuePair;
poKeyValuePair = layoutResult.KeyValuePairs.FirstOrDefault(x => firstPriorityKeys.Contains(x.Key.Content));
if (poKeyValuePair == null)
{
poKeyValuePair = layoutResult.KeyValuePairs.FirstOrDefault(x => secondPriorityKeys.Contains(x.Key.Content));
if (poKeyValuePair == null)
{
poKeyValuePair = layoutResult.KeyValuePairs.FirstOrDefault(x => thirdPriorityKeys.Contains(x.Key.Content));
if (poKeyValuePair == null)
{
poKeyValuePair = layoutResult.KeyValuePairs.FirstOrDefault(x => fourthPriorityKeys.Contains(x.Key.Content));
if (poKeyValuePair == null)
{
poKeyValuePair = layoutResult.KeyValuePairs.FirstOrDefault(x => fifthPriorityKeys.Contains(x.Key.Content));
}
}
}
}
if (poKeyValuePair != null)
{
var sanitizedPurchaseOrderValue = SanitizePurchaseOrder(poKeyValuePair.Value.Content);
return Ok(new
{
Found = true,
PurchaseOrderValue = sanitizedPurchaseOrderValue,
PurchaseOrderConfidence = poKeyValuePair.Confidence,
FoundIn = $"{poKeyValuePair.Key.Content} (KVP)"
});
}
//check plain text with regex
Regex regex =
new Regex(@"([Pp][Oo]|[Pp][Uu][Rr][Cc][Hh][Aa][Ss][Ee]\s?[Oo][Rr][Dd][Ee][Rr]).{0,3}(\d{7})");
Match match = regex.Match(layoutResult.Content);
if (match.Success)
{
var foundPo = match.Value;
var sanitizedPurchaseOrderValue = SanitizePurchaseOrder(foundPo);
return Ok(new
{
Found = true,
PurchaseOrderValue = sanitizedPurchaseOrderValue,
PurchaseOrderConfidence = 0.5,
FoundIn = "Plain Text Regex Parse"
});
}
return Ok(new
{
Found = false
});
}
[*]HTTP-вызов Power Automate Flow не ждет ответа
[*]Это работает в Postman, но занимает около 20 секунд.
[*]Можно ли как-нибудь заставить Flow ждать этого ответа? >
Подробнее здесь: https://stackoverflow.com/questions/792 ... r-response