@mmnto/totem 1.108.0 → 1.110.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.
Files changed (60) hide show
  1. package/dist/config-schema.d.ts +22 -0
  2. package/dist/config-schema.d.ts.map +1 -1
  3. package/dist/config-schema.js +6 -0
  4. package/dist/config-schema.js.map +1 -1
  5. package/dist/config-schema.test.js +21 -0
  6. package/dist/config-schema.test.js.map +1 -1
  7. package/dist/embedders/embedder.d.ts +29 -0
  8. package/dist/embedders/embedder.d.ts.map +1 -1
  9. package/dist/embedders/embedder.js +26 -3
  10. package/dist/embedders/embedder.js.map +1 -1
  11. package/dist/embedders/embedder.test.js +51 -0
  12. package/dist/embedders/embedder.test.js.map +1 -1
  13. package/dist/embedders/gemini-embedder.d.ts +18 -1
  14. package/dist/embedders/gemini-embedder.d.ts.map +1 -1
  15. package/dist/embedders/gemini-embedder.js +98 -5
  16. package/dist/embedders/gemini-embedder.js.map +1 -1
  17. package/dist/embedders/gemini-embedder.test.js +153 -1
  18. package/dist/embedders/gemini-embedder.test.js.map +1 -1
  19. package/dist/embedders/openai-embedder.d.ts +2 -1
  20. package/dist/embedders/openai-embedder.d.ts.map +1 -1
  21. package/dist/embedders/openai-embedder.js +21 -4
  22. package/dist/embedders/openai-embedder.js.map +1 -1
  23. package/dist/embedders/openai-embedder.test.d.ts +2 -0
  24. package/dist/embedders/openai-embedder.test.d.ts.map +1 -0
  25. package/dist/embedders/openai-embedder.test.js +102 -0
  26. package/dist/embedders/openai-embedder.test.js.map +1 -0
  27. package/dist/embedders/pacing.d.ts +11 -0
  28. package/dist/embedders/pacing.d.ts.map +1 -0
  29. package/dist/embedders/pacing.js +23 -0
  30. package/dist/embedders/pacing.js.map +1 -0
  31. package/dist/embedders/pacing.test.d.ts +2 -0
  32. package/dist/embedders/pacing.test.d.ts.map +1 -0
  33. package/dist/embedders/pacing.test.js +50 -0
  34. package/dist/embedders/pacing.test.js.map +1 -0
  35. package/dist/index.d.ts +1 -1
  36. package/dist/index.d.ts.map +1 -1
  37. package/dist/index.js +1 -1
  38. package/dist/index.js.map +1 -1
  39. package/dist/ingest/file-resolver.d.ts +14 -0
  40. package/dist/ingest/file-resolver.d.ts.map +1 -1
  41. package/dist/ingest/file-resolver.js +27 -9
  42. package/dist/ingest/file-resolver.js.map +1 -1
  43. package/dist/ingest/pipeline.d.ts +9 -0
  44. package/dist/ingest/pipeline.d.ts.map +1 -1
  45. package/dist/ingest/pipeline.js +315 -29
  46. package/dist/ingest/pipeline.js.map +1 -1
  47. package/dist/ingest/pipeline.test.js +397 -0
  48. package/dist/ingest/pipeline.test.js.map +1 -1
  49. package/dist/ingest/sync.d.ts +2 -2
  50. package/dist/ingest/sync.d.ts.map +1 -1
  51. package/dist/ingest/sync.js +2 -2
  52. package/dist/ingest/sync.js.map +1 -1
  53. package/dist/parity-detect.d.ts +12 -0
  54. package/dist/parity-detect.d.ts.map +1 -1
  55. package/dist/parity-detect.js +4 -3
  56. package/dist/parity-detect.js.map +1 -1
  57. package/dist/types.d.ts +39 -0
  58. package/dist/types.d.ts.map +1 -1
  59. package/dist/types.js.map +1 -1
  60. package/package.json +1 -1
@@ -53,6 +53,33 @@ describe('createEmbedder', () => {
53
53
  const embedder = createEmbedder(config);
54
54
  expect(embedder.dimensions).toBe(1536);
55
55
  });
56
+ it('describeEffective is null before resolution, the configured identity after (#2562)', async () => {
57
+ process.env['OPENAI_API_KEY'] = 'test-key';
58
+ const config = { provider: 'openai', model: 'text-embedding-3-small' };
59
+ const embedder = createEmbedder(config);
60
+ expect(embedder.describeEffective?.()).toBeNull();
61
+ await embedder.embed(['x']); // resolves the mocked OpenAIEmbedder
62
+ expect(embedder.describeEffective?.()).toEqual({
63
+ provider: 'openai',
64
+ model: 'text-embedding-3-small',
65
+ dimensions: 1536,
66
+ });
67
+ });
68
+ it('resolveEffective() forces resolution ahead of any embed (#2569 bot round)', async () => {
69
+ process.env['OPENAI_API_KEY'] = 'test-key';
70
+ const config = { provider: 'openai', model: 'text-embedding-3-small' };
71
+ const embedder = createEmbedder(config);
72
+ // No embed() has run — the resume gate calls this to learn the identity
73
+ // that WILL serve the run before trusting checkpointed progress.
74
+ expect(embedder.describeEffective?.()).toBeNull();
75
+ const effective = await embedder.resolveEffective?.();
76
+ expect(effective).toEqual({
77
+ provider: 'openai',
78
+ model: 'text-embedding-3-small',
79
+ dimensions: 1536,
80
+ });
81
+ expect(embedder.describeEffective?.()).toEqual(effective);
82
+ });
56
83
  });
