PolarPOLAR

Function Calling

Integre ferramentas e funções externas aos modelos Urso com tool calling compatível com MCP.

Visão Geral

Function calling permite que os modelos Urso chamem funções externas durante a geração de respostas. O modelo decide quando e qual função chamar com base no contexto da conversa, retornando os argumentos estruturados para que sua aplicação execute a função e envie o resultado de volta.

A Polar também oferece ferramentas brasileiras nativas integradas (CEP, CNPJ, legislação, busca web).

Endpoint

POST https://api.polar-ai.com/v1/chat/completions

Use o endpoint de Chat Completions com o parâmetro tools.

Definindo Ferramentas

Cada ferramenta é definida com um nome, descrição e esquema de parâmetros JSON Schema:

{
  "type": "function",
  "function": {
    "name": "consultar_cep",
    "description": "Consulta informações de endereço a partir de um CEP brasileiro",
    "parameters": {
      "type": "object",
      "properties": {
        "cep": {
          "type": "string",
          "description": "CEP no formato 00000-000 ou 00000000"
        }
      },
      "required": ["cep"]
    }
  }
}

Parâmetro tool_choice

Controle quando o modelo deve usar ferramentas:

ValorDescrição
"auto"O modelo decide se deve chamar ferramentas (padrão)
"required"O modelo deve chamar pelo menos uma ferramenta
"none"O modelo não deve chamar ferramentas
{"type": "function", "function": {"name": "..."}}Força uma ferramenta específica

Fluxo Completo

Python

import json
from openai import OpenAI

client = OpenAI(
    base_url="https://api.polar-ai.com/v1",
    api_key="pk-your-key-here"
)

# 1. Definir ferramentas
tools = [
    {
        "type": "function",
        "function": {
            "name": "consultar_cep",
            "description": "Consulta informações de endereço a partir de um CEP brasileiro",
            "parameters": {
                "type": "object",
                "properties": {
                    "cep": {
                        "type": "string",
                        "description": "CEP no formato 00000-000"
                    }
                },
                "required": ["cep"]
            }
        }
    },
    {
        "type": "function",
        "function": {
            "name": "consultar_cnpj",
            "description": "Consulta dados de uma empresa a partir do CNPJ",
            "parameters": {
                "type": "object",
                "properties": {
                    "cnpj": {
                        "type": "string",
                        "description": "CNPJ no formato 00.000.000/0000-00"
                    }
                },
                "required": ["cnpj"]
            }
        }
    }
]

# 2. Enviar mensagem com ferramentas
messages = [
    {"role": "user", "content": "Qual o endereço do CEP 01001-000?"}
]

response = client.chat.completions.create(
    model="urso-base",
    messages=messages,
    tools=tools,
    tool_choice="auto"
)

message = response.choices[0].message

# 3. Verificar se o modelo quer chamar uma ferramenta
if message.tool_calls:
    # Adicionar mensagem do assistente ao histórico
    messages.append(message)

    for tool_call in message.tool_calls:
        function_name = tool_call.function.name
        arguments = json.loads(tool_call.function.arguments)

        # 4. Executar a função
        if function_name == "consultar_cep":
            result = consultar_cep(arguments["cep"])
        elif function_name == "consultar_cnpj":
            result = consultar_cnpj(arguments["cnpj"])

        # 5. Enviar resultado da ferramenta
        messages.append({
            "role": "tool",
            "tool_call_id": tool_call.id,
            "content": json.dumps(result)
        })

    # 6. Obter resposta final do modelo
    final_response = client.chat.completions.create(
        model="urso-base",
        messages=messages,
        tools=tools
    )

    print(final_response.choices[0].message.content)

TypeScript

import OpenAI from "openai";

const client = new OpenAI({
  baseURL: "https://api.polar-ai.com/v1",
  apiKey: "pk-your-key-here",
});

