A pesquisa de ferramentas permite que o modelo pesquise e carregue ferramentas dinamicamente em seu contexto conforme necessário. Assim, você evita carregar todas as definições de ferramentas no contexto do modelo logo no início, o que pode ajudar a reduzir o uso total de tokens e os custos. Para otimizar o custo e a latência, a pesquisa de ferramentas foi projetada para preservar o cache do modelo. Quando o modelo descobre novas ferramentas, elas são inseridas no final da janela de contexto.
Na API Responses, somente gpt-5.4 e modelos posteriores oferecem suporte a tool_search.
A configuração e os exemplos a seguir usam a API Responses. Para carregamento de funções por sessão e descoberta automática de ferramentas MCP, consulte API de Agentes.
Para ativar a pesquisa de ferramentas na API Responses, você precisa fazer duas coisas:
- Adicione
tool_searchcomo uma ferramenta no seu arraytools. - Se estiver usando funções, marque com
defer_loading: trueaquelas cujo carregamento você quer adiar. Se estiver usando servidores MCP, configuredefer_loading: truena definição da ferramenta do servidor MCP.
Use espaços de nomes sempre que possível
Você pode usar a pesquisa de ferramentas com funções, espaços de nomes ou servidores MCP com carregamento adiado, mas recomendamos usar espaços de nomes ou servidores MCP sempre que possível. Nossos modelos foram treinados principalmente para pesquisar nesses conjuntos, nos quais a economia de tokens costuma ser mais significativa.
Para espaços de nomes, defer_loading se aplica às funções dentro do espaço de nomes, não ao objeto do espaço de nomes em si.
No início de uma solicitação, o modelo ainda vê o nome e a descrição de tudo o que pode ser pesquisado. Para um espaço de nomes ou servidor MCP, isso significa que o modelo vê inicialmente apenas o nome e a descrição do espaço de nomes ou servidor. Os detalhes das funções contidas nele só ficam visíveis quando a ferramenta de pesquisa de ferramentas as carrega. Para uma função individual com carregamento adiado, o modelo ainda vê o nome e a descrição da função; portanto, na prática, a pesquisa de ferramentas adia principalmente o carregamento do esquema de parâmetros.
Para maximizar a economia de tokens, recomendamos agrupar as funções com carregamento adiado em espaços de nomes ou servidores MCP com descrições gerais claras. Essas descrições devem dar ao modelo uma boa visão do conteúdo de cada grupo, para que ele possa pesquisar com eficiência e carregar apenas as funções relevantes. Como boa prática, procure manter menos de 10 funções em cada espaço de nomes para melhorar a eficiência no uso de tokens e o desempenho do modelo.
{
"tools": [
{
"type": "namespace",
"name": "crm",
"description": "CRM tools for customer lookup and order management.",
"tools": [
{
"type": "function",
"name": "list_open_orders",
"description": "List open orders for a customer ID.",
"defer_loading": true,
"parameters": {
"type": "object",
"properties": {
"customer_id": { "type": "string" }
},
"required": ["customer_id"],
"additionalProperties": false
}
}
]
},
{
"type": "tool_search"
}
]
}Os espaços de nomes podem combinar ferramentas com e sem carregamento adiado. Ferramentas sem defer_loading: true podem ser chamadas imediatamente, enquanto aquelas com carregamento adiado no mesmo espaço de nomes são carregadas por meio da pesquisa de ferramentas.
Tipos de pesquisa de ferramentas
Escolha entre dois tipos de pesquisa de ferramentas:
- Pesquisa de ferramentas hospedada: a OpenAI pesquisa entre as ferramentas com carregamento adiado que você declarou na solicitação e retorna o subconjunto carregado na mesma resposta.
- Pesquisa de ferramentas executada pelo cliente: o modelo emite um
tool_search_call, seu aplicativo realiza a pesquisa e você retorna umtool_search_outputcorrespondente.
Comece com a pesquisa de ferramentas hospedada se as ferramentas candidatas já forem conhecidas quando você criar a solicitação. Use a pesquisa de ferramentas executada pelo cliente quando a descoberta de ferramentas depender do estado do projeto, do estado do locatário ou de outro sistema controlado pelo seu aplicativo.
Pesquisa de ferramentas hospedada
A pesquisa de ferramentas hospedada é a opção mais simples quando você já conhece o inventário completo de funções, espaços de nomes ou servidores MCP que quer disponibilizar para a pesquisa do modelo. Você os declara logo no início, adiciona {"type": "tool_search"} e deixa a API decidir o que carregar.
from openai import OpenAI
client = OpenAI()
crm_namespace = {
"type": "namespace",
"name": "crm",
"description": "CRM tools for customer lookup and order management.",
"tools": [
{
"type": "function",
"name": "get_customer_profile",
"description": "Fetch a customer profile by customer ID.",
"parameters": {
"type": "object",
"properties": {
"customer_id": {"type": "string"},
},
"required": ["customer_id"],
"additionalProperties": False,
},
},
{
"type": "function",
"name": "list_open_orders",
"description": "List open orders for a customer ID.",
"defer_loading": True,
"parameters": {
"type": "object",
"properties": {
"customer_id": {"type": "string"},
},
"required": ["customer_id"],
"additionalProperties": False,
},
},
],
}
response = client.responses.create(
model="gpt-6-astra",
input="List open orders for customer CUST-12345.",
tools=[
crm_namespace,
{"type": "tool_search"},
],
parallel_tool_calls=False,
)
print(response.output)Se o modelo decidir que precisa de uma ferramenta com carregamento adiado, a resposta incluirá dois itens de saída adicionais antes da chamada de função subsequente:
tool_search_call, que registra a etapa de pesquisa hospedada.tool_search_output, que contém o subconjunto carregado de ferramentas que passam a poder ser chamadas.
[
{
"type": "tool_search_call",
"execution": "server",
"call_id": null,
"status": "completed",
"arguments": {
"paths": ["crm"]
}
},
{
"type": "tool_search_output",
"execution": "server",
"call_id": null,
"status": "completed",
"tools": [
{
"type": "namespace",
"name": "crm",
"description": "CRM tools for customer lookup and order management.",
"tools": [
{
"type": "function",
"name": "list_open_orders",
"description": "List open orders for a customer ID.",
"defer_loading": true,
"parameters": {
"type": "object",
"properties": {
"customer_id": { "type": "string" }
},
"required": ["customer_id"],
"additionalProperties": false
}
}
]
}
]
},
{
"type": "function_call",
"name": "list_open_orders",
"namespace": "crm",
"call_id": "call_abc123",
"arguments": "{\"customer_id\":\"CUST-12345\"}"
}
]No modo hospedado, execution é definido como server e call_id é definido como null.
Para tarefas mais complexas, o modelo também pode carregar vários espaços de nomes ou servidores MCP no mesmo tool_search_call. Por exemplo, se precisar de funções de diferentes espaços de nomes para concluir uma tarefa, ele poderá optar por pesquisar e carregar esses conjuntos juntos antes de fazer as chamadas de função subsequentes.
Pesquisa de ferramentas executada pelo cliente
A pesquisa de ferramentas executada pelo cliente dá ao seu aplicativo controle total sobre como a descoberta de ferramentas funciona. Isso é útil quando as ferramentas disponíveis dependem de informações que não é prático declarar na lista inicial de tools.
Configure a ferramenta tool_search com execution: "client" e um esquema para os argumentos de pesquisa que seu aplicativo espera:
from openai import OpenAI
client = OpenAI()
first_response = client.responses.create(
model="gpt-6-astra",
input="Find the shipping ETA tool first, then use it for order_42.",
tools=[
{
"type": "tool_search",
"execution": "client",
"description": "Find the project-specific tools needed to continue the task.",
"parameters": {
"type": "object",
"properties": {
"goal": {"type": "string"},
},
"required": ["goal"],
"additionalProperties": False,
},
}
],
parallel_tool_calls=False,
)
search_call = next(
item for item in first_response.output if item.type == "tool_search_call"
)
loaded_tools = [
{
"type": "function",
"name": "get_shipping_eta",
"description": "Look up shipping ETA details for an order.",
"defer_loading": True,
"parameters": {
"type": "object",
"properties": {
"order_id": {"type": "string"},
},
"required": ["order_id"],
"additionalProperties": False,
},
}
]
second_response = client.responses.create(
model="gpt-6-astra",
input=[
*first_response.output,
{
"type": "tool_search_output",
"execution": "client",
"call_id": search_call.call_id,
"status": "completed",
"tools": loaded_tools,
},
],
)
print(second_response.output)No primeiro turno, o modelo emite um tool_search_call e para nesse ponto:
[
{
"type": "tool_search_call",
"execution": "client",
"call_id": "call_abc123",
"status": "completed",
"arguments": {
"goal": "Find the shipping ETA tool for order_42."
}
}
]Seu aplicativo então realiza a pesquisa e retorna um tool_search_output com as ferramentas que deseja carregar:
[
{
"type": "tool_search_output",
"execution": "client",
"call_id": "call_abc123",
"status": "completed",
"tools": [
{
"type": "function",
"name": "get_shipping_eta",
"description": "Look up shipping ETA details for an order.",
"defer_loading": true,
"parameters": {
"type": "object",
"properties": {
"order_id": { "type": "string" }
},
"required": ["order_id"],
"additionalProperties": false
}
}
]
}
]No próximo turno, a ferramenta carregada pode ser chamada como uma função normal:
[
{
"type": "function_call",
"name": "get_shipping_eta",
"namespace": "get_shipping_eta",
"call_id": "call_xyz456",
"arguments": "{\"order_id\":\"order_42\"}"
}
]No modo cliente, execution é definido como client e call_id está definido. Repita no seu tool_search_output o mesmo call_id de tool_search_call.
Uso avançado
Mantenha claras as descrições dos espaços de nomes
Escreva descrições claras para os espaços de nomes que expliquem o caso de uso, pois o modelo se baseia nessa descrição para decidir quando carregar um subconjunto de funções daquele espaço de nomes. Evite descrições muito longas. Inclua os detalhes mais completos nas descrições das funções com carregamento adiado, que são carregadas somente quando necessário.
Entenda o que é carregado
tool_search_output.tools contém a lista de ferramentas carregadas dinamicamente pelo modelo. O modelo poderá chamar qualquer uma dessas ferramentas em turnos futuros; portanto, no modo cliente, você não precisa carregar a mesma ferramenta novamente a cada turno. As ferramentas que não constarem nesse array não estarão disponíveis para o modelo. Se quiser desativar uma ferramenta carregada, você pode removê-la do item tool_search_output em que define o conjunto de ferramentas carregadas, mas observe que alterar esse conjunto invalidará o cache do modelo daquele ponto em diante.
Padrões avançados de injeção
A maioria das integrações declara ferramentas no parâmetro tools da solicitação. A pesquisa de ferramentas executada pelo cliente também oferece suporte a padrões mais avançados, nos quais seu aplicativo retorna ferramentas que não estavam presentes na solicitação original. Trate isso como um fluxo de trabalho avançado: valide cuidadosamente os esquemas retornados e exponha apenas definições de ferramentas confiáveis.
Pesquisa de ferramentas e cache
Todas as ferramentas são carregadas no final da janela de contexto do modelo. Isso vale tanto para a pesquisa de ferramentas hospedada quanto para a executada pelo cliente. Assim, o cache do modelo pode ser preservado de uma solicitação para outra, reduzindo os custos totais e aumentando a velocidade.
Adicione ferramentas em um ponto específico da entrada
Em fluxos de trabalho avançados, você pode usar um item de entrada additional_tools para disponibilizar ferramentas em um ponto específico da conversa. Isso é útil quando seu aplicativo carrega ferramentas fora do fluxo normal de pesquisa de ferramentas ou precisa preservar a ordem das ferramentas adicionadas durante uma resposta anterior.
Defina role como developer e inclua as ferramentas a serem adicionadas no array tools do item:
{
"type": "additional_tools",
"role": "developer",
"tools": [
{
"type": "function",
"name": "get_customer",
"description": "Look up a customer by ID.",
"parameters": {
"type": "object",
"properties": {
"customer_id": { "type": "string" }
},
"required": ["customer_id"],
"additionalProperties": false
}
}
]
}As ferramentas de um item additional_tools só ficam disponíveis depois que esse item aparece na entrada. Ao receber e reenviar manualmente itens da conversa, preserve a posição do item para que o modelo veja as mesmas ferramentas no mesmo ponto da conversa.
API de Agentes
Por padrão, a API de Agentes carrega as definições de funções antecipadamente. Para adiar o carregamento de funções específicas, inclua { "type": "tool_search" } em agent.tools e defina defer_loading: true em cada função que você quer que o agente descubra sob demanda. Adicionar tool_search não adia o carregamento de todas as funções.
A solicitação da sessão continua fornecendo a definição completa da função, incluindo nome, descrição e esquema de argumentos. A pesquisa de ferramentas altera o momento em que essa definição chega ao modelo. Após a descoberta, seu aplicativo processa a chamada de função e retorna o resultado como de costume. Consulte Funções para saber como tratar os resultados.
Defina OPENAI_API_KEY antes de executar este exemplo:
import OpenAI from "openai";
const client = new OpenAI();
const result = await client.beta.agents.sessions.create({
agent: {
model: "gpt-6-astra",
tools: [
{
type: "tool_search",
},
{
type: "function",
name: "lookup_account",
description: "Find an account by its account number.",
parameters: {
type: "object",
properties: {
account_id: {
type: "string",
},
},
required: ["account_id"],
additionalProperties: false,
},
defer_loading: true,
},
],
},
environment: {
type: "none",
},
input: [
{
role: "user",
content: [
{
type: "input_text",
text: "Look up account 42.",
},
],
},
],
});
console.log(result.id);Escolha uma estratégia de carregamento de funções
| Estratégia | Configuração | Útil para | Contrapartida |
|---|---|---|---|
| Carregamento antecipado | Omita defer_loading ou defina seu valor como false. | Um pequeno conjunto de funções ou funções necessárias para a maioria das tarefas. | Definições não utilizadas ocupam espaço no contexto. Alterar uma definição pode invalidar um prefixo em cache. |
| Carregamento adiado | Defina defer_loading: true e inclua tool_search. | Um catálogo grande em que cada tarefa precisa de apenas algumas funções. | A descoberta adiciona uma etapa e depende de encontrar a ferramenta relevante. |
É possível combinar funções com carregamento antecipado e adiado em uma sessão da API de Agentes, mas isso geralmente não é recomendado. Dê nomes e descrições claros às funções com carregamento adiado. Compare a conclusão das tarefas, o uso de tokens de entrada e a latência com solicitações representativas antes de escolher uma estratégia padrão.
Ferramentas MCP e de plug-ins
As ferramentas MCP usam descoberta automática na API de Agentes quando o modelo e o provedor oferecem suporte à pesquisa de ferramentas. O ambiente de execução adia o carregamento das ferramentas MCP e adiciona a pesquisa de ferramentas quando há ferramentas com carregamento adiado disponíveis para pesquisa. Isso se aplica a servidores MCP remotos, servidores MCP do executor e ferramentas MCP fornecidas por plug-ins.
Você não precisa adicionar { "type": "tool_search" } apenas para ferramentas MCP nem definir em um servidor MCP a flag defer_loading, que se aplica a funções individuais. Configure o servidor usando Conexões MCP. A configuração da API Responses apresentada anteriormente neste guia não se aplica aos servidores MCP da API de Agentes.
Guias relacionados
- Use a chamada de função para definir funções que podem ser chamadas e ferramentas personalizadas.
- Consulte Como usar ferramentas para ter uma visão geral das ferramentas disponíveis na API Responses.