57
84
  describe('LazyEmbedder concurrency', () => {
58
85
  let originalApiKey;
@@ -174,6 +201,30 @@ describe('LazyEmbedder fallback chain — regression contract (mmnto-ai/totem#18
174
201
  const allWarns = warns.join('\n');
175
202
  expect(allWarns).toContain('Falling back to Ollama');
176
203
  expect(allWarns).toContain('Using Ollama fallback embedder');
204
+ // #2562: consumers that persist an embedder fingerprint (the full-sync
205
+ // checkpoint) must see the EFFECTIVE post-fallback identity, not the
206
+ // configured one — or a resume would mix vector spaces.
207
+ expect(embedder.describeEffective?.()).toEqual({
208
+ provider: 'ollama',
209
+ model: 'nomic-embed-text',
210
+ dimensions: 768,
211
+ });
212
+ });
213
+ it('resolveEffective() reports the Ollama fallback identity without any embed (#2569 bot round)', async () => {
214
+ vi.spyOn(globalThis, 'fetch').mockResolvedValue(new Response(JSON.stringify({ models: [{ name: 'nomic-embed-text' }] }), {
215
+ status: 200,
216
+ headers: { 'content-type': 'application/json' },
217
+ }));
218
+ const config = { provider: 'gemini', model: 'gemini-embedding-2-preview' };
219
+ const embedder = createEmbedder(config, () => { });
220
+ // Forced resolution takes the fallback branch (SDK mocked absent) and
221
+ // reports the identity that would actually serve embeds — no embed runs.
222
+ const effective = await embedder.resolveEffective?.();
223
+ expect(effective).toEqual({
224
+ provider: 'ollama',
225
+ model: 'nomic-embed-text',
226
+ dimensions: 768,
227
+ });
177
228
  });
178
229
  // mmnto-ai/totem#1859: the SDK-missing trigger (distinct from missing-key above).
179
230
  // The API key IS present, so GeminiEmbedder constructs cleanly; only the mocked-
@@ -1 +1 @@
1
- {"version":3,"file":"embedder.test.js","sourceRoot":"","sources":["../../src/embedders/embedder.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"embedder.test.js","sourceRoot":"","sources":["../../src/embedders/embedder.test.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,20 @@
1
1
  import type { Embedder } from './embedder.js';
2
+ /**
3
+ * Quota-class failure (429 / RESOURCE_EXHAUSTED): the one retryable class
4
+ * where "check your API key and network" is the WRONG recovery hint
5
+ * (mmnto-ai/totem#2562) — the key works; the per-minute allowance is spent.
6
+ */
7
+ export declare function isQuotaError(err: unknown): boolean;
8
+ /**
9
+ * Extract a server-advised retry delay from a Gemini SDK error, if present.
10
+ * 429s carry google.rpc.RetryInfo either as a structured `errorDetails` entry
11
+ * (`retryDelay: "18s"`) or embedded in the message JSON. Against a per-minute
12
+ * quota this is the difference between the retry budget being real and being
13
+ * decorative — 1–4s exponential backoff never outlives the window. Capped at
14
+ * MAX_SERVER_RETRY_DELAY_MS; returns null when absent (caller falls back to
15
+ * exponential backoff).
16
+ */
17
+ export declare function extractRetryDelayMs(err: unknown): number | null;
2
18
  /** Minimal interface for the subset of @google/genai SDK we use. */
3
19
  interface GeminiAI {
4
20
  models: {
@@ -37,7 +53,8 @@ export declare class GeminiEmbedder implements Embedder {
37
53
  readonly dimensions: number;
38
54
  private model;
39
55
  private apiKey;
40
- constructor(model?: string, dimensions?: number);
56
+ private pace;
57
+ constructor(model?: string, dimensions?: number, throttleMs?: number);
41
58
  embed(texts: string[]): Promise<number[][]>;
42
59
  private embedWithRetry;
43
60
  }
@@ -1 +1 @@
1
- {"version":3,"file":"gemini-embedder.d.ts","sourceRoot":"","sources":["../../src/embedders/gemini-embedder.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AA4B9C,oEAAoE;AACpE,UAAU,QAAQ;IAChB,MAAM,EAAE;QACN,YAAY,CAAC,GAAG,EAAE;YAChB,KAAK,EAAE,MAAM,CAAC;YACd,QAAQ,EAAE;gBAAE,KAAK,EAAE;oBAAE,IAAI,EAAE,MAAM,CAAA;iBAAE,EAAE,CAAA;aAAE,EAAE,CAAC;YAC1C,MAAM,EAAE;gBAAE,QAAQ,EAAE,MAAM,CAAC;gBAAC,oBAAoB,EAAE,MAAM,CAAA;aAAE,CAAC;SAC5D,GAAG,OAAO,CAAC;YACV,UAAU,CAAC,EAAE;gBAAE,MAAM,CAAC,EAAE,MAAM,EAAE,CAAA;aAAE,EAAE,CAAC;SACtC,CAAC,CAAC;KACJ,CAAC;CACH;AAED;;;GAGG;AACH,wBAAsB,eAAe,IAAI,OAAO,CAAC;IAC/C,WAAW,EAAE,KAAK,IAAI,EAAE;QAAE,MAAM,EAAE,MAAM,CAAA;KAAE,KAAK,QAAQ,CAAC;CACzD,CAAC,CAmBD;AAED;;;GAGG;AACH,qBAAa,cAAe,YAAW,QAAQ;IAC7C,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,MAAM,CAAS;gBAEX,KAAK,GAAE,MAAsB,EAAE,UAAU,CAAC,EAAE,MAAM;IAgBxD,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;YAiBnC,cAAc;CA8C7B"}
1
+ {"version":3,"file":"gemini-embedder.d.ts","sourceRoot":"","sources":["../../src/embedders/gemini-embedder.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AA4C9C;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAKlD;AAED;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAgB/D;AAED,oEAAoE;AACpE,UAAU,QAAQ;IAChB,MAAM,EAAE;QACN,YAAY,CAAC,GAAG,EAAE;YAChB,KAAK,EAAE,MAAM,CAAC;YACd,QAAQ,EAAE;gBAAE,KAAK,EAAE;oBAAE,IAAI,EAAE,MAAM,CAAA;iBAAE,EAAE,CAAA;aAAE,EAAE,CAAC;YAC1C,MAAM,EAAE;gBAAE,QAAQ,EAAE,MAAM,CAAC;gBAAC,oBAAoB,EAAE,MAAM,CAAA;aAAE,CAAC;SAC5D,GAAG,OAAO,CAAC;YACV,UAAU,CAAC,EAAE;gBAAE,MAAM,CAAC,EAAE,MAAM,EAAE,CAAA;aAAE,EAAE,CAAC;SACtC,CAAC,CAAC;KACJ,CAAC;CACH;AAED;;;GAGG;AACH,wBAAsB,eAAe,IAAI,OAAO,CAAC;IAC/C,WAAW,EAAE,KAAK,IAAI,EAAE;QAAE,MAAM,EAAE,MAAM,CAAA;KAAE,KAAK,QAAQ,CAAC;CACzD,CAAC,CAmBD;AAED;;;GAGG;AACH,qBAAa,cAAe,YAAW,QAAQ;IAC7C,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,IAAI,CAAsB;gBAGhC,KAAK,GAAE,MAAsB,EAC7B,UAAU,CAAC,EAAE,MAAM,EACnB,UAAU,GAAE,MAA4B;IAkBpC,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;YA0BnC,cAAc;CA0E7B"}
@@ -1,10 +1,26 @@
1
1
  import { TotemConfigError, TotemError } from '../errors.js';
2
2
  import { buildMissingSdkHint } from '../missing-sdk.js';
3
+ import { createRequestPacer } from './pacing.js';
3
4
  const DEFAULT_DIMENSIONS = 768;
4
5
  const DEFAULT_MODEL = 'gemini-embedding-2-preview';
5
6
  const MAX_BATCH_SIZE = 100; // Gemini supports up to 100 texts per batch
6
7
  const MAX_RETRIES = 3;
7
8
  const INITIAL_BACKOFF_MS = 1000;
9
+ // Cap on a server-advised retry delay — a pathological RetryInfo hint must not
10
+ // stall the run; bounds worst-case retry wall-clock at ~MAX_RETRIES minutes.
11
+ const MAX_SERVER_RETRY_DELAY_MS = 60_000;
12
+ // The Vertex quota that kills unthrottled syncs is a PER-MINUTE window
13
+ // (ground-read 2026-08-03, mmnto-ai/totem#2562: online_prediction_requests_
14
+ // per_base_model = 2,000/min default for gemini-embedding-2, accounting
15
+ // consistent with per-content-item). Derived default pacing: 100-item batches
16
+ // every 4s = 1,500 items/min — under the window with margin. A run that never
17
+ // throttles converges on a corpus of ANY size in corpus/1500 minutes instead
18
+ // of dying at ~2k. Explicit `throttleMs: 0` disables pacing.
19
+ const DEFAULT_THROTTLE_MS = 4_000;
20
+ // Quota retries without a server-advised delay must back off PAST the minute
21
+ // boundary — 1–4s backoff burns the whole retry budget inside the same closed
22
+ // window that produced the 429.
23
+ const QUOTA_WINDOW_BACKOFF_MS = 60_000;
8
24
  /** Status codes / error names that are safe to retry. */
9
25
  const RETRYABLE_STATUS_CODES = new Set([429, 503]);
10
26
  const RETRYABLE_ERROR_NAMES = new Set(['RESOURCE_EXHAUSTED', 'UNAVAILABLE', 'TOO_MANY_REQUESTS']);
@@ -24,6 +40,49 @@ function isRetryableGeminiError(err) {
24
40
  }
25
41
  return false;
26
42
  }
43
+ /**
44
+ * Quota-class failure (429 / RESOURCE_EXHAUSTED): the one retryable class
45
+ * where "check your API key and network" is the WRONG recovery hint
46
+ * (mmnto-ai/totem#2562) — the key works; the per-minute allowance is spent.
47
+ */
48
+ export function isQuotaError(err) {
49
+ if (!(err instanceof Error))
50
+ return false;
51
+ const errObj = err;
52
+ if (errObj['status'] === 429 || errObj['code'] === 429)
53
+ return true;
54
+ return /RESOURCE_EXHAUSTED|TOO_MANY_REQUESTS/.test(`${String(errObj['name'])} ${err.message}`);
55
+ }
56
+ /**
57
+ * Extract a server-advised retry delay from a Gemini SDK error, if present.
58
+ * 429s carry google.rpc.RetryInfo either as a structured `errorDetails` entry
59
+ * (`retryDelay: "18s"`) or embedded in the message JSON. Against a per-minute
60
+ * quota this is the difference between the retry budget being real and being
61
+ * decorative — 1–4s exponential backoff never outlives the window. Capped at
62
+ * MAX_SERVER_RETRY_DELAY_MS; returns null when absent (caller falls back to
63
+ * exponential backoff).
64
+ */
65
+ export function extractRetryDelayMs(err) {
66
+ if (!(err instanceof Error))
67
+ return null;
68
+ const details = err['errorDetails'];
69
+ if (Array.isArray(details)) {
70
+ for (const entry of details) {
71
+ if (entry === null || typeof entry !== 'object')
72
+ continue;
73
+ const delay = entry['retryDelay'];
74
+ if (typeof delay === 'string') {
75
+ const seconds = delay.match(/^(\d+(?:\.\d+)?)s$/);
76
+ if (seconds)
77
+ return Math.min(Number(seconds[1]) * 1000, MAX_SERVER_RETRY_DELAY_MS);
78
+ }
79
+ }
80
+ }
81
+ const inMessage = err.message.match(/["']?retryDelay["']?\s*:\s*["'](\d+(?:\.\d+)?)s["']/);
82
+ if (inMessage)
83
+ return Math.min(Number(inMessage[1]) * 1000, MAX_SERVER_RETRY_DELAY_MS);
84
+ return null;
85
+ }
27
86
  /**
28
87
  * Dynamically import the @google/genai SDK.
29
88
  * It's an optional peer dep in @mmnto/totem — only required when provider is 'gemini'.
@@ -52,9 +111,11 @@ export class GeminiEmbedder {
52
111
  dimensions;
53
112
  model;
54
113
  apiKey;
55
- constructor(model = DEFAULT_MODEL, dimensions) {
114
+ pace;
115
+ constructor(model = DEFAULT_MODEL, dimensions, throttleMs = DEFAULT_THROTTLE_MS) {
56
116
  this.model = model;
57
117
  this.dimensions = dimensions ?? DEFAULT_DIMENSIONS;
118
+ this.pace = createRequestPacer(throttleMs);
58
119
  const apiKey = process.env['GEMINI_API_KEY'] ?? process.env['GOOGLE_API_KEY'];
59
120
  if (!apiKey) {
60
121
  throw new TotemConfigError('No Gemini API key found.', 'Set GEMINI_API_KEY (or GOOGLE_API_KEY) in your .env file.', 'CONFIG_MISSING');
@@ -66,18 +127,30 @@ export class GeminiEmbedder {
66
127
  return [];
67
128
  const { GoogleGenAI } = await importGeminiSdk();
68
129
  const ai = new GoogleGenAI({ apiKey: this.apiKey });
130
+ // Pace only multi-text (ingest-shaped) calls (falsification round 3,
131
+ // MAJOR 3): sync flushes arrive as multi-text batches and are what burns
132
+ // the per-minute window. Single-text calls stay unpaced — queries
133
+ // (search / MCP retrieval, whose embedder is process-lifetime cached) and
134
+ // the per-candidate semantic-dedup probes, both of which are
135
+ // sequential-RTT-bound far below the window; pacing them would tax every
136
+ // interactive lookup for quota they cannot meaningfully consume.
137
+ const paceThisCall = texts.length > 1;
69
138
  const results = [];
70
139
  for (let i = 0; i < texts.length; i += MAX_BATCH_SIZE) {
71
140
  const batch = texts.slice(i, i + MAX_BATCH_SIZE);
72
- const embeddings = await this.embedWithRetry(ai, batch);
141
+ const embeddings = await this.embedWithRetry(ai, batch, paceThisCall);
73
142
  results.push(...embeddings);
74
143
  }
75
144
  return results;
76
145
  }
77
- async embedWithRetry(ai, batch) {
146
+ async embedWithRetry(ai, batch, paceThisCall) {
78
147
  let lastErr;
79
148
  for (let attempt = 0; attempt <= MAX_RETRIES; attempt++) {
80
149
  try {
150
+ // Pace every attempt (mmnto-ai/totem#2562): the throttle exists for
151
+ // per-minute quotas, and retries count against them like any request.
152
+ if (paceThisCall)
153
+ await this.pace();
81
154
  const response = await ai.models.embedContent({
82
155
  model: this.model,
83
156
  contents: batch.map((text) => ({ parts: [{ text }] })),
@@ -94,17 +167,37 @@ export class GeminiEmbedder {
94
167
  throw new TotemError('EMBEDDING_UNAVAILABLE', 'Embedding response missing values', 'This may be a transient Gemini API issue. Retry with `totem sync`.');
95
168
  return e.values;
96
169
  });
170
+ // totem-context: intentional capture — the retry loop stores the error and EVERY exit path rethrows it as the terminal TotemError below (mmnto-ai/totem#2562); nothing is swallowed.
97
171
  }
98
172
  catch (err) {
99
173
  lastErr = err;
100
174
  if (!isRetryableGeminiError(err) || attempt === MAX_RETRIES)
101
175
  break;
102
- const delay = INITIAL_BACKOFF_MS * 2 ** attempt + Math.random() * 1000;
176
+ // Delay selection (mmnto-ai/totem#2562, falsification round 2 F4 +
177
+ // the per-minute ground-read): a server-advised RetryInfo delay wins
178
+ // when it is LONGER than the exponential backoff (never shorter — a
179
+ // "0s"/"0.001s" advisory must not collapse the budget into a burst);
180
+ // a quota 429 with NO advisory waits out the minute window instead of
181
+ // burning all retries inside the window that produced it.
182
+ const backoff = INITIAL_BACKOFF_MS * 2 ** attempt + Math.random() * 1000;
183
+ const advised = extractRetryDelayMs(err);
184
+ const delay = advised !== null
185
+ ? Math.max(advised, backoff)
186
+ : isQuotaError(err)
187
+ ? Math.max(backoff, QUOTA_WINDOW_BACKOFF_MS)
188
+ : backoff;
103
189
  await new Promise((resolve) => setTimeout(resolve, delay));
104
190
  }
105
191
  }
106
192
  const detail = lastErr instanceof Error ? lastErr.message : String(lastErr);
107
- throw new TotemError('EMBEDDING_UNAVAILABLE', `Gemini embedding failed after ${MAX_RETRIES + 1} attempts: ${detail}`, 'Check your GEMINI_API_KEY and network connection, then retry with `totem sync`.');
193
+ // Quota exhaustion gets its own recovery hint (mmnto-ai/totem#2562): the
194
+ // key-and-network hint is actively wrong there, and since #2562 a plain
195
+ // `totem sync` after an interrupted full re-index RESUMES from the
196
+ // checkpoint — that recovery is now true, so name it.
197
+ const hint = isQuotaError(lastErr)
198
+ ? 'Embedding quota exhausted (e.g. per-minute request quota). Re-run `totem sync` — an interrupted full re-index resumes from its checkpoint instead of restarting. To stay under per-minute quotas, set `embedding.throttleMs` in totem.config.ts to pace requests.'
199
+ : 'Check your GEMINI_API_KEY and network connection, then retry with `totem sync`.';
200
+ throw new TotemError('EMBEDDING_UNAVAILABLE', `Gemini embedding failed after ${MAX_RETRIES + 1} attempts: ${detail}`, hint);
108
201
  }
109
202
  }
110
203
  //# sourceMappingURL=gemini-embedder.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"gemini-embedder.js","sourceRoot":"","sources":["../../src/embedders/gemini-embedder.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"gemini-embedder.js","sourceRoot":"","sources":["../../src/embedders/gemini-embedder.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
2
2
  import { TotemConfigError, TotemError } from '../errors.js';
3
- import { GeminiEmbedder } from './gemini-embedder.js';
3
+ import { extractRetryDelayMs, GeminiEmbedder, isQuotaError } from './gemini-embedder.js';
4
4
  // ─── Mock the @google/genai SDK ───────────────────────
5
5
  const mockEmbedContent = vi.fn();
6
6
  vi.mock('@google/genai', () => ({
@@ -17,6 +17,16 @@ function embedResponse(count, dims = 768) {
17
17
  })),
18
18
  };
19
19
  }
20
+ /** Capture every setTimeout delay while resolving waits immediately (mirrors pacing.test.ts). */
21
+ function captureDelays() {
22
+ const delays = [];
23
+ vi.spyOn(globalThis, 'setTimeout').mockImplementation(((fn, ms) => {
24
+ delays.push(ms);
25
+ fn();
26
+ return 0;
27
+ }));
28
+ return delays;
29
+ }
20
30
  // ─── Tests ────────────────────────────────────────────
21
31
  describe('GeminiEmbedder', () => {
22
32
  beforeEach(() => {
@@ -154,5 +164,147 @@ describe('GeminiEmbedder', () => {
154
164
  await embedder.embed(['test']);
155
165
  expect(mockEmbedContent.mock.calls[0][0].model).toBe('custom-model');
156
166
  });
167
+ // ─── Quota recovery hint (#2562) ───────────────────
168
+ it('terminal 429 failure carries the quota hint naming resume and throttleMs', async () => {
169
+ const rateLimitErr = Object.assign(new Error('rate limited'), { status: 429 });
170
+ mockEmbedContent.mockRejectedValue(rateLimitErr);
171
+ const embedder = new GeminiEmbedder();
172
+ await expect(embedder.embed(['test'])).rejects.toMatchObject({
173
+ recoveryHint: expect.stringMatching(/resumes from its checkpoint.*throttleMs/s),
174
+ });
175
+ });
176
+ it('terminal non-quota failure keeps the key-and-network hint', async () => {
177
+ const badErr = Object.assign(new Error('service unavailable'), { status: 503 });
178
+ mockEmbedContent.mockRejectedValue(badErr);
179
+ const embedder = new GeminiEmbedder();
180
+ await expect(embedder.embed(['test'])).rejects.toMatchObject({
181
+ recoveryHint: expect.stringContaining('GEMINI_API_KEY'),
182
+ });
183
+ });
184
+ // ─── Server-advised retry delay (#2562) ────────────
185
+ it('waits the server-advised retryDelay instead of exponential backoff on 429', async () => {
186
+ const delays = captureDelays();
187
+ const quotaErr = Object.assign(new Error('rate limited'), {
188
+ status: 429,
189
+ errorDetails: [{ '@type': 'type.googleapis.com/google.rpc.RetryInfo', retryDelay: '18s' }],
190
+ });
191
+ mockEmbedContent.mockRejectedValueOnce(quotaErr).mockResolvedValueOnce(embedResponse(1));
192
+ const embedder = new GeminiEmbedder(undefined, undefined, 0);
193
+ await embedder.embed(['test']);
194
+ expect(delays).toContain(18_000);
195
+ });
196
+ it.each(['0s', '0.5s'])('a sub-backoff server advisory ("%s") never undercuts the exponential floor', async (advisory) => {
197
+ const delays = captureDelays();
198
+ const quotaErr = Object.assign(new Error('rate limited'), {
199
+ status: 429,
200
+ errorDetails: [{ retryDelay: advisory }],
201
+ });
202
+ mockEmbedContent.mockRejectedValueOnce(quotaErr).mockResolvedValueOnce(embedResponse(1));
203
+ const embedder = new GeminiEmbedder(undefined, undefined, 0);
204
+ await embedder.embed(['test']);
205
+ expect(delays).toHaveLength(1);
206
+ expect(delays[0]).toBeGreaterThanOrEqual(1000); // INITIAL_BACKOFF_MS floor
207
+ });
208
+ it('a quota 429 with NO advisory backs off past the minute window', async () => {
209
+ const delays = captureDelays();
210
+ const quotaErr = Object.assign(new Error('quota exceeded RESOURCE_EXHAUSTED'), { status: 429 });
211
+ mockEmbedContent.mockRejectedValueOnce(quotaErr).mockResolvedValueOnce(embedResponse(1));
212
+ const embedder = new GeminiEmbedder(undefined, undefined, 0);
213
+ await embedder.embed(['test']);
214
+ // The 2,000/min quota is a rolling 60s window — fast retries die inside
215
+ // the window that produced the 429 (ground-read 2026-08-03).
216
+ expect(delays.some((d) => d !== undefined && d >= 60_000)).toBe(true);
217
+ });
218
+ // ─── Request pacing (#2562) ────────────────────────
219
+ it('throttleMs paces successive ingest-shaped calls; explicit 0 disables pacing', async () => {
220
+ const delays = captureDelays();
221
+ mockEmbedContent.mockResolvedValue(embedResponse(2));
222
+ const unpaced = new GeminiEmbedder(undefined, undefined, 0);
223
+ await unpaced.embed(['a', 'b']);
224
+ await unpaced.embed(['c', 'd']);
225
+ expect(delays).toHaveLength(0);
226
+ const paced = new GeminiEmbedder(undefined, undefined, 5_000);
227
+ await paced.embed(['a', 'b']);
228
+ await paced.embed(['c', 'd']); // within 5s of the first call — must wait
229
+ expect(delays.length).toBeGreaterThanOrEqual(1);
230
+ const wait = delays[delays.length - 1];
231
+ expect(wait).toBeGreaterThan(0);
232
+ expect(wait).toBeLessThanOrEqual(5_000);
233
+ });
234
+ it('pacing defaults ON at the derived per-minute-window constant (#2562 ground-read)', async () => {
235
+ const delays = captureDelays();
236
+ mockEmbedContent.mockResolvedValue(embedResponse(2));
237
+ // No throttleMs given — the gemini default (4s between batches ≈ 1,500
238
+ // items/min at 100-item batches) must pace the second ingest-shaped call
239
+ // at close to the full constant (the magnitude IS the convergence claim).
240
+ const embedder = new GeminiEmbedder();
241
+ await embedder.embed(['a', 'b']);
242
+ await embedder.embed(['c', 'd']);
243
+ expect(delays.length).toBeGreaterThanOrEqual(1);
244
+ const wait = delays[delays.length - 1];
245
+ expect(wait).toBeGreaterThan(3_900);
246
+ expect(wait).toBeLessThanOrEqual(4_000);
247
+ });
248
+ it('single-text (query-shaped) calls are never paced, even at the default throttle (#2562 round 3)', async () => {
249
+ const delays = captureDelays();
250
+ mockEmbedContent.mockResolvedValue(embedResponse(1));
251
+ // A process-lifetime embedder (the MCP server) serves sequential search
252
+ // queries — pacing those would tax every interactive lookup.
253
+ const embedder = new GeminiEmbedder();
254
+ await embedder.embed(['query one']);
255
+ await embedder.embed(['query two']);
256
+ await embedder.embed(['query three']);
257
+ expect(delays).toHaveLength(0);
258
+ });
259
+ });
260
+ // ─── Quota-error classification (#2562) ──────────────
261
+ describe('isQuotaError', () => {
262
+ it.each([
263
+ ['status 429', Object.assign(new Error('x'), { status: 429 }), true],
264
+ ['code 429', Object.assign(new Error('x'), { code: 429 }), true],
265
+ ['RESOURCE_EXHAUSTED in message', new Error('got RESOURCE_EXHAUSTED from upstream'), true],
266
+ [
267
+ 'RESOURCE_EXHAUSTED name',
268
+ Object.assign(new Error('x'), { name: 'RESOURCE_EXHAUSTED' }),
269
+ true,
270
+ ],
271
+ ['503 unavailable', Object.assign(new Error('unavailable'), { status: 503 }), false],
272
+ ['401 auth', Object.assign(new Error('unauthorized'), { status: 401 }), false],
273
+ ['non-error', 'RESOURCE_EXHAUSTED', false],
274
+ ])('%s', (_label, err, expected) => {
275
+ expect(isQuotaError(err)).toBe(expected);
276
+ });
277
+ });
278
+ // ─── RetryInfo extraction (#2562) ────────────────────
279
+ describe('extractRetryDelayMs', () => {
280
+ it('reads a structured errorDetails RetryInfo entry', () => {
281
+ const err = Object.assign(new Error('quota'), {
282
+ errorDetails: [
283
+ { '@type': 'type.googleapis.com/google.rpc.BadRequest' },
284
+ { '@type': 'type.googleapis.com/google.rpc.RetryInfo', retryDelay: '18s' },
285
+ ],
286
+ });
287
+ expect(extractRetryDelayMs(err)).toBe(18_000);
288
+ });
289
+ it('falls back to a retryDelay embedded in the message JSON', () => {
290
+ const err = new Error('429 {"error":{"details":[{"retryDelay":"7s"}]}}');
291
+ expect(extractRetryDelayMs(err)).toBe(7_000);
292
+ });
293
+ it('supports fractional seconds', () => {
294
+ const err = Object.assign(new Error('quota'), {
295
+ errorDetails: [{ retryDelay: '2.5s' }],
296
+ });
297
+ expect(extractRetryDelayMs(err)).toBe(2_500);
298
+ });
299
+ it('caps a pathological delay at 60s', () => {
300
+ const err = Object.assign(new Error('quota'), {
301
+ errorDetails: [{ retryDelay: '3600s' }],
302
+ });
303
+ expect(extractRetryDelayMs(err)).toBe(60_000);
304
+ });
305
+ it('returns null when no delay is present (caller uses exponential backoff)', () => {
306
+ expect(extractRetryDelayMs(new Error('plain rate limited'))).toBeNull();
307
+ expect(extractRetryDelayMs('not an error')).toBeNull();
308
+ });
157
309
  });
158
310
  //# sourceMappingURL=gemini-embedder.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"gemini-embedder.test.js","sourceRoot":"","sources":["../../src/embedders/gemini-embedder.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"gemini-embedder.test.js","sourceRoot":"","sources":["../../src/embedders/gemini-embedder.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAEzE,OAAO,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC5D,OAAO,EAAE,mBAAmB,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAEzF,yDAAyD;AAEzD,MAAM,gBAAgB,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;AAEjC,EAAE,CAAC,IAAI,CAAC,eAAe,EAAE,GAAG,EAAE,CAAC,CAAC;IAC9B,WAAW,EAAE;QACX,MAAM,GAAG,EAAE,YAAY,EAAE,gBAAgB,EAAE,CAAC;KAC7C;CACF,CAAC,CAAC,CAAC;AAEJ,yDAAyD;AAEzD,4DAA4D;AAC5D,SAAS,aAAa,CAAC,KAAa,EAAE,OAAe,GAAG;IACtD,OAAO;QACL,UAAU,EAAE,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;YACnD,MAAM,EAAE,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;SACpC,CAAC,CAAC;KACJ,CAAC;AACJ,CAAC;AAED,iGAAiG;AACjG,SAAS,aAAa;IACpB,MAAM,MAAM,GAA2B,EAAE,CAAC;IAC1C,EAAE,CAAC,KAAK,CAAC,UAAU,EAAE,YAAY,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,EAAc,EAAE,EAAW,EAAE,EAAE;QACrF,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAChB,EAAE,EAAE,CAAC;QACL,OAAO,CAA6C,CAAC;IACvD,CAAC,CAAU,CAAC,CAAC;IACb,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,yDAAyD;AAEzD,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;IAC9B,UAAU,CAAC,GAAG,EAAE;QACd,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,GAAG,iBAAiB,CAAC;QAClD,gBAAgB,CAAC,SAAS,EAAE,CAAC;QAC7B,oFAAoF;QACpF,EAAE,CAAC,KAAK,CAAC,UAAU,EAAE,YAAY,CAAC,CAAC,kBAAkB,CAAC,CAAC,EAAc,EAAE,EAAE;YACvE,EAAE,EAAE,CAAC;YACL,OAAO,CAA6C,CAAC;QACvD,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,GAAG,EAAE;QACb,OAAO,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;QACrC,OAAO,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;QACrC,EAAE,CAAC,eAAe,EAAE,CAAC;IACvB,CAAC,CAAC,CAAC;IAEH,yDAAyD;IAEzD,EAAE,CAAC,yCAAyC,EAAE,GAAG,EAAE;QACjD,OAAO,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;QACrC,MAAM,CAAC,GAAG,EAAE,CAAC,IAAI,cAAc,EAAE,CAAC,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;IAC/D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wBAAwB,EAAE,GAAG,EAAE;QAChC,MAAM,CAAC,GAAG,EAAE,CAAC,IAAI,cAAc,EAAE,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;IACnD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oCAAoC,EAAE,GAAG,EAAE;QAC5C,OAAO,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;QACrC,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,GAAG,YAAY,CAAC;QAC7C,MAAM,CAAC,GAAG,EAAE,CAAC,IAAI,cAAc,EAAE,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;IACnD,CAAC,CAAC,CAAC;IAEH,sDAAsD;IAEtD,EAAE,CAAC,qCAAqC,EAAE,KAAK,IAAI,EAAE;QACnD,gBAAgB,CAAC,qBAAqB,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC;QAEzD,MAAM,QAAQ,GAAG,IAAI,cAAc,EAAE,CAAC;QACtC,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC;QAEhE,MAAM,CAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QAC/B,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;QAEpC,MAAM,CAAC,gBAAgB,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;QAClD,MAAM,IAAI,GAAG,gBAAgB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC,CAAC,CAAC,CAAC;QAChD,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC;QACtD,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC;YAC5B,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,EAAE;YAC9B,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,EAAE;YAC9B,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE;SAC9B,CAAC,CAAC;QACH,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;QACxD,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACrD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qCAAqC,EAAE,KAAK,IAAI,EAAE;QACnD,MAAM,QAAQ,GAAG,IAAI,cAAc,EAAE,CAAC;QACtC,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAExC,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QAC3B,MAAM,CAAC,gBAAgB,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;IAClD,CAAC,CAAC,CAAC;IAEH,sDAAsD;IAEtD,EAAE,CAAC,4CAA4C,EAAE,KAAK,IAAI,EAAE;QAC1D,gBAAgB;aACb,qBAAqB,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;aACzC,qBAAqB,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC,CAAC;QAE5C,MAAM,QAAQ,GAAG,IAAI,cAAc,EAAE,CAAC;QACtC,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QACjE,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAE3C,MAAM,CAAC,MAAM,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;QACjC,MAAM,CAAC,gBAAgB,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;QAClD,MAAM,CAAC,gBAAgB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;QACtE,MAAM,CAAC,gBAAgB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;IACvE,CAAC,CAAC,CAAC;IAEH,sDAAsD;IAEtD,EAAE,CAAC,0CAA0C,EAAE,KAAK,IAAI,EAAE;QACxD,MAAM,YAAY,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,cAAc,CAAC,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;QAC/E,gBAAgB,CAAC,qBAAqB,CAAC,YAAY,CAAC,CAAC,qBAAqB,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC;QAE7F,MAAM,QAAQ,GAAG,IAAI,cAAc,EAAE,CAAC;QACtC,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;QAE/C,MAAM,CAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QAC/B,MAAM,CAAC,gBAAgB,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;IACpD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2CAA2C,EAAE,KAAK,IAAI,EAAE;QACzD,MAAM,cAAc,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,qBAAqB,CAAC,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;QACxF,gBAAgB,CAAC,qBAAqB,CAAC,cAAc,CAAC,CAAC,qBAAqB,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC;QAE/F,MAAM,QAAQ,GAAG,IAAI,cAAc,EAAE,CAAC;QACtC,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;QAEhD,MAAM,CAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QAC/B,MAAM,CAAC,gBAAgB,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;IACpD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0CAA0C,EAAE,KAAK,IAAI,EAAE;QACxD,MAAM,YAAY,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,gBAAgB,CAAC,EAAE;YAC9D,IAAI,EAAE,oBAAoB;SAC3B,CAAC,CAAC;QACH,gBAAgB,CAAC,qBAAqB,CAAC,YAAY,CAAC,CAAC,qBAAqB,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC;QAE7F,MAAM,QAAQ,GAAG,IAAI,cAAc,EAAE,CAAC;QACtC,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;QAE9C,MAAM,CAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QAC/B,MAAM,CAAC,gBAAgB,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;IACpD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sDAAsD,EAAE,KAAK,IAAI,EAAE;QACpE,MAAM,YAAY,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,cAAc,CAAC,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;QAC/E,gBAAgB;aACb,qBAAqB,CAAC,YAAY,CAAC;aACnC,qBAAqB,CAAC,YAAY,CAAC;aACnC,qBAAqB,CAAC,YAAY,CAAC;aACnC,qBAAqB,CAAC,YAAY,CAAC,CAAC;QAEvC,MAAM,QAAQ,GAAG,IAAI,cAAc,EAAE,CAAC;QAEtC,MAAM,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;QACnE,MAAM,CAAC,gBAAgB,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;IACpD,CAAC,CAAC,CAAC;IAEH,sDAAsD;IAEtD,EAAE,CAAC,wCAAwC,EAAE,KAAK,IAAI,EAAE;QACtD,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,cAAc,CAAC,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;QAC1E,gBAAgB,CAAC,qBAAqB,CAAC,OAAO,CAAC,CAAC;QAEhD,MAAM,QAAQ,GAAG,IAAI,cAAc,EAAE,CAAC;QAEtC,MAAM,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;QACvE,MAAM,CAAC,gBAAgB,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;IACpD,CAAC,CAAC,CAAC;IAEH,sDAAsD;IAEtD,EAAE,CAAC,gDAAgD,EAAE,KAAK,IAAI,EAAE;QAC9D,gBAAgB,CAAC,qBAAqB,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,cAAc;QAExE,MAAM,QAAQ,GAAG,IAAI,cAAc,EAAE,CAAC;QAEtC,MAAM,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,uBAAuB,CAAC,CAAC;IACpF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6CAA6C,EAAE,KAAK,IAAI,EAAE;QAC3D,gBAAgB,CAAC,qBAAqB,CAAC,EAAE,UAAU,EAAE,SAAS,EAAE,CAAC,CAAC;QAElE,MAAM,QAAQ,GAAG,IAAI,cAAc,EAAE,CAAC;QAEtC,MAAM,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,uBAAuB,CAAC,CAAC;IAC/E,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0CAA0C,EAAE,KAAK,IAAI,EAAE;QACxD,gBAAgB,CAAC,qBAAqB,CAAC;YACrC,UAAU,EAAE,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;SACpC,CAAC,CAAC;QAEH,MAAM,QAAQ,GAAG,IAAI,cAAc,EAAE,CAAC;QAEtC,MAAM,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;IACxE,CAAC,CAAC,CAAC;IAEH,sDAAsD;IAEtD,EAAE,CAAC,wBAAwB,EAAE,KAAK,IAAI,EAAE;QACtC,gBAAgB,CAAC,qBAAqB,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC;QAEzD,MAAM,QAAQ,GAAG,IAAI,cAAc,CAAC,cAAc,CAAC,CAAC;QACpD,MAAM,QAAQ,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;QAE/B,MAAM,CAAC,gBAAgB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;IACxE,CAAC,CAAC,CAAC;IAEH,sDAAsD;IAEtD,EAAE,CAAC,0EAA0E,EAAE,KAAK,IAAI,EAAE;QACxF,MAAM,YAAY,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,cAAc,CAAC,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;QAC/E,gBAAgB,CAAC,iBAAiB,CAAC,YAAY,CAAC,CAAC;QAEjD,MAAM,QAAQ,GAAG,IAAI,cAAc,EAAE,CAAC;QACtC,MAAM,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,aAAa,CAAC;YAC3D,YAAY,EAAE,MAAM,CAAC,cAAc,CAAC,0CAA0C,CAAC;SAChF,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2DAA2D,EAAE,KAAK,IAAI,EAAE;QACzE,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,qBAAqB,CAAC,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;QAChF,gBAAgB,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC;QAE3C,MAAM,QAAQ,GAAG,IAAI,cAAc,EAAE,CAAC;QACtC,MAAM,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,aAAa,CAAC;YAC3D,YAAY,EAAE,MAAM,CAAC,gBAAgB,CAAC,gBAAgB,CAAC;SACxD,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,sDAAsD;IAEtD,EAAE,CAAC,2EAA2E,EAAE,KAAK,IAAI,EAAE;QACzF,MAAM,MAAM,GAAG,aAAa,EAAE,CAAC;QAE/B,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,cAAc,CAAC,EAAE;YACxD,MAAM,EAAE,GAAG;YACX,YAAY,EAAE,CAAC,EAAE,OAAO,EAAE,0CAA0C,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC;SAC3F,CAAC,CAAC;QACH,gBAAgB,CAAC,qBAAqB,CAAC,QAAQ,CAAC,CAAC,qBAAqB,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC;QAEzF,MAAM,QAAQ,GAAG,IAAI,cAAc,CAAC,SAAS,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC;QAC7D,MAAM,QAAQ,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;QAE/B,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IACnC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CACrB,4EAA4E,EAC5E,KAAK,EAAE,QAAQ,EAAE,EAAE;QACjB,MAAM,MAAM,GAAG,aAAa,EAAE,CAAC;QAE/B,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,cAAc,CAAC,EAAE;YACxD,MAAM,EAAE,GAAG;YACX,YAAY,EAAE,CAAC,EAAE,UAAU,EAAE,QAAQ,EAAE,CAAC;SACzC,CAAC,CAAC;QACH,gBAAgB,CAAC,qBAAqB,CAAC,QAAQ,CAAC,CAAC,qBAAqB,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC;QAEzF,MAAM,QAAQ,GAAG,IAAI,cAAc,CAAC,SAAS,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC;QAC7D,MAAM,QAAQ,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;QAE/B,MAAM,CAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QAC/B,MAAM,CAAC,MAAM,CAAC,CAAC,CAAE,CAAC,CAAC,sBAAsB,CAAC,IAAI,CAAC,CAAC,CAAC,2BAA2B;IAC9E,CAAC,CACF,CAAC;IAEF,EAAE,CAAC,+DAA+D,EAAE,KAAK,IAAI,EAAE;QAC7E,MAAM,MAAM,GAAG,aAAa,EAAE,CAAC;QAE/B,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,mCAAmC,CAAC,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;QAChG,gBAAgB,CAAC,qBAAqB,CAAC,QAAQ,CAAC,CAAC,qBAAqB,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC;QAEzF,MAAM,QAAQ,GAAG,IAAI,cAAc,CAAC,SAAS,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC;QAC7D,MAAM,QAAQ,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;QAE/B,wEAAwE;QACxE,6DAA6D;QAC7D,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,SAAS,IAAI,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACxE,CAAC,CAAC,CAAC;IAEH,sDAAsD;IAEtD,EAAE,CAAC,6EAA6E,EAAE,KAAK,IAAI,EAAE;QAC3F,MAAM,MAAM,GAAG,aAAa,EAAE,CAAC;QAE/B,gBAAgB,CAAC,iBAAiB,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC;QAErD,MAAM,OAAO,GAAG,IAAI,cAAc,CAAC,SAAS,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC;QAC5D,MAAM,OAAO,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;QAChC,MAAM,OAAO,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;QAChC,MAAM,CAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QAE/B,MAAM,KAAK,GAAG,IAAI,cAAc,CAAC,SAAS,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC;QAC9D,MAAM,KAAK,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;QAC9B,MAAM,KAAK,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,0CAA0C;QACzE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC;QAChD,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAE,CAAC;QACxC,MAAM,CAAC,IAAI,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;QAChC,MAAM,CAAC,IAAI,CAAC,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC;IAC1C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kFAAkF,EAAE,KAAK,IAAI,EAAE;QAChG,MAAM,MAAM,GAAG,aAAa,EAAE,CAAC;QAE/B,gBAAgB,CAAC,iBAAiB,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC;QAErD,uEAAuE;QACvE,yEAAyE;QACzE,0EAA0E;QAC1E,MAAM,QAAQ,GAAG,IAAI,cAAc,EAAE,CAAC;QACtC,MAAM,QAAQ,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;QACjC,MAAM,QAAQ,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;QACjC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC;QAChD,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAE,CAAC;QACxC,MAAM,CAAC,IAAI,CAAC,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;QACpC,MAAM,CAAC,IAAI,CAAC,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC;IAC1C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gGAAgG,EAAE,KAAK,IAAI,EAAE;QAC9G,MAAM,MAAM,GAAG,aAAa,EAAE,CAAC;QAE/B,gBAAgB,CAAC,iBAAiB,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC;QAErD,wEAAwE;QACxE,6DAA6D;QAC7D,MAAM,QAAQ,GAAG,IAAI,cAAc,EAAE,CAAC;QACtC,MAAM,QAAQ,CAAC,KAAK,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC;QACpC,MAAM,QAAQ,CAAC,KAAK,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC;QACpC,MAAM,QAAQ,CAAC,KAAK,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC;QACtC,MAAM,CAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IACjC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,wDAAwD;AAExD,QAAQ,CAAC,cAAc,EAAE,GAAG,EAAE;IAC5B,EAAE,CAAC,IAAI,CAAC;QACN,CAAC,YAAY,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,GAAG,CAAC,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,EAAE,IAAI,CAAC;QACpE,CAAC,UAAU,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,EAAE,IAAI,CAAC;QAChE,CAAC,+BAA+B,EAAE,IAAI,KAAK,CAAC,sCAAsC,CAAC,EAAE,IAAI,CAAC;QAC1F;YACE,yBAAyB;YACzB,MAAM,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,EAAE,oBAAoB,EAAE,CAAC;YAC7D,IAAI;SACL;QACD,CAAC,iBAAiB,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,aAAa,CAAC,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,EAAE,KAAK,CAAC;QACpF,CAAC,UAAU,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,cAAc,CAAC,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,EAAE,KAAK,CAAC;QAC9E,CAAC,WAAW,EAAE,oBAAoB,EAAE,KAAK,CAAC;KAC3C,CAAC,CAAC,IAAI,EAAE,CAAC,MAAM,EAAE,GAAG,EAAE,QAAQ,EAAE,EAAE;QACjC,MAAM,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC3C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,wDAAwD;AAExD,QAAQ,CAAC,qBAAqB,EAAE,GAAG,EAAE;IACnC,EAAE,CAAC,iDAAiD,EAAE,GAAG,EAAE;QACzD,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,EAAE;YAC5C,YAAY,EAAE;gBACZ,EAAE,OAAO,EAAE,2CAA2C,EAAE;gBACxD,EAAE,OAAO,EAAE,0CAA0C,EAAE,UAAU,EAAE,KAAK,EAAE;aAC3E;SACF,CAAC,CAAC;QACH,MAAM,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAChD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yDAAyD,EAAE,GAAG,EAAE;QACjE,MAAM,GAAG,GAAG,IAAI,KAAK,CAAC,iDAAiD,CAAC,CAAC;QACzE,MAAM,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC/C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6BAA6B,EAAE,GAAG,EAAE;QACrC,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,EAAE;YAC5C,YAAY,EAAE,CAAC,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC;SACvC,CAAC,CAAC;QACH,MAAM,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC/C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kCAAkC,EAAE,GAAG,EAAE;QAC1C,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,EAAE;YAC5C,YAAY,EAAE,CAAC,EAAE,UAAU,EAAE,OAAO,EAAE,CAAC;SACxC,CAAC,CAAC;QACH,MAAM,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAChD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yEAAyE,EAAE,GAAG,EAAE;QACjF,MAAM,CAAC,mBAAmB,CAAC,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;QACxE,MAAM,CAAC,mBAAmB,CAAC,cAAc,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;IACzD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -3,7 +3,8 @@ export declare class OpenAIEmbedder implements Embedder {
3
3
  readonly dimensions: number;
4
4
  private client;
5
5
  private model;
6
- constructor(model?: string, dimensions?: number);
6
+ private pace;
7
+ constructor(model?: string, dimensions?: number, throttleMs?: number);
7
8
  embed(texts: string[]): Promise<number[][]>;
8
9
  private embedWithRetry;
9
10
  }
@@ -1 +1 @@
1
- {"version":3,"file":"openai-embedder.d.ts","sourceRoot":"","sources":["../../src/embedders/openai-embedder.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAO9C,qBAAa,cAAe,YAAW,QAAQ;IAC7C,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,KAAK,CAAS;gBAEV,KAAK,GAAE,MAAiC,EAAE,UAAU,CAAC,EAAE,MAAM;IAgBnE,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;YAkBnC,cAAc;CA0B7B"}
1
+ {"version":3,"file":"openai-embedder.d.ts","sourceRoot":"","sources":["../../src/embedders/openai-embedder.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAQ9C,qBAAa,cAAe,YAAW,QAAQ;IAC7C,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,IAAI,CAAsB;gBAGhC,KAAK,GAAE,MAAiC,EACxC,UAAU,CAAC,EAAE,MAAM,EACnB,UAAU,GAAE,MAAU;IAkBlB,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;YAuBnC,cAAc;CAqC7B"}