Saltar al contenido
CCAR-F English

Referencia Técnica

La superficie de API que no tocas a diario · nombres exactos, valores permitidos y qué se pregunta de cada uno

Los apuntes explican el porqué; esto es el qué. Está pensado para lo que no se te queda porque no lo escribes nunca: nombres de campos, valores admitidos y formas de retorno. El examen no te pide escribir código, pero sí reconocer el nombre correcto entre cuatro que suenan parecido.

Messages API POST /v1/messages

CampoObligatorioNotas
modelID de snapshot. Los IDs sin fecha siguen siendo snapshots fijos, no punteros móviles
messagesSolo roles user y assistant. Turnos consecutivos del mismo rol se combinan
max_tokens0 sirve para precalentar caché sin generar respuesta
systemNoParámetro top-level, string o array de bloques. No existe rol system
tools, tool_choiceNoVer sección de tool use
streamNotrue activa SSE
thinking, output_configNoVer razonamiento y salida estructurada
temperature, top_p, top_k, stop_sequencesNoMuestreo
metadata, service_tier, inference_geoNoinference_geo: "global" por defecto o "us", con recargo
Lo que se preguntaQue el system prompt es un parámetro aparte y que no existe el rol system dentro de messages. Es la diferencia más citada frente a otras APIs de chat.

Valores de stop_reason

ValorSignificaQué haces
end_turnTerminó de forma naturalCerrar el turno
tool_usePide ejecutar una o más toolsEjecutar y devolver tool_result; el bucle continúa
max_tokensSalida truncadaPuede romper JSON estricto. Reintentar con más presupuesto
stop_sequenceEncontró una secuencia de paradaTratar según tu protocolo
refusalRechazó responderDevuelve 200 y se factura. Prevalece sobre el esquema
pause_turnPausa en operación largaContinuar el turno
model_context_window_exceededSe pasó de ventanaCompactar o reducir contexto
Lo que se preguntatool_use frente a end_turn como control del bucle agéntico, y que refusal y max_tokens son los dos casos en que la salida estructurada puede no cumplir el esquema.

Tool use

Definición de una tool

{
  "name": "buscar_pedido",          // ^[a-zA-Z0-9_-]{1,64}$
  "description": "...",             // 3-4 frases mínimo, incluir cuándo NO usarla
  "input_schema": { ... },          // JSON Schema
  "input_examples": [ ... ]         // opcional, útil en inputs anidados
}

Valores de tool_choice

ValorEfecto
autoPor defecto cuando hay tools. El modelo decide
anyObliga a llamar alguna tool
toolObliga a una concreta (lleva name)
nonePor defecto cuando no hay tools

Con any o tool, la API hace prefill del turno: no habrá texto antes del tool_use. El paralelismo viene activado; se apaga con disable_parallel_tool_use: true dentro de tool_choice.

Devolver el resultado

{
  "role": "user",                   // no existe rol "tool"
  "content": [
    { "type": "tool_result",
      "tool_use_id": "toolu_...",   // obligatorio
      "content": "...",             // opcional
      "is_error": true },           // opcional: fallo legible para el modelo
    { "type": "text", "text": "..." } // el texto va DESPUÉS
  ]
}
Lo que se preguntaQue los tool_result van primeros en content y en el mensaje inmediatamente posterior al tool_use (si no, 400), y que un fallo se comunica con is_error, no con una excepción ni con un resultado vacío que el modelo confundiría con datos.

Message Batches

ConceptoValor
Descuento50% input y output
Límite por batch100.000 requests o 256 MB
VentanaMayoría menos de 1 h · resultados al terminar o a las 24 h · expiran a las 24 h
Resultados descargables29 días
processing_statusSolo in_progress y ended
Resultado por requestsucceeded · errored · canceled · expired (los tres últimos no se facturan)
No soportadostream: true, max_tokens: 0
Disponible enSolo Claude API y Claude Platform on AWS
Lo que se preguntaQue solo hay dos estados de batch, que no admite streaming, y que lanzar llamadas síncronas en paralelo no es batching porque no baja el coste por token.

