Uso de herramientas
Añade function calling a tu app: define herramientas, lee bloques tool_use, controla tool_choice y haz llamadas en paralelo, al estilo Anthropic y OpenAI.
Function calling en el endpoint nativo de Anthropic. La API normaliza tool_choice para que los SDK antiguos que emiten {type:any} o {type:tool} sigan funcionando.
Todos los modelos, capacidades y precios Índice de la documentación para agentes de IA:https://oneprovider.dev/docs/llms.txt Forma de la solicitud
Declara las herramientas como un arreglo. Cada herramienta tiene un name, una description y un input_schema en JSON Schema. El modelo emite un bloque de contenido tool_use cada vez que decide llamar a una.
{
"model": "claude-sonnet-5-5",
"max_tokens": 1024,
"tools": [
{
"name": "get_weather",
"description": "Return current weather for a city.",
"input_schema": {
"type": "object",
"properties": {
"city": { "type": "string" },
"units": { "type": "string", "enum": ["c", "f"] }
},
"required": ["city"]
}
}
],
"messages": [
{ "role": "user", "content": "What's the weather in Berlin in celsius?" }
]
} Respuesta con una llamada a una herramienta
json{
"id": "msg_01...",
"stop_reason": "tool_use",
"content": [
{ "type": "text", "text": "Let me check that for you." },
{
"type": "tool_use",
"id": "toolu_bdrk_01...",
"name": "get_weather",
"input": { "city": "Berlin", "units": "c" }
}
]
} Continuar el ciclo
Cuando tu código ejecute la herramienta, devuelve el resultado como un mensaje user que contenga un bloque tool_result. Entonces el modelo emite otra llamada a una herramienta o una respuesta de texto final.
{
"role": "user",
"content": [
{
"type": "tool_result",
"tool_use_id": "toolu_bdrk_01...",
"content": "{\"city\":\"Berlin\",\"temp_c\":18,\"sky\":\"clear\"}"
}
]
} tool_choice: cómo lo normalizamos
Anthropic acepta cuatro formas de tool_choice. La API de OneProvider acepta las cuatro desde tu cliente, pero pasa dos de ellas al modelo en otra forma:
| El cliente envía | El modelo recibe | Por qué |
|---|---|---|
{"type":"auto"} (o ausente) | sin cambios | El modelo decide: el caso normal. |
{"type":"none"} | sin cambios | Fuerza una respuesta solo de texto. |
{"type":"any"} | {"type":"auto"} + indicación del sistema | No todos los modelos admiten llamadas forzadas a herramientas; la indicación le dice al modelo “you MUST call a tool” (debes llamar a una herramienta). |
{"type":"tool","name":"X"} | {"type":"auto"} + indicación del sistema | Igual; la indicación nombra la herramienta. |
tool_choice:any y tool_choice:tool fallarían en algunos modelos. Con auto y una indicación de sistema firme, cerca del 95 % de estas solicitudes funcionan en nuestras pruebas. Si ves que una llamada a una herramienta que esperabas se sustituye por texto, la indicación no bastó para orientar al modelo: afina tu prompt de usuario o cambia a un modelo más capaz. Llamadas paralelas a herramientas
Una misma respuesta puede contener varios bloques tool_use: el modelo decide si hace varias llamadas en paralelo. Ejecútalas todas y devuelve un único mensaje user con varios bloques tool_result (uno por tool_use_id). El orden no importa.
Nombres de herramientas
- Los nombres distinguen mayúsculas de minúsculas y pasan tal cual: el modelo repite lo que registraste.
- Funcionan tanto
snake_casecomoPascalCase. La CLI de Claude Code usa PascalCase (Read,Bash,Edit); los SDK genéricos suelen usar snake_case. - Mantén los nombres por debajo de 64 caracteres y en ASCII
[a-zA-Z0-9_].
Llamadas a herramientas al estilo OpenAI
En el endpoint /v1/chat/completions , usa la forma estándar de OpenAI con tools / tool_calls: la traducimos por dentro a bloques tool_use de Anthropic.
Respuestas rápidas
¿Qué base URL uso?
Claude Code y los SDK de Anthropic usan https://api.oneprovider.dev. Los SDK de OpenAI y los clientes compatibles con OpenAI usan https://api.oneprovider.dev/v1. Una misma clave funciona con ambas; la lista de modelos está en la página de modelos y las tarifas, en la página de precios .
¿Cómo me autentico?
Envía la clave sk-… tal cual en x-api-key o en Authorization: Bearer: en uno de los dos, nunca en ambos. Guarda la clave en una variable de entorno, no en un archivo que se suba al repositorio. Más sobre la autenticación .
¿Dónde obtengo una clave?
Abre tu panel en el bot de Telegram @oneprovider_robot o en app.oneprovider.dev, recarga el saldo y pulsa “Emitir una clave”. Cada clave puede tener su propio límite de gasto. Panel y claves de API .
¿Qué significan 401, 404 y 429?
401: falta la clave, está mal escrita o se envió en un encabezado equivocado; pega la clave completa, sin comillas ni espacios. 404: casi siempre es una base URL incorrecta, por ejemplo con /v1 ausente o duplicado. 429 con “Insufficient balance”: se agotó el saldo del panel o el límite de gasto de la clave, así que recarga en lugar de reintentar; cualquier otro 429 es un límite de frecuencia, así que espera según Retry-After. Detalles: códigos de error y solución de problemas .
¿Por qué se cortan o se reinician los streams?
Las VPN y los proxies VLESS suelen almacenar SSE en búfer o romper la negociación de HTTP/2. OneProvider no tiene restricciones regionales y no almacena los streams en búfer: desactiva el proxy y reintenta.
¿Dónde pregunto si esto no basta?
Escribe a @Oneproviderhelpbot en Telegram o abre “Soporte” en el panel web, con el código de estado HTTP y el mensaje de error exacto. Cómo funciona el soporte .
Última actualización: 2026-11-08 ¿Encontraste un error? @Oneproviderhelpbot