El limite de Claude Code
Publicado por Lino Uruñuela el 2026-03-12
Mis casos de uso de los LLMs
El otro día publiqué en LinkedIn mi opinión sobre Claude Code, y es que, con la suscripción de 18€, usando Claude vía web solo tardé una hora en llegar al límite de tokens por ese día. Y pensé... esto no es para mí, y realmente tal como lo estaba haciendo no era para mí.

Ejecuciones intensivas con LLMs
Una forma habitual en la que utilizo la IA es en procesos que realizan muchísimas llamadas a LLMs. Por ejemplo, ya desarrollé un buscador semántico de vídeo con los episodios de Search Console Central, (aquí explico cómo lo hice).
Ahora estoy transcribiendo todos los podcast de Itnig para crear un RAG, pero mucho más elaborado en cuánto al procesado de las transcripciones, generación de sinónimos, etc... espero sea la ostia.
El proceso que sigo para esta tarea es:
- Generar transcripciones, en este caso con faster-whisper
- Por cada transcripción:
- Dividir el texto en párrafos
Estos párrafos han de ser oherentes y con significado por sí mismos, con un máximo de 200 palabras aprox.
- Por cada párrafo obtengo:
- Query fan-outs, a mi manera...
- Entidades mencionadas.
- Titulares.
- Preguntas que tengan ese párrafo como respuesta.
- Extraigo marcas de tiempo para saber en qué segundo concreto comienza cada párrafo en el vídeo de YouTube.
- Por cada párrafo obtengo:
- Dividir el texto en párrafos
El proceso funciona muy bien, eso sí, son millones y millones de tokens, y si realizara el proceso ejecutando modelos de pago como Claude, Gemini o ChatGPT me podría arruinar.
Mi cambio de opinión sobre Claude Code
La segunda forma en la que uso la IA es para generar software, como la herramienta para monitorización de rankings de KWs y que en breve compartiré con todos.
Para este tipo de tarea siempre había estado usando LLMs vía web,muchas veces con los tres TOP a la vez: ChatGPT, Gemini, Claude...
Es aquí cuando llegamos a la publicación del otro día donde dije que para mis casos de uso no me servía Claude Code, pero he de reconocer que me había equivocado...
Decidí darle una oportunidad a Claude Code ya que había pagado la suscripción de 18€, y empecé a iterar con él. Como os imaginaréis, el terminal no me da ningún miedo, al contrario, me siento en mi zona de confort, así que no he tardado en pillarle el truco.
Tengo que decir que me ha sorprendido gratamente, y no por los resultados, ya que había leído, y mucho, lo bien que funcionaba pero mi sorpresa ha sido otra, desde que uso Claude Code no he llegado nunca al límite de tokens, y os aseguro que el uso que hago con Claude Code es muchísimo más intenso que usando la web.
No creo que la causa sea que Claude Code sea más eficaz y ahorre tokens, mi teoría es otra, creo que cuando lo ejecutas en la web, sobre todo para generar código, no nos damos cuenta de lo que hay bajo el capó. Y es que por cada petición ha de levantar un entorno aislado, que consume unos recursos de CPU. Debe instalar librerías, ejecutar código, etc., etc... todo eso vale dinero, quizás no mucho si solo mirásemos una ejecución, pero multiplícalo por cientos de millones...
Monitorizando cada llamada al LLM
Ahora tengo instalado, configurado y ejecutando un sistema para la observabilidad de cada llamada que realizo al LLM: el prompt solicitado, la respuesta que me da, cuántos tokens se han usado, cada llamada a herramientas que realiza... tanto en mis scripts con modelos locales como para cada ejecución de Claude Code.
Al tener observabilidad y trazabilidad además de poder realizar cálculos de costes, de latencia en la respuesta y otras métricas, también tengo plena capacidad para realizar el seguimiento completo de cada prompt ejecutado y de cada respuesta recibida.
El próximo paso que quiero dar es que los prompts se automejoren / optimicen. Al guardar todos los datos podemos usarlos para evaluar cada prompt y que se vayan refinando ellos solos automáticamente.
Además de mejorar la calidad de la respuesta, esto nos permite también no sufrir demasiado cada vez que se actualiza un modelo y los prompts que habías creado y afinado dedicándole muchas horas te dejen de funcionar, al poder probar y evaluar el cambio de modelo o versión con las respuestas históricas.
Uso de LLMs desde la línea de comandos
Habitualmente uso LLMs para muchísimas cosas desde el propio terminal de Linux. Y es que si estoy haciendo alguna tarea o proceso en el terminal y tengo dudas sobre cómo usar determinado comando o en qué ha fallado determinada ejecución en vez de irme a Chrome abri la URL de chatGPT / Gemini / Claude y resolver ahí mi duda lo hago directamente en el terminal.
Si hay algo en que los LLMs han demostrado su dominio desde hace mucho tiempo son los comandos básicos de Linux. Los saben utilizar de maravilla, y es normal, ya que el 99% de los comandos tienen más de 30 años y apenas han cambiado en cómo funcionan y cada vez tienen más muestras en sus entrenamientos y de hecho las herramientas del tipo Claude Code se basan principalmente en la ejecución de comandos
Para los que no estáis familiarizados con el terminal, con 3 o 4 comandos puedes hacer tareas que de primeras podrían parecer mucho más complejas. Algunos comandos tienen tantas opciones que es casi imposible dominarlos del todo y hasta hace la llegada de los LLMs muchas veces teníamos que consultar la documentación para acordarte cómo era o en que orden se ponían los parámetros y sus valores.
Una de las características más potentes de los comandos es que la salida de uno puede ser la entrada de otro... digamos que es un bucle en toda regla.
Un ejemplo práctico con 'curl' y 'jq'
Os voy a mostrar un par de ejemplos para ver si os pica la curiosidad:
Obtener términos relacionados en base a los productos de Amazon
curl -s "https://completion.amazon.co.uk/api/2017/suggestions?" \
-G \
--data-urlencode "prefix=zapatillas*" \
--data-urlencode "suffix=$modelo" \
--data-urlencode "session-id=260-6261272-2261010" \
--data-urlencode "customer-id=A2HLNXM8V9BK5Z" \
--data-urlencode "request-id=65EXKVSV12216V211E18" \
--data-urlencode "page-type=Gateway" \
--data-urlencode "lop=es_ES" \
--data-urlencode "site-variant=mobile" \
--data-urlencode "client-info=amazon-search-ui" \
--data-urlencode "mid=A1RKKUPIHCS9HS" \
--data-urlencode "alias=aps" \
--data-urlencode "event=onLoad" \
--data-urlencode "limit=141" \
--data-urlencode "suggestion-type=KEYWORD" \
--data-urlencode "suggestion-type=WIDGET" \
--data-urlencode "_=1589523257903"
Esto nos devuelve una cadena en formato JSON con los térmios que comienzan con "zapatillas" :
{"alias":"aps","prefix":"zapatillas","suffix":"","suggestions":[{"suggType":"KeywordSuggestion","type":"KEYWORD","value":"zapatillas hombre","refTag":"nb_sb_ss_mvt-t11-ranker_1_10","candidateSources":"local","strategyId":"mvt-t11-ranker","strategyApiType":"RANK","prior":0.0,"ghost":false,"help":false},{"suggType":"KeywordSuggestion","type":"KEYWORD","value":"zapatillas mujer","refTag":"nb_sb_ss_mvt-t11-ranker_2_10","candidateSources":"local","strategyId":"mvt-t11-ranker","strategyApiType":"RANK","prior":0.0,"ghost":false,"help":false},{"suggType":"KeywordSuggestion","type":"KEYWORD","value":"zapatillas skechers mujer","refTag":"nb_sb_ss_mvt-t11-ranker_3_10","candidateSources":"local","strategyId":"mvt-t11-ranker","strategyApiType":"RANK","prior":0.0,"ghost":false,"help":false},{"suggType":"KeywordSuggestion","type":"KEYWORD","value":"zapatillas niño","refTag":"nb_sb_ss_mvt-t11-ranker_4_10","candidateSources":"local","strategyId":"mvt-t11-ranker","strategyApiType":"RANK","prior":0.0,"ghost":false,"help":false},{"suggType":"KeywordSuggestion","type":"KEYWORD","value":"zapatillas running hombre","refTag":"nb_sb_ss_mvt-t11-ranker_5_10","candidateSources":"local","strategyId":"mvt-t11-ranker","strategyApiType":"RANK","prior":0.0,"ghost":false,"help":false},{"suggType":"KeywordSuggestion","type":"KEYWORD","value":"zapatillas casa hombre","refTag":"nb_sb_ss_mvt-t11-ranker_6_10","candidateSources":"local","strategyId":"mvt-t11-ranker","strategyApiType":"RANK","prior":0.0,"ghost":false,"help":false},{"suggType":"KeywordSuggestion","type":"KEYWORD","value":"zapatillas casa mujer","refTag":"nb_sb_ss_mvt-t11-ranker_7_10","candidateSources":"local","strategyId":"mvt-t11-ranker","strategyApiType":"RANK","prior":0.0,"ghost":false,"help":false},{"suggType":"KeywordSuggestion","type":"KEYWORD","value":"zapatillas adidas mujer","refTag":"nb_sb_ss_mvt-t11-ranker_8_10","candidateSources":"local","strategyId":"mvt-t11-ranker","strategyApiType":"RANK","prior":0.0,"ghost":false,"help":false},{"suggType":"KeywordSuggestion","type":"KEYWORD","value":"zapatillas nike hombre","refTag":"nb_sb_ss_mvt-t11-ranker_9_10","candidateSources":"local","strategyId":"mvt-t11-ranker","strategyApiType":"RANK","prior":0.0,"ghost":false,"help":false},{"suggType":"KeywordSuggestion","type":"KEYWORD","value":"zapatillas adidas hombres","refTag":"nb_sb_ss_mvt-t11-ranker_10_10","candidateSources":"local","strategyId":"mvt-t11-ranker","strategyApiType":"RANK","prior":0.0,"ghost":false,"help":false}],"predictiveText":null,"suggestionTitleId":null,"responseId":"3IMDMRQZLAYLZ","shuffled":false}
Si queremos que el resultado sea más legible podemos pasar la salida del comando anterior al comando 'jq' que es un comando para manejar formato JSON
curl -s "https://completion.amazon.co.uk/api/2017/suggestions?" \
-G \
--data-urlencode "prefix=ASICS*" \
--data-urlencode "suffix=$modelo" \
--data-urlencode "session-id=260-6261272-2261010" \
--data-urlencode "customer-id=A2HLNXM8V9BK5Z" \
--data-urlencode "request-id=65EXKVSV12216V211E18" \
--data-urlencode "page-type=Gateway" \
--data-urlencode "lop=es_ES" \
--data-urlencode "site-variant=mobile" \
--data-urlencode "client-info=amazon-search-ui" \
--data-urlencode "mid=A1RKKUPIHCS9HS" \
--data-urlencode "alias=aps" \
--data-urlencode "event=onLoad" \
--data-urlencode "limit=141" \
--data-urlencode "suggestion-type=KEYWORD" \
--data-urlencode "suggestion-type=WIDGET" \
--data-urlencode "_=1589523257903" | jq
Y ahora vems la salida del comando 'curl' mucho mejor
{
"alias": "aps",
"prefix": "zapatillas",
"suffix": "",
"suggestions": [
{
"suggType": "KeywordSuggestion",
"type": "KEYWORD",
"value": "zapatillas hombre",
"refTag": "nb_sb_ss_mvt-t11-ranker_1_10",
"candidateSources": "local",
"strategyId": "mvt-t11-ranker",
"strategyApiType": "RANK",
"prior": 0.0,
"ghost": false,
"help": false
},
{
"suggType": "KeywordSuggestion",
"type": "KEYWORD",
"value": "zapatillas mujer",
"refTag": "nb_sb_ss_mvt-t11-ranker_2_10",
"candidateSources": "local",
"strategyId": "mvt-t11-ranker",
"strategyApiType": "RANK",
"prior": 0.0,
"ghost": false,
"help": false
},
{
"suggType": "KeywordSuggestion",
"type": "KEYWORD",
"value": "zapatillas skechers mujer",
"refTag": "nb_sb_ss_mvt-t11-ranker_3_10",
"candidateSources": "local",
"strategyId": "mvt-t11-ranker",
"strategyApiType": "RANK",
"prior": 0.0,
"ghost": false,
"help": false
},
{
"suggType": "KeywordSuggestion",
"type": "KEYWORD",
"value": "zapatillas niño",
"refTag": "nb_sb_ss_mvt-t11-ranker_4_10",
"candidateSources": "local",
"strategyId": "mvt-t11-ranker",
"strategyApiType": "RANK",
"prior": 0.0,
"ghost": false,
"help": false
},
{
"suggType": "KeywordSuggestion",
"type": "KEYWORD",
"value": "zapatillas running hombre",
"refTag": "nb_sb_ss_mvt-t11-ranker_5_10",
"candidateSources": "local",
"strategyId": "mvt-t11-ranker",
"strategyApiType": "RANK",
"prior": 0.0,
"ghost": false,
"help": false
},
{
"suggType": "KeywordSuggestion",
"type": "KEYWORD",
"value": "zapatillas casa hombre",
"refTag": "nb_sb_ss_mvt-t11-ranker_6_10",
"candidateSources": "local",
"strategyId": "mvt-t11-ranker",
"strategyApiType": "RANK",
"prior": 0.0,
"ghost": false,
"help": false
},
{
"suggType": "KeywordSuggestion",
"type": "KEYWORD",
"value": "zapatillas casa mujer",
"refTag": "nb_sb_ss_mvt-t11-ranker_7_10",
"candidateSources": "local",
"strategyId": "mvt-t11-ranker",
"strategyApiType": "RANK",
"prior": 0.0,
"ghost": false,
"help": false
},
{
"suggType": "KeywordSuggestion",
"type": "KEYWORD",
"value": "zapatillas adidas mujer",
"refTag": "nb_sb_ss_mvt-t11-ranker_8_10",
"candidateSources": "local",
"strategyId": "mvt-t11-ranker",
"strategyApiType": "RANK",
"prior": 0.0,
"ghost": false,
"help": false
},
{
"suggType": "KeywordSuggestion",
"type": "KEYWORD",
"value": "zapatillas nike hombre",
"refTag": "nb_sb_ss_mvt-t11-ranker_9_10",
"candidateSources": "local",
"strategyId": "mvt-t11-ranker",
"strategyApiType": "RANK",
"prior": 0.0,
"ghost": false,
"help": false
},
{
"suggType": "KeywordSuggestion",
"type": "KEYWORD",
"value": "zapatillas adidas hombres",
"refTag": "nb_sb_ss_mvt-t11-ranker_10_10",
"candidateSources": "local",
"strategyId": "mvt-t11-ranker",
"strategyApiType": "RANK",
"prior": 0.0,
"ghost": false,
"help": false
}
],
"predictiveText": null,
"suggestionTitleId": null,
"responseId": "1XDCUKOLQ7X3P",
"shuffled": false
}
Afemás de formatear el formato JSON el comando jq puede manupilar los resultados en formato JSON y hacer auténticas virguerías, así que abrid vuestras mentes SEO hack, ¿qué podríamos hacer con estos dos comandos y esta URL? Seguro que a muchos se os está llenando la cabeza de malas ideas :)
Usando comandos de linux para sacar ideas SEO
Imaginad que tenemos una tienda online de deporte y nos interesa saber términos frecuentemente utilizados por los usuarios con interés en una marca concreta, por ejemplo, términos relacionados para cada modelo de zapatilla de la marca Asics. Podríamos obtener para cada modelo de la marca términos relevantes en Amazon que contengan la combinación de palabras "Asics" y cada uno de los modelos, Novablast, Clifton, Superblast, Glycerin. Y la salida guardarlo en un fichero (datosAsics-modelo.json)
for modelo in Novablast Clifton Superblast Glycerin; do
echo "Obteniendo datos para: $modelo..."
curl -s "https://completion.amazon.co.uk/api/2017/suggestions?" \
-G \
--data-urlencode "prefix=ASICS*" \
--data-urlencode "suffix=$modelo" \
--data-urlencode "session-id=260-6261272-2261010" \
--data-urlencode "customer-id=A2HLNXM8V9BK5Z" \
--data-urlencode "request-id=65EXKVSV12216V211E18" \
--data-urlencode "page-type=Gateway" \
--data-urlencode "lop=es_ES" \
--data-urlencode "site-variant=mobile" \
--data-urlencode "client-info=amazon-search-ui" \
--data-urlencode "mid=A1RKKUPIHCS9HS" \
--data-urlencode "alias=aps" \
--data-urlencode "event=onLoad" \
--data-urlencode "limit=141" \
--data-urlencode "suggestion-type=KEYWORD" \
--data-urlencode "suggestion-type=WIDGET" \
--data-urlencode "_=1589523257903" | jq >> ./datosAsics-modelo.json
done
Esto lo que hace es obtener, por cada modelo de Asics, datos de la misma manera que antes... pero en bucle.
{
"alias": "aps",
"prefix": "asics ",
"suffix": "novablast",
"suggestions": [
{
"suggType": "KeywordSuggestion",
"type": "KEYWORD",
"value": "asics novablast",
"refTag": "nb_sb_ss_mvt-t11-ranker_1_15",
"candidateSources": "local",
"strategyId": "mvt-t11-ranker",
"strategyApiType": "RANK",
"prior": 0.0,
"ghost": false,
"help": false
},
{
"suggType": "KeywordSuggestion",
"type": "KEYWORD",
"value": "asics novablast 4 tr",
"refTag": "nb_sb_ss_mvt-t11-ranker_2_15",
"candidateSources": "local",
"strategyId": "mvt-t11-ranker",
"strategyApiType": "RANK",
"prior": 0.0,
"ghost": false,
"help": false
},
{
"suggType": "KeywordSuggestion",
"type": "KEYWORD",
"value": "asics novablast 4 mujer",
"refTag": "nb_sb_ss_mvt-t11-ranker_3_15",
"candidateSources": "local",
"strategyId": "mvt-t11-ranker",
"strategyApiType": "RANK",
"prior": 0.0,
"ghost": false,
"help": false
},
Como veis, los comandos son muy poderosos, y los LLMs los manejan que dan miedo. A lo largo de mi vida profesional me he pasado horas y horas ajustando comandos encadenados; poco a poco los he ido aprendiendo, pero ya no hace falta. Solo es necesario saber que existen, porque son los LLMs quienes los ejecutarán.
Es más, podríamos decir que Claude Code, Antigravity y demás software para ejecutar agentes son básicamente eso: comandos bien hilados que realizan bucles con las salidas de unos y otros.
Encadenando comandos y LLMs
En medio del flujo de las ejecuciones de comandos podemos meter a los LLMs para que en base a la salida, tomen decisiones, ejecuten otros comandos etc. Por ejemplo, vamos a enriquecer la lista de palabras que obtenemos del anterior ejemplo. Vamos a decirle al LLM que por cada palabra, añda otras 5 relacionadas.
curl -s "https://completion.amazon.co.uk/api/2017/suggestions?" \
-G \
--data-urlencode "prefix=ASICS*" \
--data-urlencode "suffix=$modelo" \
--data-urlencode "session-id=260-6261272-2261010" \
--data-urlencode "customer-id=A2HLNXM8V9BK5Z" \
--data-urlencode "request-id=65EXKVSV12216V211E18" \
--data-urlencode "page-type=Gateway" \
--data-urlencode "lop=es_ES" \
--data-urlencode "site-variant=mobile" \
--data-urlencode "client-info=amazon-search-ui" \
--data-urlencode "mid=A1RKKUPIHCS9HS" \
--data-urlencode "alias=aps" \
--data-urlencode "event=onLoad" \
--data-urlencode "limit=141" \
--data-urlencode "suggestion-type=KEYWORD" \
--data-urlencode "suggestion-type=WIDGET" \
--data-urlencode "_=1589523257903" |
jq .suggestions[].value |
cheff "por cada línea genera al menos 5 palabras relacionadas como si un usuario real buscase en Amazon, devuelve formato CSV separado por coma simple"
El resultado es:
"producto_inicial","palabra_clave_1","palabra_clave_2","palabra_clave_3","palabra_clave_4","palabra_clave_5","palabra_clave_6
smartphone","celular gamer barato 2024","iPhone 15 Pro Max 256GB oro","samsung galaxy s24 ultra con lapiz","telefono con mejor camara menos de 500 dolares","motorola edge 40 pro 12gb ram","celular resistente agua y golpes para trabajo
laptop","portatil para diseño grafico 16gb ram","laptop gamer rtx 4070 menos de 1500","macbook air m2 256gb reacondicionado","notebook lenovo thinkpad para oficina","ultrabook ligero 13 pulgadas windows 11","computadora para estudiantes universidad barata