Salida estructurada

Dos mecanismos: JSON outputs (esquema en output_config.format, restringe la respuesta final) y strict tool use (strict: true en una tool, valida los argumentos). Ambos por decodificación restringida.

Límite por requestValor
Tools con strict20
Parámetros opcionales, total24
Parámetros con tipos unión16
Timeout de compilación180 s
Caché de gramática24 h desde el último uso
AdmiteNo admite (400)
tipos básicos, enum escalar, const, anyOf, $ref interno, default, required, formatos de stringesquemas recursivos, $ref externo, minimum/maximum, minLength/maxLength, lookahead en pattern
Lo que se preguntaQue el prefill ya no vale para forzar JSON, que el casing de los enum no está garantizado, que las propiedades required salen primero en el orden, y que citations más structured outputs dan 400.

Hooks

EventoPara qué
PreToolUseValidar o bloquear antes de ejecutar
PostToolUseAñadir contexto, reemplazar la salida, auditoría
UserPromptSubmitInterceptar la entrada del usuario
SubagentStart / SubagentStopCiclo de vida de subagentes
PreCompactAntes de compactar (trigger: manual o auto)
SessionStart / SessionEnd / Stop / NotificationCiclo de vida y avisos

Forma de retorno de PreToolUse

{ "permissionDecision": "deny",        // allow | deny | ask | defer
  "permissionDecisionReason": "...",
  "updatedInput": { ... } }            // opcional
  • Exit 2 = error bloqueante, no anulable ni con un allow.
  • Silencio no es aprobación: un hook puede denegar, pero callarse deja seguir el flujo normal de permisos.
  • Los hooks corren en tu proceso, fuera de la ventana de contexto: no consumen tokens salvo lo que devuelvan.
Lo que se preguntaQue el hook es el mecanismo de enforcement determinista frente a una instrucción, que PreToolUse es donde se pone la frontera de acción que bloquea y registra antes de ejecutar, y que PostToolUse es el sitio del log de auditoría para un cliente regulado.

Agent SDK

OpciónQué hace
allowedToolsAuto-aprobación. Debe incluir la tool de spawn para usar subagentes
maxTurnsCuenta solo turnos con tool use
maxBudgetUsdCorta por coste; incluye el gasto de los subagentes
systemPromptSin él, prompt mínimo. Con preset, el prompt completo del CLI. O el tuyo
settingSourcesControla si se carga CLAUDE.md. Vacío lo desactiva
resume / forkSessionRetomar una sesión concreta / ramificarla en una nueva
permissionModedefault · acceptEdits · plan · auto · dontAsk · bypassPermissions

AgentDefinition de un subagente

{ "description": "...",   // obligatorio
  "prompt": "...",        // obligatorio - lo ÚNICO que cruza del padre
  "tools": [...],         // si se omite, hereda todas
  "model": "inherit",     // o un modelo concreto
  "skills": [...] }       // los subagentes NO precargan skills
Lo que se preguntaQue maxTurns no cuenta los turnos sin tools, que el presupuesto incluye a los subagentes, y que el subagente no hereda historial: solo el string del prompt.

MCP

PrimitivaLa controlaMétodos
ToolsEl modelotools/list · tools/call
ResourcesLa aplicación (solo lectura)resources/list · resources/read
PromptsEl usuarioprompts/list · prompts/get
DecisiónOpciones
Transportestdio (local) · Streamable HTTP (remoto o multi-desarrollador)
Scope en Claude Codelocal (personal) · project (.mcp.json, versionado) · user (todos tus proyectos)
Carga diferidadefer_loading en el toolset: difiere el contexto, no el payload

Nomenclatura en Claude Code: tools mcp__servidor__tool · prompts /mcp__servidor__prompt · resources @servidor:proto://ruta.

Lo que se preguntaQuién controla cada primitiva, que stdio no debería usar OAuth porque toma credenciales del entorno, y que un servidor stdio en .mcp.json parece compartible y no lo es.
Fuera del alcance del CCAR-F · 7