const tools: OpenAI.Chat.ChatCompletionTool[] = [
  {
    type: "function",
    function: {
      name: "consultar_cep",
      description: "Consulta informações de endereço a partir de um CEP brasileiro",
      parameters: {
        type: "object",
        properties: {
          cep: {
            type: "string",
            description: "CEP no formato 00000-000",
          },
        },
        required: ["cep"],
      },
    },
  },
];

const messages: OpenAI.Chat.ChatCompletionMessageParam[] = [
  { role: "user", content: "Qual o endereço do CEP 01001-000?" },
];

const response = await client.chat.completions.create({
  model: "urso-base",
  messages,
  tools,
  tool_choice: "auto",
});

const message = response.choices[0].message;

if (message.tool_calls) {
  messages.push(message);

  for (const toolCall of message.tool_calls) {
    const args = JSON.parse(toolCall.function.arguments);
    const result = await consultarCep(args.cep);

    messages.push({
      role: "tool",
      tool_call_id: toolCall.id,
      content: JSON.stringify(result),
    });
  }

  const finalResponse = await client.chat.completions.create({
    model: "urso-base",
    messages,
    tools,
  });

  console.log(finalResponse.choices[0].message.content);
}

curl

curl -X POST https://api.polar-ai.com/v1/chat/completions \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer pk-your-key-here" \
  -d '{
    "model": "urso-base",
    "messages": [
      {"role": "user", "content": "Qual o endereço do CEP 01001-000?"}
    ],
    "tools": [
      {
        "type": "function",
        "function": {
          "name": "consultar_cep",
          "description": "Consulta informações de endereço a partir de um CEP brasileiro",
          "parameters": {
            "type": "object",
            "properties": {
              "cep": {
                "type": "string",
                "description": "CEP no formato 00000-000"
              }
            },
            "required": ["cep"]
          }
        }
      }
    ],
    "tool_choice": "auto"
  }'

Resposta com Tool Call

Quando o modelo decide chamar uma ferramenta:

{
  "id": "chatcmpl-abc123",
  "choices": [
    {
      "index": 0,
      "message": {
        "role": "assistant",
        "content": null,
        "tool_calls": [
          {
            "id": "call_abc123",
            "type": "function",
            "function": {
              "name": "consultar_cep",
              "arguments": "{\"cep\": \"01001-000\"}"
            }
          }
        ]
      },
      "finish_reason": "tool_calls"
    }
  ]
}

Ferramentas Brasileiras Nativas

A Polar oferece ferramentas nativas que podem ser habilitadas automaticamente:

FerramentaDescrição
polar_cep_lookupConsulta de endereço por CEP via ViaCEP
polar_cnpj_queryConsulta de dados empresariais por CNPJ
polar_legislation_searchBusca na legislação brasileira federal e estadual
polar_web_searchBusca na web em português brasileiro

Usando Ferramentas Nativas

response = client.chat.completions.create(
    model="urso-pro",
    messages=[
        {"role": "user", "content": "Busque a empresa com CNPJ 00.000.000/0001-91 e me diga o endereço dela."}
    ],
    tools=[
        {"type": "function", "function": {"name": "polar_cnpj_query"}},
        {"type": "function", "function": {"name": "polar_cep_lookup"}}
    ],
    tool_choice="auto"
)

Multi-turno com Ferramentas

O modelo pode chamar múltiplas ferramentas em sequência para resolver tarefas complexas:

messages = [
    {
        "role": "system",
        "content": "Você é um assistente jurídico. Use as ferramentas disponíveis para fundamentar suas respostas."
    },
    {
        "role": "user",
        "content": "Preciso saber se existe alguma lei federal sobre proteção de dados que se aplique à empresa no CNPJ 12.345.678/0001-90."
    }
]

# O modelo pode chamar polar_cnpj_query para dados da empresa
# e depois polar_legislation_search para buscar legislação relevante

Dicas de Uso

  • Forneça descrições claras e detalhadas para cada ferramenta
  • Use tool_choice="required" quando a ferramenta sempre deve ser usada
  • Valide os argumentos retornados pelo modelo antes de executar a função
  • Trate erros de ferramentas e envie mensagens de erro informativas ao modelo

Próximos Passos

On this page