Nesta fase, temos um agente conversacional disciplinado que recomenda preços de quartos de hotel apoiado por um modelo de machine learning treinado com dados históricos de hotéis. Sem intuição, sem heurísticas e sem alucinações de IA.
Embora esta configuração já forneça recomendações de preços sólidas, ainda corre localmente, o que limita a sua utilidade em fluxos de trabalho empresariais reais. Para transformar isto num verdadeiro sistema de decisão — um que possa ser consumido por dashboards, aplicações e processos automatizados — precisamos de implementar a inteligência de precificação na nuvem.
Nesta parte da série, transformamos o motor de precificação local numa API de decisão alojada na nuvem, tornando-o acessível a partir de ferramentas como o Power BI e o Power Apps, preservando ao mesmo tempo o determinismo, a transparência e o controlo.
A arquitetura de alto nível.
Se perdeu Parte1 e Parte 2 desta série, o objetivo deste projeto é ajudar um gestor hoteleiro em Lagos, no Algarve, a determinar os preços ótimos dos quartos que maximizem tanto a ocupação como a receita.
A ideia não é substituir o critério da gestora, mas sim fornecer uma ferramenta — como o Power BI ou o Power Apps — que lhe permita solicitar recomendações de preços de forma conversacional, baseando-se num motor de precificação determinístico e reprodutível.
Sendo os mesmos dados de entrada, o modelo produzirá sempre o mesmo resultado. Este determinismo é essencial para a confiança, auditabilidade e utilização operacional.
As Azure Functions como camada de execução.
Uma vez que utilizamos Python e somos grandes adeptos da Power Platform (e do Excel), implementamos o motor de precificação de forma segura no Azure utilizando as Azure Functions.
O modelo não é um guião estático. Ele infere resultados dinamicamente a partir do cenário de entrada, combinando previsões de procura por machine learning com um processo controlado de otimização de preços. Este motor torna-se a camada de inteligência da solução e representa propriedade intelectual valiosa para o hotel.
Ao expô-la através de uma simples API HTTP, desacoplamos a lógica de precificação das interfaces de utilizador e permitimos a sua reutilização em múltiplas ferramentas e fluxos de trabalho.
Conversa local com o agente.
Abaixo está uma interação real com o agente a correr localmente no VS Code:
User: I need a price recommendation for New Year's Eve sea view room.
Competitors are charging €150 per night.
Agent: For the New Year's Eve sea_view room,
how many sea_view rooms do you have in your hotel?
User: 20
Agent: To confirm:
- Is this date a holiday?
- Is it a weekend?
- Is there a major event in town?
User: It is a holiday on a Wednesday.
There’s a festival in Lagos.
[Model loading…]
[Model loaded successfully]
Running optimization:
Testing 25 prices from €75.00 to €225.00…
Agent: I recommend a price of €162.50 per night for your sea_view room,
approximately 8.3% above the competitor’s price.
Expected occupancy: 92.8%
Expected revenue per room: €150.81
For 20 rooms, total expected revenue ≈ €3,016.
This premium reflects holiday demand and the local festival.
Esta interação ilustra uma mudança importante: o agente não "pensa" nem adivinha. Ele orquestra um motor de precificação determinístico que avalia vários pontos de preço e recomenda aquele que maximiza a receita esperada sob pressupostos claramente definidos.
Implementar a função no Azure.
Para implementar a função, precisamos de uma subscrição do Azure, um grupo de recursos e uma conta de armazenamento. A função é depois implementada diretamente a partir do repositório local.
# create the resource group
az group create --name hotel-pricing-rg --location westeurope
# create storage account
az storage account create \
--name hotelpricingstorage \
--location westeurope \
--resource-group hotel-pricing-rg \
--sku Standard_LRS
# create the function app
az functionapp create \
--resource-group hotel-pricing-rg \
--consumption-plan-location westeurope \
--runtime python \
--runtime-version 3.11 \
--functions-version 4 \
--name hotel-pricing-function \
--storage-account hotelpricingstorage \
--os-type Linux
# deploy the function
func azure functionapp publish hotel-pricing-function
# get the function key
az functionapp function keys list \
--resource-group hotel-pricing-rg \
--name hotel-pricing-function \
--function-name PriceRecommendation
Consumir a função a partir do Power Apps.
Antes de adicionarmos uma camada conversacional, podemos consumir a API de decisão numa aplicação de tela (canvas) do Power Apps ao estilo "assistente" (wizard). O utilizador insere manualmente os dados de entrada de precificação através de menus pendentes, campos numéricos e seletores (toggles).

A validação de dados de entrada é aplicada ao nível da interface de utilizador (UI). O botão de ação só é ativado quando todos os dados obrigatórios estão presentes e corretamente preenchidos.
Chamada da Azure Function via Power Automate.
O botão aciona um fluxo instantâneo do Power Automate, que por sua vez comunica com a Azure Function através de uma ação HTTP.

A ação HTTP é configurada da seguinte forma:
- Método Post
- Cabeçalhos: Content-Type: application/json
- URI: Ponto de extremidade (endpoint) da Azure Function (incluindo a chave da função).
{
"competitor_price": @{triggerBody()['number']},
"season": "@{triggerBody()['text']}",
"room_type": "@{triggerBody()['text_1']}",
"month": @{triggerBody()['text_2']},
"rooms_capacity": @{triggerBody()['number_1']},
"lead_time_avg": @{triggerBody()['number_2']},
"is_weekend": @{triggerBody()['text_3']},
"is_holiday": @{triggerBody()['text_4']},
"event_flag": @{triggerBody()['text_5']}
}

Passing the function key directly in the URL is acceptable for development and demos. In production, the key should be secured (custom connector, environment variable, API Management, or Azure AD authentication).
Análise e retorno da resposta.
A resposta é analisada utilizando um Parse JSON action:

{
"type": "object",
"properties": {
"recommended_price": { "type": "number" },
"expected_occupancy": { "type": "number" },
"expected_revenue_per_room": { "type": "number" },
"note": { "type": "string" }
}
}
O fluxo devolve o resultado ao Power Apps utilizando um: Respond to a Power App or flow action:

- preço_recomendado
- taxa_de_ocupação_esperada
- receita_esperada_por_quarto
Chamada do fluxo a partir do Power Apps
Set(varPriceResult, Blank());
Set(
varPriceResult,
AzureFunctionHotelPrice.Run(
Value(TextInputCanvas1.Value),
Lower(DropdownCanvas1.Selected.Value),
Lower(DropdownCanvas1_1.Selected.Value),
DropdownCanvas1_2.Selected.number,
Value(TextInputCanvas1_5.Value),
Value(TextInputCanvas1_6.Value),
If(Toggle1.Checked, 1, 0),
If(Toggle1_1.Checked, 1, 0),
If(Toggle1_2.Checked, 1, 0)
)
);

O que se segue
Nesta parte, focámo-nos na operacionalização da inteligência de precificação como uma API de decisão determinística e na sua integração numa interface Power Apps.
Na Parte 4, adicionaremos uma camada conversacional sobre esta API. O agente não decidirá os preços — irá apenas recolher os dados de entrada em falta, chamar a API de decisão e explicar os resultados. Isto preserva a fiabilidade ao mesmo tempo que permite uma experiência de utilizador semelhante ao ChatGPT.
Quer uma estratégia de preços personalizada para o seu hotel?
Contacte o Swell AI Lab para agendar um diagnóstico rápido.




