@trazum/core 1.78.0 → 1.79.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/i18n/es.js CHANGED
@@ -60,7 +60,7 @@ export const es = {
60
60
  suspiciousShrink: (retainedPct) => `El resultado conserva solo el ${retainedPct}% de los tokens. Eso parece un resumen, no una compresión: revísalo a mano antes de usarlo.`,
61
61
  },
62
62
  suggest: {
63
- 'not-found': () => 'la frase citada no está en el prompt — el modelo parafraseó lo que estaba copiando',
63
+ 'not-found': () => 'la frase citada no está en el prompt: el modelo parafraseó lo que estaba copiando',
64
64
  'touches-protected': () => 'editaría código, una URL, un marcador o una etiqueta, que se copian literalmente',
65
65
  'introduces-protected': () => 'el reemplazo añade un marcador o una URL que no estaba',
66
66
  'no-saving': () => 'no es más corto que lo que reemplaza',
@@ -76,24 +76,24 @@ export const es = {
76
76
  detail: !uncertain
77
77
  ? `El prompt optimizado ocupa ~${n(tokens)} tokens y ${modelName} admite ${n(contextWindow)}. La llamada fallará: divide el contenido o cambia a un modelo con ventana mayor.`
78
78
  : bandApplies
79
- ? `El prompt optimizado ocupa ~${n(tokens)} tokens frente a los ${n(contextWindow)} de ${modelName}. Ese recuento es una estimación y está cerca del límite, así que la llamada fallará probablemente, pero puede que no —confírmalo con --exact-tokens antes de reescribir nada. El endpoint de conteo es gratis. Si de verdad se pasa, divide el contenido o cambia a un modelo con ventana mayor.`
80
- : `El prompt optimizado ocupa ~${n(tokens)} tokens frente a los ${n(contextWindow)} de ${modelName}, así que se pasa. Ese recuento es una estimación, y el error del estimador se midió contra el tokenizador de Claude —no el de ${modelName}—, así que desde aquí no se puede decir por cuánto se pasa de verdad. Trazum no va a decirte que la llamada falla apoyándose en un número que no ha medido para esta familia. Cuenta con las herramientas de tu propio proveedor antes de reescribir nada.`,
79
+ ? `El prompt optimizado ocupa ~${n(tokens)} tokens frente a los ${n(contextWindow)} de ${modelName}. Ese recuento es una estimación y está cerca del límite, así que la llamada fallará probablemente, pero puede que no. Confírmalo con --exact-tokens antes de reescribir nada. El endpoint de conteo es gratis. Si de verdad se pasa, divide el contenido o cambia a un modelo con ventana mayor.`
80
+ : `El prompt optimizado ocupa ~${n(tokens)} tokens frente a los ${n(contextWindow)} de ${modelName}, así que se pasa. Ese recuento es una estimación, y el error del estimador se midió contra el tokenizador de Claude y no el de ${modelName}, así que desde aquí no se puede decir por cuánto se pasa de verdad. Trazum no va a decirte que la llamada falla apoyándose en un número que no ha medido para esta familia. Cuenta con las herramientas de tu propio proveedor antes de reescribir nada.`,
81
81
  }),
82
82
  contextNearLimit: ({ tokens, modelName, contextWindow, bandApplies }) => ({
83
83
  title: 'El prompt puede no caber en la ventana de contexto',
84
84
  detail: bandApplies
85
- ? `El prompt optimizado ocupa ~${n(tokens)} tokens frente a los ${n(contextWindow)} de ${modelName}, así que cabe —pero ese recuento es una estimación y su margen de error se pasa de la ventana, así que el prompt real puede no caber. Una llamada que excede la ventana falla del todo en lugar de degradarse, y nada más aquí avisa de eso. Confírmalo con --exact-tokens; el endpoint de conteo es gratis.`
86
- : `El prompt optimizado ocupa ~${n(tokens)} tokens frente a los ${n(contextWindow)} de ${modelName}, y sobre la estimación cabe. Este aviso salta porque el error medido del estimador —contra el tokenizador de Claude, no el de ${modelName}— se pasaría de la ventana, y nadie ha medido cuánto es ese error en esta familia. Una llamada que excede la ventana falla del todo en lugar de degradarse. Cuenta con las herramientas de tu propio proveedor antes de fiarte del margen.`,
85
+ ? `El prompt optimizado ocupa ~${n(tokens)} tokens frente a los ${n(contextWindow)} de ${modelName}, así que cabe, pero ese recuento es una estimación y su margen de error se pasa de la ventana, así que el prompt real puede no caber. Una llamada que excede la ventana falla del todo en lugar de degradarse, y nada más aquí avisa de eso. Confírmalo con --exact-tokens; el endpoint de conteo es gratis.`
86
+ : `El prompt optimizado ocupa ~${n(tokens)} tokens frente a los ${n(contextWindow)} de ${modelName}, y sobre la estimación cabe. Este aviso salta porque el error medido del estimador (contra el tokenizador de Claude, no el de ${modelName}) se pasaría de la ventana, y nadie ha medido cuánto es ese error en esta familia. Una llamada que excede la ventana falla del todo en lugar de degradarse. Cuenta con las herramientas de tu propio proveedor antes de fiarte del margen.`,
87
87
  }),