Esto no lo evalúa el CCAR-F. Se deja accesible porque saber qué no entra también ahorra tiempo, pero no lo estudies para este examen.

Los modos de interacción

Un desarrollador llega a Claude por una API REST, normalmente a través de un SDK. La elección del modo se decide con dos preguntas: ¿hay alguien esperando? y ¿es tiempo real o volumen offline?

ModoCuándo
SíncronoAlguien espera y la respuesta es corta. Lo más simple
StreamingAlguien espera y la respuesta es larga: compra latencia percibida a cambio de ensamblar tú la respuesta
Async / awaitNadie espera en ese instante, pero sigue siendo tiempo real: concurrencia sin bloquear
BatchNadie espera y es volumen offline: menor coste por token, latencia no determinista
Lo que se preguntaQue lanzar llamadas síncronas en paralelo no es batch: da concurrencia, no descuento. Y que streaming no acelera nada — mejora la latencia percibida.

La ventana de contexto y sus dos formas de romperse

Es un presupuesto fijo de tokens que sostiene la petición entera de golpe: system, historial, tools, documentos y la generación. Falla de dos maneras distintas, y el examen puede pedir distinguirlas:

SituaciónQué ocurre
La entrada ya no cabeError antes de generar. No hay respuesta parcial
Se toca el techo a mitad de generaciónSalida truncada con stop_reason: model_context_window_exceeded
Lo que se preguntaQue gestionar el historial es trabajo de la aplicación, no de la API. Nadie poda por ti: compactación, pruning y subagentes son decisiones tuyas.

Streaming stream: true

message_start
  content_block_start   // por cada bloque, con su index
  content_block_delta   // N veces
  content_block_stop    // AQUÍ el bloque está cerrado
message_delta           // usage acumulativo
message_stop            // AQUÍ el turno se confirma
Tipo de deltaContenido
text_deltaFragmento de texto
input_json_deltaJSON parcial del input de una tool. No parsear hasta content_block_stop
thinking_deltaFragmento de razonamiento
signature_deltaJusto antes de cerrar un bloque de thinking
Lo que se preguntaTres cosas: los errores llegan como event: error después de un HTTP 200; los bloques de tool use y thinking no se recuperan parcialmente (solo se reanuda desde el último bloque de texto); y un error de tool use al reintentar suele trazar a un bloque a medio construir, no al esquema.

Prompt caching cache_control

{ "type": "text", "text": "...",
  "cache_control": { "type": "ephemeral", "ttl": "1h" } }
// "ephemeral" es el único tipo. ttl opcional: por defecto 5 min
ParámetroValor
TTL5 min por defecto · 1 h extendido
Breakpoints máximos4 (el automático consume uno)
Lookback20 bloques por breakpoint
Precio de escritura1,25× (5 min) · 2× (1 h)
Precio de lectura0,1×
Jerarquía del prefijotoolssystemmessages
Mínimo cacheableEntre 512 y 4.096 tokens según modelo
Lo que se preguntaQue cambiar tools invalida todo el prefijo, que cambiar el nivel de effort también rompe la caché porque se renderiza en el prompt, y el fallo silencioso: por debajo del mínimo no cachea y no da error — se detecta con ambos contadores de caché a cero en usage.

Razonamiento y effort

ParámetroValoresNotas
thinking.typeadaptiveEl modelo decide. En los modelos actuales está siempre activo; desactivarlo da 400
thinking.typeenabled + budget_tokensDeprecado. Rechazado con 400 en modelos recientes
displaysummarized · omittedSe factura igual en ambos casos
output_config.effortmax · xhigh · high · medium · lowPor defecto high. Señal conductual, no presupuesto
El principio de fondoElegir modelo y elegir modo de razonamiento son dos palancas separadas y componibles. La regla es de suelo hacia arriba: el modelo más pequeño y el razonamiento y prompting más simples que pasen tu eval, y añadir capacidad solo donde la eval diga que hace falta. No al revés.
Lo que se preguntaQue los tokens de razonamiento se facturan como output y cuentan contra max_tokens aunque no se devuelva el texto, y que los bloques thinking llevan signature y deben devolverse sin modificar o la siguiente petición falla.

