@runnerpro/backend 1.22.2 → 1.22.3

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.
@@ -73,13 +73,19 @@ function llmCacheKey(opts) {
73
73
  return (0, node_crypto_1.createHash)('sha256').update(payload).digest('hex');
74
74
  }
75
75
  exports.llmCacheKey = llmCacheKey;
76
- /** HIT: incrementa USE COUNT + LAST USED y devuelve OUTPUT (atómico). null en MISS o ante error. */
76
+ /**
77
+ * HIT: incrementa USE COUNT + LAST USED y devuelve OUTPUT (atómico). null en MISS o ante error.
78
+ *
79
+ * El filtro `"OUTPUT" IS NOT NULL` excluye las filas podadas (la poda vacía los textos pero
80
+ * conserva la fila por su coste). Sin él, una fila podada contaría como uso e inflaría USE COUNT,
81
+ * blindándola contra futuras podas pese a no servir ya de caché.
82
+ */
77
83
  function lookup(key) {
78
84
  return __awaiter(this, void 0, void 0, function* () {
79
85
  if (!(yield ensureReady()))
80
86
  return null;
81
87
  try {
82
- const rows = yield (0, db_1.query)('UPDATE "LLM CACHE" SET "USE COUNT" = "USE COUNT" + 1, "LAST USED AT" = now() WHERE "KEY" = ? RETURNING "OUTPUT"', [key]);
88
+ const rows = yield (0, db_1.query)('UPDATE "LLM CACHE" SET "USE COUNT" = "USE COUNT" + 1, "LAST USED AT" = now() WHERE "KEY" = ? AND "OUTPUT" IS NOT NULL RETURNING "OUTPUT"', [key]);
83
89
  return rows && rows[0] ? rows[0].output : null;
84
90
  }
85
91
  catch (_a) {
@@ -89,11 +95,13 @@ function lookup(key) {
89
95
  }
90
96
  exports.lookup = lookup;
91
97
  /**
92
- * MISS: inserta (ON CONFLICT cubre la carrera). Fire-and-forget, nunca lanza.
98
+ * MISS: inserta (ON CONFLICT cubre la carrera y la regeneración de una fila podada).
99
+ * Fire-and-forget, nunca lanza.
93
100
  *
94
- * Los tokens y el coste desglosado corresponden a la generación que creó la entrada; un HIT
95
- * posterior no cuesta nada, así que el ON CONFLICT solo toca USE COUNT/LAST USED y NUNCA
96
- * sobrescribe el coste original.
101
+ * Solo se llama tras una generación REAL (un HIT no cuesta nada y no pasa por aquí), así que el
102
+ * ON CONFLICT ACUMULA tokens y coste en vez de descartarlos: si el mismo prompt se regenera —por
103
+ * una carrera, o porque la poda vació sus textos— ese gasto es real y debe sumarse. Restaura
104
+ * además los textos, devolviendo a la fila podada su capacidad de servir como caché.
97
105
  */
98
106
  function store(key, data) {
99
107
  void ensureReady()
@@ -101,7 +109,19 @@ function store(key, data) {
101
109
  var _a, _b, _c, _d, _e, _f;
102
110
  if (!ok)
103
111
  return undefined;
104
- return (0, db_1.query)('INSERT INTO "LLM CACHE" ("KEY","MODEL","SYSTEM PROMPT","INPUT PROMPT","SCHEMA SIG","TEMPERATURE","OUTPUT","INPUT TOKENS","OUTPUT TOKENS","INPUT COST","OUTPUT COST") VALUES (?,?,?,?,?,?,?::jsonb,?,?,?,?) ON CONFLICT ("KEY") DO UPDATE SET "USE COUNT" = "LLM CACHE"."USE COUNT" + 1, "LAST USED AT" = now()', [
112
+ return (0, db_1.query)(`INSERT INTO "LLM CACHE" ("KEY","MODEL","SYSTEM PROMPT","INPUT PROMPT","SCHEMA SIG","TEMPERATURE","OUTPUT","INPUT TOKENS","OUTPUT TOKENS","INPUT COST","OUTPUT COST")
113
+ VALUES (?,?,?,?,?,?,?::jsonb,?,?,?,?)
114
+ ON CONFLICT ("KEY") DO UPDATE SET
115
+ "USE COUNT" = "LLM CACHE"."USE COUNT" + 1,
116
+ "LAST USED AT" = now(),
117
+ "MODEL" = EXCLUDED."MODEL",
118
+ "SYSTEM PROMPT" = EXCLUDED."SYSTEM PROMPT",
119
+ "INPUT PROMPT" = EXCLUDED."INPUT PROMPT",
120
+ "OUTPUT" = EXCLUDED."OUTPUT",
121
+ "INPUT TOKENS" = "LLM CACHE"."INPUT TOKENS" + EXCLUDED."INPUT TOKENS",
122
+ "OUTPUT TOKENS" = "LLM CACHE"."OUTPUT TOKENS" + EXCLUDED."OUTPUT TOKENS",
123
+ "INPUT COST" = "LLM CACHE"."INPUT COST" + EXCLUDED."INPUT COST",
124
+ "OUTPUT COST" = "LLM CACHE"."OUTPUT COST" + EXCLUDED."OUTPUT COST"`, [
105
125
  key,
106
126
  data.modelName || null,
107
127
  data.system || null,
@@ -12,14 +12,22 @@ declare function llmCacheKey(opts: {
12
12
  schemaSig?: string | null;
13
13
  temperature?: number | null;
14
14
  }): string;
15
- /** HIT: incrementa USE COUNT + LAST USED y devuelve OUTPUT (atómico). null en MISS o ante error. */
15
+ /**
16
+ * HIT: incrementa USE COUNT + LAST USED y devuelve OUTPUT (atómico). null en MISS o ante error.
17
+ *
18
+ * El filtro `"OUTPUT" IS NOT NULL` excluye las filas podadas (la poda vacía los textos pero
19
+ * conserva la fila por su coste). Sin él, una fila podada contaría como uso e inflaría USE COUNT,
20
+ * blindándola contra futuras podas pese a no servir ya de caché.
21
+ */
16
22
  declare function lookup(key: string): Promise<any | null>;
17
23
  /**
18
- * MISS: inserta (ON CONFLICT cubre la carrera). Fire-and-forget, nunca lanza.
24
+ * MISS: inserta (ON CONFLICT cubre la carrera y la regeneración de una fila podada).
25
+ * Fire-and-forget, nunca lanza.
19
26
  *
20
- * Los tokens y el coste desglosado corresponden a la generación que creó la entrada; un HIT
21
- * posterior no cuesta nada, así que el ON CONFLICT solo toca USE COUNT/LAST USED y NUNCA
22
- * sobrescribe el coste original.
27
+ * Solo se llama tras una generación REAL (un HIT no cuesta nada y no pasa por aquí), así que el
28
+ * ON CONFLICT ACUMULA tokens y coste en vez de descartarlos: si el mismo prompt se regenera —por
29
+ * una carrera, o porque la poda vació sus textos— ese gasto es real y debe sumarse. Restaura
30
+ * además los textos, devolviendo a la fila podada su capacidad de servir como caché.
23
31
  */
24
32
  declare function store(key: string, data: {
25
33
  modelName?: string;
@@ -1 +1 @@
1
- {"version":3,"file":"llmCacheStore.d.ts","sourceRoot":"","sources":["../../../../src/prompt/llmCacheStore.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAejD,sGAAsG;AACtG,iBAAS,eAAe,CAAC,MAAM,EAAE,GAAG,GAAG,MAAM,CAW5C;AAED;;;;GAIG;AACH,iBAAS,WAAW,CAAC,IAAI,EAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,GAAG,MAAM,CAQ/H;AAED,oGAAoG;AACpG,iBAAe,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,GAAG,IAAI,CAAC,CAQtD;AAED;;;;;;GAMG;AACH,iBAAS,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,MAAM,EAAE,GAAG,CAAC;IAAC,IAAI,CAAC,EAAE,UAAU,CAAA;CAAE,GAAG,IAAI,CAsBxL;AAED,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC"}
1
+ {"version":3,"file":"llmCacheStore.d.ts","sourceRoot":"","sources":["../../../../src/prompt/llmCacheStore.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAejD,sGAAsG;AACtG,iBAAS,eAAe,CAAC,MAAM,EAAE,GAAG,GAAG,MAAM,CAW5C;AAED;;;;GAIG;AACH,iBAAS,WAAW,CAAC,IAAI,EAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,GAAG,MAAM,CAQ/H;AAED;;;;;;GAMG;AACH,iBAAe,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,GAAG,IAAI,CAAC,CAWtD;AAED;;;;;;;;GAQG;AACH,iBAAS,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,MAAM,EAAE,GAAG,CAAC;IAAC,IAAI,CAAC,EAAE,UAAU,CAAA;CAAE,GAAG,IAAI,CAkCxL;AAED,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@runnerpro/backend",
3
- "version": "1.22.2",
3
+ "version": "1.22.3",
4
4
  "description": "A collection of common backend functions",
5
5
  "exports": {
6
6
  ".": "./lib/cjs/index.js"