88
88
  promptCaching: ({ placeholder, prefixTokens, totalTokens, minTokens, modelName, hitRatePct, readPct, writePct, explicit, nearMinimum, }) => {
89
89
  const scope = placeholder
90
- ? `El prefijo estable —lo anterior al primer marcador ${placeholder}— son ~${n(prefixTokens)} de los ${n(totalTokens)} tokens del prompt, y supera el mínimo cacheable de ${n(minTokens)} de ${modelName}.`
90
+ ? `El prefijo estable (lo anterior al primer marcador ${placeholder}) son ~${n(prefixTokens)} de los ${n(totalTokens)} tokens del prompt, y supera el mínimo cacheable de ${n(minTokens)} de ${modelName}.`
91
91
  : `El prompt no tiene marcadores variables, así que el prefijo cacheable es entero y supera el mínimo de ${n(minTokens)} tokens de ${modelName}.`;
92
92
  const how = explicit
93
93
  ? 'Coloca el marcador de caché al final del prefijo estable: cualquier byte que cambie antes del corte invalida todo lo que va detrás.'
94
94
  : `${modelName} cachea automáticamente por encima de su mínimo, así que no hay nada que activar; pero la regla es la misma: cualquier byte que cambie antes del corte invalida todo lo que va detrás.`;
95
95
  const hedge = nearMinimum
96
- ? ` Un aviso sobre la cifra: ese recuento del prefijo es una estimación y está cerca del límite, así que el real puede quedar por debajo del mínimo de ${n(minTokens)} tokens —y entonces no se cachea nada y este ahorro no existe. Confírmalo con --exact-tokens antes de presupuestar sobre él. El endpoint de conteo es gratis.`
96
+ ? ` Un aviso sobre la cifra: ese recuento del prefijo es una estimación y está cerca del límite, así que el real puede quedar por debajo del mínimo de ${n(minTokens)} tokens, y entonces no se cachea nada y este ahorro no existe. Confírmalo con --exact-tokens antes de presupuestar sobre él. El endpoint de conteo es gratis.`
97
97
  : '';
98
98
  return {
99
99
  title: 'Activa prompt caching en el prefijo estable',
@@ -121,7 +121,7 @@ export const es = {
121
121
  },
122
122
  cachePrefixReorder: ({ staticTokensAfter, sharePct, placeholder, command }) => ({
123
123
  title: 'Mueve las instrucciones estables antes del primer marcador',
124
- detail: `Unos ~${n(staticTokensAfter)} tokens de contenido estable (el ${sharePct}% del prompt) están después del primer marcador variable ${placeholder}, así que hoy no se cachean nunca. Instrucciones y contexto fijos primero, marcadores al final, y ese contenido empieza a leerse de caché al 10% del precio. Ejecuta \`${command}\` para intentarlo: solo mueve bloques completos y se niega a mover cualquiera que se refiera a texto anterior. Lee el diff —el orden significa algo, y «resume el texto de arriba» no tiene sentido delante del texto al que apunta.`,
124
+ detail: `Unos ~${n(staticTokensAfter)} tokens de contenido estable (el ${sharePct}% del prompt) están después del primer marcador variable ${placeholder}, así que hoy no se cachean nunca. Instrucciones y contexto fijos primero, marcadores al final, y ese contenido empieza a leerse de caché al 10% del precio. Ejecuta \`${command}\` para intentarlo: solo mueve bloques completos y se niega a mover cualquiera que se refiera a texto anterior. Lee el diff: el orden significa algo, y «resume el texto de arriba» no tiene sentido delante del texto al que apunta.`,
125
125
  }),
126
126
  batchApi: () => ({
127
127
  title: 'Si el trabajo tolera latencia, usa la Batch API',
@@ -157,8 +157,8 @@ export const es = {
157
157
  movableSchema: ({ blocks, tokens, keyList, cue }) => ({
158
158
  title: 'El esquema de salida podría ir en la petición y no en el prompt',
159
159
  detail: `${blocks === 1 ? 'Un bloque de esquema' : `${blocks} bloques de esquema`} introducido por "${cue}" define ${keyList}, y cuesta unos ${n(tokens)} tokens en cada llamada. ` +
160
- 'Toda API relevante acepta ya un esquema de respuesta como parámetro de la petición — output_config.format, response_format, responseSchema — y moverlo allí es el cambio raro que sale más barato y además más estricto: la prosa le pide al modelo que cumpla, un parámetro obliga al decodificador. ' +
161
- 'Trazum no puede hacer esta edición, porque cambia la llamada y no el prompt, y no comprueba si tu proveedor ofrece el parámetro — si no lo ofrece, esto no está disponible para ti.',
160
+ 'Toda API relevante acepta ya un esquema de respuesta como parámetro de la petición (output_config.format, response_format, responseSchema) y moverlo allí es el cambio raro que sale más barato y además más estricto: la prosa le pide al modelo que cumpla, un parámetro obliga al decodificador. ' +
161
+ 'Trazum no puede hacer esta edición, porque cambia la llamada y no el prompt, y no comprueba si tu proveedor ofrece el parámetro: si no lo ofrece, esto no está disponible para ti.',
162
162
  }),
163
163
  restatedOutputFormat: ({ restatedCount, totalCount, restatedTokens, keyList }) => ({
164
164
  title: 'El formato de salida está especificado dos veces',
@@ -1 +1 @@
1
- {"version":3,"file":"es.js","sourceRoot":"","sources":["../../src/i18n/es.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"es.js","sourceRoot":"","sources":["../../src/i18n/es.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@trazum/core",
3
- "version": "1.78.0",
3
+ "version": "1.79.0",
4
4
  "description": "Trazum core: priced advisories for LLM prompts (caching, model tier, batching, schemas), plus deterministic trimming, token counting and pricing.",
5
5
  "license": "MIT",
6
6
  "author": "David Mu\u00f1oz Rey",
package/src/i18n/es.ts CHANGED
@@ -82,7 +82,7 @@ export const es: CoreMessages = {
82
82
 
83
83
  suggest: {
84
84
  'not-found': () =>
85
- 'la frase citada no está en el prompt — el modelo parafraseó lo que estaba copiando',
85
+ 'la frase citada no está en el prompt: el modelo parafraseó lo que estaba copiando',
86
86
  'touches-protected': () =>
87
87
  'editaría código, una URL, un marcador o una etiqueta, que se copian literalmente',
88
88
  'introduces-protected': () => 'el reemplazo añade un marcador o una URL que no estaba',
@@ -100,15 +100,15 @@ export const es: CoreMessages = {
100
100
  detail: !uncertain
101
101
  ? `El prompt optimizado ocupa ~${n(tokens)} tokens y ${modelName} admite ${n(contextWindow)}. La llamada fallará: divide el contenido o cambia a un modelo con ventana mayor.`
102
102
  : bandApplies
103
- ? `El prompt optimizado ocupa ~${n(tokens)} tokens frente a los ${n(contextWindow)} de ${modelName}. Ese recuento es una estimación y está cerca del límite, así que la llamada fallará probablemente, pero puede que no —confírmalo con --exact-tokens antes de reescribir nada. El endpoint de conteo es gratis. Si de verdad se pasa, divide el contenido o cambia a un modelo con ventana mayor.`
104
- : `El prompt optimizado ocupa ~${n(tokens)} tokens frente a los ${n(contextWindow)} de ${modelName}, así que se pasa. Ese recuento es una estimación, y el error del estimador se midió contra el tokenizador de Claude —no el de ${modelName}—, así que desde aquí no se puede decir por cuánto se pasa de verdad. Trazum no va a decirte que la llamada falla apoyándose en un número que no ha medido para esta familia. Cuenta con las herramientas de tu propio proveedor antes de reescribir nada.`,
103
+ ? `El prompt optimizado ocupa ~${n(tokens)} tokens frente a los ${n(contextWindow)} de ${modelName}. Ese recuento es una estimación y está cerca del límite, así que la llamada fallará probablemente, pero puede que no. Confírmalo con --exact-tokens antes de reescribir nada. El endpoint de conteo es gratis. Si de verdad se pasa, divide el contenido o cambia a un modelo con ventana mayor.`
104
+ : `El prompt optimizado ocupa ~${n(tokens)} tokens frente a los ${n(contextWindow)} de ${modelName}, así que se pasa. Ese recuento es una estimación, y el error del estimador se midió contra el tokenizador de Claude y no el de ${modelName}, así que desde aquí no se puede decir por cuánto se pasa de verdad. Trazum no va a decirte que la llamada falla apoyándose en un número que no ha medido para esta familia. Cuenta con las herramientas de tu propio proveedor antes de reescribir nada.`,
105
105
  }),
106
106
 
107
107
  contextNearLimit: ({ tokens, modelName, contextWindow, bandApplies }) => ({
108
108
  title: 'El prompt puede no caber en la ventana de contexto',
109
109
  detail: bandApplies
110
- ? `El prompt optimizado ocupa ~${n(tokens)} tokens frente a los ${n(contextWindow)} de ${modelName}, así que cabe —pero ese recuento es una estimación y su margen de error se pasa de la ventana, así que el prompt real puede no caber. Una llamada que excede la ventana falla del todo en lugar de degradarse, y nada más aquí avisa de eso. Confírmalo con --exact-tokens; el endpoint de conteo es gratis.`
111
- : `El prompt optimizado ocupa ~${n(tokens)} tokens frente a los ${n(contextWindow)} de ${modelName}, y sobre la estimación cabe. Este aviso salta porque el error medido del estimador —contra el tokenizador de Claude, no el de ${modelName}— se pasaría de la ventana, y nadie ha medido cuánto es ese error en esta familia. Una llamada que excede la ventana falla del todo en lugar de degradarse. Cuenta con las herramientas de tu propio proveedor antes de fiarte del margen.`,
110
+ ? `El prompt optimizado ocupa ~${n(tokens)} tokens frente a los ${n(contextWindow)} de ${modelName}, así que cabe, pero ese recuento es una estimación y su margen de error se pasa de la ventana, así que el prompt real puede no caber. Una llamada que excede la ventana falla del todo en lugar de degradarse, y nada más aquí avisa de eso. Confírmalo con --exact-tokens; el endpoint de conteo es gratis.`
111
+ : `El prompt optimizado ocupa ~${n(tokens)} tokens frente a los ${n(contextWindow)} de ${modelName}, y sobre la estimación cabe. Este aviso salta porque el error medido del estimador (contra el tokenizador de Claude, no el de ${modelName}) se pasaría de la ventana, y nadie ha medido cuánto es ese error en esta familia. Una llamada que excede la ventana falla del todo en lugar de degradarse. Cuenta con las herramientas de tu propio proveedor antes de fiarte del margen.`,
112
112
  }),
113
113
 
114
114
  promptCaching: ({
@@ -124,13 +124,13 @@ export const es: CoreMessages = {
124
124
  nearMinimum,
125
125
  }) => {
126
126
  const scope = placeholder
127
- ? `El prefijo estable —lo anterior al primer marcador ${placeholder}— son ~${n(prefixTokens)} de los ${n(totalTokens)} tokens del prompt, y supera el mínimo cacheable de ${n(minTokens)} de ${modelName}.`
127
+ ? `El prefijo estable (lo anterior al primer marcador ${placeholder}) son ~${n(prefixTokens)} de los ${n(totalTokens)} tokens del prompt, y supera el mínimo cacheable de ${n(minTokens)} de ${modelName}.`
128
128
  : `El prompt no tiene marcadores variables, así que el prefijo cacheable es entero y supera el mínimo de ${n(minTokens)} tokens de ${modelName}.`;
129
129
  const how = explicit
130
130
  ? 'Coloca el marcador de caché al final del prefijo estable: cualquier byte que cambie antes del corte invalida todo lo que va detrás.'
131
131
  : `${modelName} cachea automáticamente por encima de su mínimo, así que no hay nada que activar; pero la regla es la misma: cualquier byte que cambie antes del corte invalida todo lo que va detrás.`;
132
132
  const hedge = nearMinimum
133
- ? ` Un aviso sobre la cifra: ese recuento del prefijo es una estimación y está cerca del límite, así que el real puede quedar por debajo del mínimo de ${n(minTokens)} tokens —y entonces no se cachea nada y este ahorro no existe. Confírmalo con --exact-tokens antes de presupuestar sobre él. El endpoint de conteo es gratis.`
133
+ ? ` Un aviso sobre la cifra: ese recuento del prefijo es una estimación y está cerca del límite, así que el real puede quedar por debajo del mínimo de ${n(minTokens)} tokens, y entonces no se cachea nada y este ahorro no existe. Confírmalo con --exact-tokens antes de presupuestar sobre él. El endpoint de conteo es gratis.`
134
134
  : '';
135
135
  return {
136
136
  title: 'Activa prompt caching en el prefijo estable',
@@ -171,7 +171,7 @@ export const es: CoreMessages = {
171
171
 
172
172
  cachePrefixReorder: ({ staticTokensAfter, sharePct, placeholder, command }) => ({
173
173
  title: 'Mueve las instrucciones estables antes del primer marcador',
174
- detail: `Unos ~${n(staticTokensAfter)} tokens de contenido estable (el ${sharePct}% del prompt) están después del primer marcador variable ${placeholder}, así que hoy no se cachean nunca. Instrucciones y contexto fijos primero, marcadores al final, y ese contenido empieza a leerse de caché al 10% del precio. Ejecuta \`${command}\` para intentarlo: solo mueve bloques completos y se niega a mover cualquiera que se refiera a texto anterior. Lee el diff —el orden significa algo, y «resume el texto de arriba» no tiene sentido delante del texto al que apunta.`,
174
+ detail: `Unos ~${n(staticTokensAfter)} tokens de contenido estable (el ${sharePct}% del prompt) están después del primer marcador variable ${placeholder}, así que hoy no se cachean nunca. Instrucciones y contexto fijos primero, marcadores al final, y ese contenido empieza a leerse de caché al 10% del precio. Ejecuta \`${command}\` para intentarlo: solo mueve bloques completos y se niega a mover cualquiera que se refiera a texto anterior. Lee el diff: el orden significa algo, y «resume el texto de arriba» no tiene sentido delante del texto al que apunta.`,
175
175
  }),
176
176
 
177
177
  batchApi: () => ({
@@ -225,8 +225,8 @@ export const es: CoreMessages = {
225
225
  title: 'El esquema de salida podría ir en la petición y no en el prompt',
226
226
  detail:
227
227
  `${blocks === 1 ? 'Un bloque de esquema' : `${blocks} bloques de esquema`} introducido por "${cue}" define ${keyList}, y cuesta unos ${n(tokens)} tokens en cada llamada. ` +
228
- 'Toda API relevante acepta ya un esquema de respuesta como parámetro de la petición — output_config.format, response_format, responseSchema — y moverlo allí es el cambio raro que sale más barato y además más estricto: la prosa le pide al modelo que cumpla, un parámetro obliga al decodificador. ' +
229
- 'Trazum no puede hacer esta edición, porque cambia la llamada y no el prompt, y no comprueba si tu proveedor ofrece el parámetro — si no lo ofrece, esto no está disponible para ti.',
228
+ 'Toda API relevante acepta ya un esquema de respuesta como parámetro de la petición (output_config.format, response_format, responseSchema) y moverlo allí es el cambio raro que sale más barato y además más estricto: la prosa le pide al modelo que cumpla, un parámetro obliga al decodificador. ' +
229
+ 'Trazum no puede hacer esta edición, porque cambia la llamada y no el prompt, y no comprueba si tu proveedor ofrece el parámetro: si no lo ofrece, esto no está disponible para ti.',
230
230
  }),
231
231
 
232
232
  restatedOutputFormat: ({ restatedCount, totalCount, restatedTokens, keyList }) => ({