Errores y estrategia de reintento

CódigoTipo¿Reintentable?
400invalid_request_errorNo — arreglar la petición
401 / 403auth / permisosNo — credencial
413request_too_largeNo — trocear
429rate_limit_error, con backoff y respetando retry-after
500api_error
504timeout_error
529overloaded_error — sobrecarga global, no tuya

La clasificación de fallos

  • Primera pregunta ante cualquier fallo: ¿esperar y reintentar podría resolverlo?
  • Si sí → backoff exponencial con tope y presupuesto de reintentos. Nunca un bucle inmediato, que solo agrava el problema.
  • Si no → fallback con nombre. Sin él, la excepción no gestionada se convierte en el comportamiento por defecto, y una respuesta mala tumba el flujo entero.
  • Fallo de tool → vuelve al modelo con la bandera de error puesta, nunca escondido tras un resultado vacío que el modelo confundiría con datos.

Los SDK oficiales ya reintentan con backoff exponencial, 2 reintentos por defecto, respetando retry-after.

Evals: método de grading según la salida

Forma de la salidaGrader
Hay una forma correctaExact match
Salida estructuradaComprobación por código
Calidad abiertaJuez LLM, calibrado contra casos etiquetados por humanos antes de fiarte de él

Orden de preferencia oficial: código → LLM → humano. Sobre el humano, la doc dice literalmente «evítalo si puedes». Y el principio de diseño: más casos con señal algo peor y grading automático supera a pocos casos calificados a mano.

Lo que se preguntaQue la eval se escribe primero: identificar el comportamiento esperado te obliga a definir el éxito mientras el diseño todavía puede cambiar. Una eval convierte «está terminado» de una sensación en una puntuación sobre un conjunto fijo de casos.

Niveles de test y qué caza cada uno

NivelCaza
UnitErrores de lógica dentro de un componente
FuncionalQue un componente cumple su especificación
IntegraciónLa costura: el traspaso entre dos componentes que pasan por separado
End-to-endTodo el flujo. Dice que algo falla, no dónde
El patrón de diagnósticoUnits y funcionales en verde con el e2e en rojo significa que la rotura está en un traspaso, no dentro de un componente — y por definición eso es lo que cubre un test de integración. La respuesta completa tiene dos mitades: corregir en la costura y añadir el test de integración que faltaba. Una traza te dice qué paso produjo el mal resultado, que es lo que convierte un día de investigación en un arreglo corto.

El mismo instinto rige la recuperación de información: una sola búsqueda para consultas de un solo dato, búsqueda a lo largo de varias iteraciones cuando la pregunta es genuinamente multi-paso.

Límites y contadores

ConceptoValor
Tamaño de requestMessages 32 MB · Batch 256 MB · Files 500 MB
Timeout no-streaming10 minutos
Contar tokensPOST /v1/messages/count_tokensgratis, rate limit independiente
ITPMinput más creación de caché. Las lecturas de caché no cuentan
OTPMTokens realmente generados. max_tokens no influye
Cabecerasrequest-id en toda respuesta · anthropic-ratelimit-*-{limit,remaining,reset}
Degradación de selección de toolsPor encima de 30-50 tools disponibles
Coste de una imagen⌈ancho/28⌉ × ⌈alto/28⌉ visual tokens
Techo de imagenAlta resolución 2576 px / 4784 tokens · estándar 1568 px / 1568
Coste de multi-agenteMultiplica por el número de subagentes: ~15× en el caso publicado
Lo que se preguntaQue no puedes presupuestar lo que no mides: hay que instrumentar coste en tokens, latencia y tasa de error en cada llamada y luego ajustar una palanca elegida, en vez de adivinar mirando la factura. Y que el patrón orquestador-trabajadores solo se gana ese coste en tareas que se dividen en partes paralelas independientes, no en trabajo fuertemente acoplado que un solo agente resuelve por una fracción.