DesarrolloAvanzado35 min
Function Calling & Tool Use Avanzado
Schemas · Validación · Chains · el poder real de Claude
ToolsFunctionsSchemas
✓ Guía gratuita · Acceso completo
Mapa rápido · salta al paso que te interese
01
Anatomía de un Tool: Schema JSON + Handler
Un tool tiene 2 partes: el schema que le dice a Claude qué puede hacer, y el handler que ejecuta la acción. Claude lee el schema, decide cuándo usarlo, y te pasa los argumentos.
Estructura de un tool
// El schema le dice a Claude qué hace el tool y qué parámetros acepta
const tool: Anthropic.Tool = {
name: 'send_email',
description: 'Envía un email a un destinatario. Usar solo cuando el usuario pida explícitamente enviar un email.',
input_schema: {
type: 'object',
properties: {
to: {
type: 'string',
format: 'email',
description: 'Email del destinatario',
},
subject: {
type: 'string',
maxLength: 200,
description: 'Asunto del email (max 200 chars)',
},
body: {
type: 'string',
description: 'Contenido del email en texto plano o HTML',
},
priority: {
type: 'string',
enum: ['low', 'normal', 'high'],
default: 'normal',
description: 'Prioridad del email',
},
},
required: ['to', 'subject', 'body'],
},
}
// El handler ejecuta la acción
async function handleSendEmail(args: {
to: string
subject: string
body: string
priority?: string
}): Promise<string> {
const result = await resend.emails.send({
from: 'noreply@example.com',
to: args.to,
subject: args.subject,
html: args.body,
})
return JSON.stringify({ success: true, id: result.id })
}| Campo del Schema | Qué hace | Tip |
|---|---|---|
| name | Identificador único del tool | snake_case, descriptivo |
| description | Le dice a Claude cuándo usarlo | Incluí restricciones aquí |
| input_schema | JSON Schema de los parámetros | Usa descriptions en cada property |
| required | Parámetros obligatorios | Menos = más flexible |
⚠ Advertencia
La description es crítica. Claude decide si usar el tool basándose en la description. Si es vaga, lo va a usar mal. Si es muy específica, no lo va a usar cuando debería.
02
Patterns avanzados
Patterns que hacen la diferencia entre tools que funcionan y tools de producción.
Claude puede llamar múltiples tools en secuencia. El loop sigue hasta que Claude termina.
Agentic loop
async function agentLoop(prompt: string, tools: Anthropic.Tool[]): Promise<string> {
let messages: Anthropic.MessageParam[] = [
{ role: 'user', content: prompt }
]
while (true) {
const response = await anthropic.messages.create({
model: 'claude-sonnet-4-20250514',
max_tokens: 4096,
tools,
messages,
})
// Si Claude terminó, devolver el resultado
if (response.stop_reason === 'end_turn') {
const text = response.content.find(c => c.type === 'text')
return text?.text || ''
}
// Si Claude quiere usar tools, ejecutarlos
if (response.stop_reason === 'tool_use') {
const toolCalls = response.content.filter(c => c.type === 'tool_use')
// Ejecutar todos los tools en paralelo
const results = await Promise.all(
toolCalls.map(async (tc) => ({
type: 'tool_result' as const,
tool_use_id: tc.id,
content: await executeToolCall(tc.name, tc.input),
}))
)
// Agregar la respuesta de Claude y los resultados
messages.push({ role: 'assistant', content: response.content })
messages.push({ role: 'user', content: results })
}
}
}03
5 Tools de producción
Tools que vas a usar en casi cualquier proyecto.
{
name: 'web_search',
description: 'Busca información actualizada en internet',
input_schema: {
type: 'object',
properties: {
query: { type: 'string', description: 'Query de búsqueda' },
num_results: { type: 'number', default: 5, maximum: 10 },
},
required: ['query'],
},
}"Function calling convierte a Claude de un chatbot en un agente. Sin tools, Claude solo habla. Con tools, Claude hace. La diferencia es abismal."
— El Arsenal, Renderz Studio
Guías relacionadas
¿Quieres el sistema completo?
500+ páginas, 25 capítulos, código de producción, acceso a todas las guías del Arsenal.
Curso Completo · €29PayPal · Acceso inmediato