Dominar a chamada de ferramentas (Tool Calling) com Ollama e Python
A chamada de ferramentas (tool calling) transforma um modelo que apenas gera texto em um agente capaz de acionar código real: chamar uma API de previsão do tempo, consultar uma base de dados, executar um cálculo. Este guia mostra como dominar a chamada de ferramentas com Ollama em Python de ponta a ponta — formato JSON das ferramentas, laço de execução, streaming das chamadas de ferramentas (série 0.17) e saídas estruturadas restritas por um JSON Schema aplicado diretamente à decodificação. Tudo roda localmente em http://localhost:11434, sem chave de API nem vazamento de dados.
#Por que a chamada de ferramenta (tool calling)?
Um LLM, por si só, não sabe nada do mundo real após seu treinamento: ele não conhece o tempo de hoje, o saldo de uma conta nem o conteúdo do seu banco de dados. A chamada de ferramenta preenche essa lacuna. Você descreve ao modelo uma lista de funções disponíveis, ele decide quais chamar e com quais argumentos, seu código as executa e depois retorna o resultado ao modelo para que ele redija uma resposta informada.
O ponto crucial a entender: o modelo nunca executa nada por si só. Ele apenas gera uma solicitação estruturada — “chame get_meteo com ville='Lyon'”. É o seu programa Python que executa a função e mantém o controle total. Essa separação é o que torna a chamada de ferramentas segura e previsível.
- Dados atualizados
- O modelo consulta uma API em tempo real, em vez de adivinhar com base em suas lembranças do treinamento.
- Ações concretas
- Criar um ticket, enviar um e-mail, escrever em um banco de dados — o LLM coordena, seu código age.
- Confiabilidade
- Os cálculos e as buscas exatas são delegados a código determinístico, em vez de serem inventados pelo modelo.
- 100 % local
- Com Ollama, toda a cadeia permanece na sua máquina: sem chave API, sem requisição de saída, sem fatura por token.
#Como funciona a chamada de ferramentas no Ollama
Este guia leva você ao modelo. O kit leva você ao copiloto que programa no seu editor.
- Espaço online vitalício
- PDF + arquivos
- Atualizações vitalícias
O ciclo completo é composto por cinco etapas. Visualizá-lo bem evita a confusão mais comum: acreditar que uma única chamada é suficiente. São necessárias pelo menos duas — uma para obter a solicitação de ferramenta, outra para obter a resposta final.
- 01Você envia a pergunta + as ferramentasA requisição de chat contém a mensagem do usuário e a lista das ferramentas disponíveis (parâmetro tools).
- 02O modelo retorna uma solicitação de ferramentaEm vez de responder em texto, ele retorna um ou mais tool_calls com o nome da função e os argumentos.
- 03Seu código executa a funçãoVocê recupera name e arguments, chama a função Python real correspondente e obtém um resultado.
- 04Você retorna o resultadoO resultado é adicionado ao histórico como uma mensagem com o papel “tool”, depois você chama chat novamente.
- 05O modelo redige a resposta finalCom base no resultado, ele produz, desta vez, uma resposta em linguagem natural para o usuário.
#Pré-requisitos
Três componentes: o daemon Ollama em execução, um modelo que realmente suporte ferramentas e a biblioteca Python oficial. Atenção ao segundo ponto — nem todos os modelos sabem fazer chamadas de ferramentas. Prefira famílias recentes projetadas para isso.
- Ollama atualizado
- Série 0.17 ou mais recente para aproveitar o streaming das chamadas de ferramentas. O daemon escuta em http://localhost:11434.
- Um modelo compatível com ferramentas
- Qwen 3.5, Granite 4.2, Mistral Small, Devstral, gpt-oss. Modelos marcados como "tools" no ollama.com/library.
- VRAM suficiente
- Um pequeno modelo (Qwen 3.5 4B ≈ 3,4 GB) é suficiente para testes; um Granite 4.2 8B (≈ 5,3 GB) ou um Qwen 3.5 9B (≈ 6,6 GB) segue melhor as instruções multi-ferramenta. RTX 3060 12 GB como entrada de nível básico.
- A biblioteca ollama
- pip install -U ollama. Ela sabe construir o esquema de uma ferramenta diretamente a partir de uma função Python tipada.
#O formato JSON das ferramentas
Uma ferramenta é descrita com um esquema JSON estritamente alinhado ao da OpenAI: um objeto type: "function" contendo um nome, uma descrição e um objeto parameters no formato JSON Schema. A descrição é fundamental — é ela que o modelo lê para decidir quando e como chamar a ferramenta. Seja explícito.
#Primeira chamada de ferramenta em Python
Vamos começar pelo caso mais simples: uma função, uma pergunta, e observamos o que o modelo decide. As anotações de tipo e a docstring servem para gerar o esquema enviado ao modelo.
Nesta etapa, message.content geralmente está vazio: o modelo retornou sua solicitação em message.tool_calls. Cada tool_call expõe function.name (uma string) e function.arguments (já desserializado em um dicionário Python pela biblioteca). Resta apenas executar e retornar.
#O loop completo de execução
Aqui está a estrutura reutilizável de um agente que faz chamadas de ferramentas: um dicionário que associa cada nome de ferramenta à sua função, a execução das chamadas solicitadas, a adição dos resultados ao histórico e, em seguida, uma segunda chamada para a resposta final. Envolvemos tudo em um laço para lidar com o caso em que o modelo encadeia chamadas a várias ferramentas.
A mensagem de resultado tem o papel tool e um campo tool_name que indica a qual chamada ela responde. O campo content deve ser uma string: serialize seus objetos (json.dumps) antes de retorná-los. O modelo relê esse conteúdo como se fosse uma observação do mundo.
#Paridade com a OpenAI: o mesmo código com o cliente openai
Ollama expõe um endpoint compatível com OpenAI em /v1. Se seu código já utiliza o cliente openai, você quase não precisa mudar nada: aponte base_url para Ollama e use uma chave de API fictícia. O formato das ferramentas e dos tool_calls é idêntico — é a “paridade OpenAI” que torna a migração trivial.
#Streaming de chamadas de ferramentas (série 0.17)
Historicamente, ativar o streaming desativava o tool calling: era necessário escolher. Desde a série 0.17, o Ollama consegue transmitir chamadas de ferramentas em streaming ao longo da geração. Na prática, você recebe os tool_calls nos blocos (chunks) do fluxo, junto com o texto, se houver, o que permite exibir uma resposta fluida enquanto aciona ferramentas.
#Saídas estruturadas: forçar um JSON Schema
O tool calling serve para agir; as saídas estruturadas servem para garantir o formato da resposta. Com o parâmetro format, você fornece um JSON Schema que o Ollama aplica durante a decodificação: o modelo é limitado, token por token, a produzir apenas uma saída válida de acordo com o esquema. Chega de parsing frágil de JSON aproximado — a estrutura é garantida por construção.
O mais prático em Python é definir a estrutura com um modelo Pydantic, depois obter o esquema por meio de model_json_schema(). Em seguida, você recebe um objeto tipado e validado.
#Tratamento de erros e armadilhas comuns
A chamada de ferramentas raramente falha de forma evidente: na maioria das vezes, o modelo 'sai dos trilhos' silenciosamente. Veja as falhas frequentes e como lidar com elas.
- Nenhum tool_call retornado
- O modelo respondeu em texto quando deveria ter usado uma ferramenta. Melhore a descrição da ferramenta ou mude de modelo: os modelos pequenos costumam errar ao decidir se devem chamar uma ferramenta.
- Argumentos faltando ou incorretos
- function.arguments pode omitir um campo required ou atribuir a ele um tipo incorreto. Valide com Pydantic ou com um try/except antes de chamar a função real e retorne o erro ao modelo como resultado da ferramenta.
- Ferramenta alucinada
- O modelo cria um nome de função inexistente. Por isso, o OUTILS.get(name) retorna uma mensagem de erro em vez de travar — assim, o modelo pode se corrigir na rodada seguinte.
- Loop infinito de ferramentas
- Um modelo pode solicitar a mesma ferramenta indefinidamente. Adicione um contador com um limite máximo de iterações (ex.: 5) para interromper o loop e evitar que ele continue executando sem produzir resultados.
- Contexto truncado
- Ollama limita às vezes o contexto a 2048 tokens por padrão, o que apaga o histórico de ferramentas em sessões longas. Aumente num_ctx através das opções do modelo.
- Resultado não serializado
- Retornar um objeto Python bruto como content quebra a requisição. Sempre serialize em uma string (json.dumps ou str) antes de adicioná-lo às mensagens.
A ideia principal: nunca deixar um erro de ferramenta fazer o agente travar. Retorne a mensagem de erro ao modelo como se fosse um resultado. Um bom modelo lê “ferramenta desconhecida” ou “argumento ausente” e ajusta sua próxima chamada por conta própria.
#Para se aprofundar
Agora você sabe fazer chamadas de ferramentas com o Ollama em Python: formato JSON das ferramentas, loop de execução, paridade com a OpenAI, streaming e saídas estruturadas restritas por um esquema. Estes guias dão continuidade ao tema naturalmente.
- A API REST do Ollama
- « Integrar Ollama em uma aplicação Python via API REST » — os fundamentos do endpoint :11434, do streaming e do modo JSON, que servem de base para todo este guia.
- Agentes com LangChain
- « Criar um agente de IA local em Python com LangChain e Ollama » — orquestrar várias ferramentas e memória em uma camada acima das chamadas diretas a ferramentas.
- Escolher sua quantização
- « Escolher a quantização (Q4, Q5, Q8, FP16) » — para equilibrar VRAM e qualidade do modelo que controlará suas ferramentas.
Um comentário, um erro ou uma observação? Avise-nos; isso ajuda a melhorar o guia para todos.