← Voltar ao blog

IA & Agentes

Copilot Studio - Tools e Conectores [4] - Chamando uma Azure Function como tool

Copilot Studio - Tools & Connectors [4] - Calling an Azure Function as a tool

Copilot Studio - Tools e Conectores [4] - Chamando uma Azure Function como tool

Fala dataholics! Penúltimo post da série de Tools e esse tem um gostinho especial pra mim, porque ele junta duas coisas que eu já falo há tempos aqui no blog: Azure Functions e agentes. No post [2] eu peguei uma API pública (a BrasilAPI) e transformei em tool. Hoje a API é sua: vou pegar uma Azure Function, o seu código serverless, e transformar ela em tool de um agente. Fiz uma animação curta explicando a ideia e embaixo dela eu abro o passo a passo com o código.

Sua Azure Function virando tool do agente (animação, ~45s)

O que veremos nesse post:

  • Por que usar uma Function como tool

  • A Function que eu peguei (com código)

  • O caminho: HTTP trigger, OpenAPI, REST API tool

  • Autenticação com function key

  • Resumo


Por que usar uma Function como tool

Um conector pronto ou uma API pública são ótimos pra ler dado de fora, mas em algum momento você vai querer que o agente rode a sua lógica. Calcular uma regra de negócio, transformar um dado, bater num banco interno, falar com um sistema que só a sua empresa tem. É aí que a Azure Function encaixa: é o seu código, exposto por HTTP, rodando serverless (escala sozinha e você paga pelo uso). E o melhor, se você já tem Functions no ar, como as da minha série aqui do blog, dá pra reaproveitar sem reescrever nada.


A Function que eu peguei

Pra ficar concreto, imagina uma Function simples que responde o status de um pedido pelo número. No modelo novo do Python ela fica assim, com um HTTP trigger:

import azure.functions as func
import json

app = func.FunctionApp()

@app.route(route="pedido/{id}", auth_level=func.AuthLevel.FUNCTION)
def get_pedido(req: func.HttpRequest) -> func.HttpResponse:
    pedido_id = req.route_params.get("id")
    # aqui voce chamaria o seu sistema real
    dados = {"id": pedido_id, "status": "em transporte", "previsao_dias": 2}
    return func.HttpResponse(
        json.dumps(dados), mimetype="application/json"
    )

Repara no auth_level=func.AuthLevel.FUNCTION. Isso quer dizer que a Function só responde pra quem mandar a function key, e essa key vai ser justamente a autenticação da nossa tool lá na frente. Guarda essa informação.


O caminho: da Function até o agente

Aqui está a parte boa: o caminho é o mesmo do post [2]. A Function nada mais é do que uma API REST, então a gente usa o wizard de REST API do Copilot Studio. O fluxo é esse:

  • HTTP trigger: sua Function já está exposta por HTTP, com uma URL do tipo https://minhafunc.azurewebsites.net/api/pedido/123.

  • OpenAPI: você descreve a Function num arquivo OpenAPI, igual fizemos com a BrasilAPI. Um detalhe importante: o Copilot Studio trabalha com OpenAPI 2.0 (Swagger) por baixo. Se você subir um 3.0 ele converte sozinho, mas se der erro estranho, vale gerar já em 2.0.

  • REST API tool: no agente, Add a tool, aba REST API, sobe o OpenAPI, e segue o mesmo wizard de upload, plugin details, autenticação, select tools e publish.

  • O agente chama: a tool entra na aba Tools com Trigger by agent, e o modelo decide chamar a sua Function quando o usuário perguntar algo que precise dela.

Um perrengue que vale avisar, porque pega muita gente: na hora de descrever o host no OpenAPI, coloca só o domínio, sem o https://. Se você botar o esquema junto (https://minhafunc.azurewebsites.net) o wizard reclama. O certo é minhafunc.azurewebsites.net no host e o https vai no campo de schemes.


Autenticação com function key

Lembra do auth_level=FUNCTION lá no código? É agora que ele importa. Na etapa de Authentication do wizard você escolhe API key e configura a function key pra ir no header x-functions-key (dá pra mandar como query ?code= também, mas header é mais limpo). A partir daí o agente manda a chave em toda chamada, e a sua Function continua protegida, sem ficar aberta pra qualquer um.

Reginaldo, e se eu quiser algo mais corporativo que uma chave?

Aí você vai de OAuth com Entra ID, e o caminho passa a ser um custom connector no Power Platform em vez do REST API direto. Pra começar e pra cenário interno, a function key resolve muito bem e é o que eu usaria no primeiro momento.


RESUMO

  • Uma Azure Function com HTTP trigger é o jeito de dar pro agente a sua lógica, não só leitura de dado de fora.

  • O caminho é o mesmo do post [2]: descreve a Function num OpenAPI e sobe como REST API tool.

  • O Copilot Studio usa OpenAPI 2.0 por baixo (converte o 3.0 sozinho). No host, só o domínio, sem https://.

  • Autenticação com function key: escolhe API key no wizard e manda no header x-functions-key.

  • Pra auth corporativa (OAuth / Entra ID), o caminho vira custom connector no Power Platform.

Com isso o agente já roda o seu próprio código serverless. No último post da série a gente sobe o degrau final e conecta o Databricks como tool, e aí junta de vez o mundo de agentes com o mundo de dados, que é a alma desse blog.

Referências:

https://learn.microsoft.com/en-us/microsoft-copilot-studio/agent-extend-action-rest-api

https://learn.microsoft.com/en-us/azure/azure-functions/functions-bindings-http-webhook-trigger

Fique bem e até a próxima.

#copilotstudio #azurefunctions #restapi #ia #agentes #datainaction

#copilotstudio#azurefunctions#restapi#ia#agentes#datainaction

Gostou? Tem mais no YouTube e no LinkedIn.

← Voltar ao blog