@anuma/sdk 7.0.3 → 7.0.4-next.20261015012621

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.
@@ -930,6 +930,22 @@ function taskTypeHeader(taskType) {
930
930
  // src/lib/memoryEngine/constants.ts
931
931
  var DEFAULT_API_EMBEDDING_MODEL = "qwen/qwen3-embedding-8b";
932
932
 
933
+ // src/lib/memoryEngine/embeddingCacheState.ts
934
+ var EMBEDDING_CACHE_STATE_KEY = /* @__PURE__ */ Symbol.for("@anuma/sdk/embedding-cache/v1");
935
+ var cacheGlobal = globalThis;
936
+ var fallbackState = {
937
+ scopedViews: /* @__PURE__ */ new WeakMap(),
938
+ inFlightByCache: /* @__PURE__ */ new WeakMap(),
939
+ cachedEmbeddingModels: /* @__PURE__ */ new WeakMap()
940
+ };
941
+ function getEmbeddingCacheState() {
942
+ try {
943
+ return cacheGlobal[EMBEDDING_CACHE_STATE_KEY] ?? (cacheGlobal[EMBEDDING_CACHE_STATE_KEY] = fallbackState);
944
+ } catch {
945
+ return fallbackState;
946
+ }
947
+ }
948
+
933
949
  // src/lib/memoryEngine/generate.ts
934
950
  var EMBED_MAX_ATTEMPTS = 4;
935
951
  var DEFAULT_EMBEDDING_REQUEST_TIMEOUT_MS = 15e3;
@@ -1018,15 +1034,18 @@ async function generateEmbedding(text, options) {
1018
1034
  if (total === void 0) return embedOne(text, options, void 0);
1019
1035
  return withDeadline((signal) => embedOne(text, options, signal), total, "embedding");
1020
1036
  }
1021
- var inFlightByCache = /* @__PURE__ */ new WeakMap();
1037
+ var { inFlightByCache, cachedEmbeddingModels } = getEmbeddingCacheState();
1022
1038
  async function embedOne(text, options, outer) {
1023
1039
  const { cache } = options;
1024
1040
  if (!cache) return Array.from(await requestEmbedding(text, options, outer));
1041
+ const model = options.model ?? DEFAULT_API_EMBEDDING_MODEL;
1025
1042
  const cached = cache.get(text);
1026
- if (cached) return Array.from(cached);
1043
+ const cachedModel = cached && cachedEmbeddingModels.get(cached);
1044
+ if (cached && (cachedModel === void 0 || cachedModel === model)) return Array.from(cached);
1027
1045
  const inFlight = inFlightByCache.get(cache) ?? /* @__PURE__ */ new Map();
1028
1046
  inFlightByCache.set(cache, inFlight);
1029
- const pending = inFlight.get(text);
1047
+ const requestKey = JSON.stringify([model, text]);
1048
+ const pending = inFlight.get(requestKey);
1030
1049
  if (pending) {
1031
1050
  try {
1032
1051
  return Array.from(await pending);
@@ -1035,13 +1054,14 @@ async function embedOne(text, options, outer) {
1035
1054
  }
1036
1055
  }
1037
1056
  const request = requestEmbedding(text, options, outer);
1038
- inFlight.set(text, request);
1057
+ inFlight.set(requestKey, request);
1039
1058
  try {
1040
1059
  const embedding = await request;
1060
+ cachedEmbeddingModels.set(embedding, model);
1041
1061
  cache.set(text, embedding);
1042
1062
  return Array.from(embedding);
1043
1063
  } finally {
1044
- if (inFlight.get(text) === request) inFlight.delete(text);
1064
+ if (inFlight.get(requestKey) === request) inFlight.delete(requestKey);
1045
1065
  }
1046
1066
  }
1047
1067
  async function requestEmbedding(text, options, outer) {
@@ -1124,13 +1144,15 @@ async function embedMany(texts, options, outer) {
1124
1144
  const { baseUrl = BASE_URL, model, batchSize, cache } = options;
1125
1145
  const timeoutMs = options.timeoutMs ?? DEFAULT_EMBEDDING_REQUEST_TIMEOUT_MS;
1126
1146
  const chunkSize = batchSize ?? DEFAULT_EMBEDDING_BATCH_SIZE;
1147
+ const embeddingModel = model ?? DEFAULT_API_EMBEDDING_MODEL;
1127
1148
  const results = new Array(texts.length).fill(null);
1128
1149
  const uncachedIndices = [];
1129
1150
  const uncachedTexts = [];
1130
1151
  for (let i = 0; i < texts.length; i++) {
1131
1152
  if (cache) {
1132
1153
  const cached = cache.get(texts[i]);
1133
- if (cached) {
1154
+ const cachedModel = cached && cachedEmbeddingModels.get(cached);
1155
+ if (cached && (cachedModel === void 0 || cachedModel === embeddingModel)) {
1134
1156
  results[i] = Array.from(cached);
1135
1157
  continue;
1136
1158
  }
@@ -1146,7 +1168,6 @@ async function embedMany(texts, options, outer) {
1146
1168
  ...taskTypeHeader(options.taskType)
1147
1169
  };
1148
1170
  if (outer?.aborted) throw outer.reason;
1149
- const embeddingModel = model ?? DEFAULT_API_EMBEDDING_MODEL;
1150
1171
  let newEmbeddings;
1151
1172
  if (uncachedTexts.length <= chunkSize) {
1152
1173
  newEmbeddings = await generateEmbeddingsBatch(
@@ -1194,6 +1215,7 @@ async function embedMany(texts, options, outer) {
1194
1215
  const f32Embedding = Float32Array.from(newEmbeddings[i]);
1195
1216
  results[uncachedIndices[i]] = Array.from(f32Embedding);
1196
1217
  if (cache) {
1218
+ cachedEmbeddingModels.set(f32Embedding, embeddingModel);
1197
1219
  cache.set(uncachedTexts[i], f32Embedding);
1198
1220
  }
1199
1221
  }
@@ -808,6 +808,22 @@ function taskTypeHeader(taskType) {
808
808
  // src/lib/memoryEngine/constants.ts
809
809
  var DEFAULT_API_EMBEDDING_MODEL = "qwen/qwen3-embedding-8b";
810
810
 
811
+ // src/lib/memoryEngine/embeddingCacheState.ts
812
+ var EMBEDDING_CACHE_STATE_KEY = /* @__PURE__ */ Symbol.for("@anuma/sdk/embedding-cache/v1");
813
+ var cacheGlobal = globalThis;
814
+ var fallbackState = {
815
+ scopedViews: /* @__PURE__ */ new WeakMap(),
816
+ inFlightByCache: /* @__PURE__ */ new WeakMap(),
817
+ cachedEmbeddingModels: /* @__PURE__ */ new WeakMap()
818
+ };
819
+ function getEmbeddingCacheState() {
820
+ try {
821
+ return cacheGlobal[EMBEDDING_CACHE_STATE_KEY] ?? (cacheGlobal[EMBEDDING_CACHE_STATE_KEY] = fallbackState);
822
+ } catch {
823
+ return fallbackState;
824
+ }
825
+ }
826
+
811
827
  // src/lib/memoryEngine/generate.ts
812
828
  var EMBED_MAX_ATTEMPTS = 4;
813
829
  var DEFAULT_EMBEDDING_REQUEST_TIMEOUT_MS = 15e3;
@@ -896,15 +912,18 @@ async function generateEmbedding(text, options) {
896
912
  if (total === void 0) return embedOne(text, options, void 0);
897
913
  return withDeadline((signal) => embedOne(text, options, signal), total, "embedding");
898
914
  }
899
- var inFlightByCache = /* @__PURE__ */ new WeakMap();
915
+ var { inFlightByCache, cachedEmbeddingModels } = getEmbeddingCacheState();
900
916
  async function embedOne(text, options, outer) {
901
917
  const { cache } = options;
902
918
  if (!cache) return Array.from(await requestEmbedding(text, options, outer));
919
+ const model = options.model ?? DEFAULT_API_EMBEDDING_MODEL;
903
920
  const cached = cache.get(text);
904
- if (cached) return Array.from(cached);
921
+ const cachedModel = cached && cachedEmbeddingModels.get(cached);
922
+ if (cached && (cachedModel === void 0 || cachedModel === model)) return Array.from(cached);
905
923
  const inFlight = inFlightByCache.get(cache) ?? /* @__PURE__ */ new Map();
906
924
  inFlightByCache.set(cache, inFlight);
907
- const pending = inFlight.get(text);
925
+ const requestKey = JSON.stringify([model, text]);
926
+ const pending = inFlight.get(requestKey);
908
927
  if (pending) {
909
928
  try {
910
929
  return Array.from(await pending);
@@ -913,13 +932,14 @@ async function embedOne(text, options, outer) {
913
932
  }
914
933
  }
915
934
  const request = requestEmbedding(text, options, outer);
916
- inFlight.set(text, request);
935
+ inFlight.set(requestKey, request);
917
936
  try {
918
937
  const embedding = await request;
938
+ cachedEmbeddingModels.set(embedding, model);
919
939
  cache.set(text, embedding);
920
940
  return Array.from(embedding);
921
941
  } finally {
922
- if (inFlight.get(text) === request) inFlight.delete(text);
942
+ if (inFlight.get(requestKey) === request) inFlight.delete(requestKey);
923
943
  }
924
944
  }
925
945
  async function requestEmbedding(text, options, outer) {
@@ -1002,13 +1022,15 @@ async function embedMany(texts, options, outer) {
1002
1022
  const { baseUrl = BASE_URL, model, batchSize, cache } = options;
1003
1023
  const timeoutMs = options.timeoutMs ?? DEFAULT_EMBEDDING_REQUEST_TIMEOUT_MS;
1004
1024
  const chunkSize = batchSize ?? DEFAULT_EMBEDDING_BATCH_SIZE;
1025
+ const embeddingModel = model ?? DEFAULT_API_EMBEDDING_MODEL;
1005
1026
  const results = new Array(texts.length).fill(null);
1006
1027
  const uncachedIndices = [];
1007
1028
  const uncachedTexts = [];
1008
1029
  for (let i = 0; i < texts.length; i++) {
1009
1030
  if (cache) {
1010
1031
  const cached = cache.get(texts[i]);
1011
- if (cached) {
1032
+ const cachedModel = cached && cachedEmbeddingModels.get(cached);
1033
+ if (cached && (cachedModel === void 0 || cachedModel === embeddingModel)) {
1012
1034
  results[i] = Array.from(cached);
1013
1035
  continue;
1014
1036
  }
@@ -1024,7 +1046,6 @@ async function embedMany(texts, options, outer) {
1024
1046
  ...taskTypeHeader(options.taskType)
1025
1047
  };
1026
1048
  if (outer?.aborted) throw outer.reason;
1027
- const embeddingModel = model ?? DEFAULT_API_EMBEDDING_MODEL;
1028
1049
  let newEmbeddings;
1029
1050
  if (uncachedTexts.length <= chunkSize) {
1030
1051
  newEmbeddings = await generateEmbeddingsBatch(
@@ -1072,6 +1093,7 @@ async function embedMany(texts, options, outer) {
1072
1093
  const f32Embedding = Float32Array.from(newEmbeddings[i]);
1073
1094
  results[uncachedIndices[i]] = Array.from(f32Embedding);
1074
1095
  if (cache) {
1096
+ cachedEmbeddingModels.set(f32Embedding, embeddingModel);
1075
1097
  cache.set(uncachedTexts[i], f32Embedding);
1076
1098
  }
1077
1099
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@anuma/sdk",
3
- "version": "7.0.3",
3
+ "version": "7.0.4-next.20261015012621",
4
4
  "description": "",
5
5
  "main": "./dist/index.cjs",
6
6
  "module": "./dist/index.mjs",
@@ -154,7 +154,7 @@
154
154
  "check:excluded-suites": "node scripts/assert-excluded-suites-still-fail.mjs",
155
155
  "knip": "knip",
156
156
  "check:export-consumers": "node scripts/assert-export-consumers.mjs",
157
- "check-exports": "publint && attw --pack --ignore-rules no-resolution false-cjs && node scripts/assert-no-client-self-import.mjs && node scripts/assert-shared-logger.mjs",
157
+ "check-exports": "publint && attw --pack --ignore-rules no-resolution false-cjs && node scripts/assert-no-client-self-import.mjs && node scripts/assert-shared-logger.mjs && node scripts/assert-embedding-cross-entrypoints.mjs",
158
158
  "check": "pnpm run lint && pnpm run knip && pnpm run check:export-consumers && pnpm run format && pnpm run generate",
159
159
  "eval:extraction": "tsx test/memory/src/extraction/benchmark.test.ts",
160
160
  "eval:topic": "tsx test/memory/src/topic/benchmark.ts",