@elizaos/plugin-knowledge 1.5.14 → 1.6.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/index.d.ts CHANGED
@@ -19,6 +19,11 @@ declare const ModelConfigSchema: z.ZodObject<{
19
19
  EMBEDDING_DIMENSION: z.ZodEffects<z.ZodOptional<z.ZodUnion<[z.ZodString, z.ZodNumber]>>, number, string | number | undefined>;
20
20
  LOAD_DOCS_ON_STARTUP: z.ZodDefault<z.ZodBoolean>;
21
21
  CTX_KNOWLEDGE_ENABLED: z.ZodDefault<z.ZodBoolean>;
22
+ RATE_LIMIT_ENABLED: z.ZodDefault<z.ZodBoolean>;
23
+ MAX_CONCURRENT_REQUESTS: z.ZodEffects<z.ZodOptional<z.ZodUnion<[z.ZodString, z.ZodNumber]>>, number, string | number | undefined>;
24
+ REQUESTS_PER_MINUTE: z.ZodEffects<z.ZodOptional<z.ZodUnion<[z.ZodString, z.ZodNumber]>>, number, string | number | undefined>;
25
+ TOKENS_PER_MINUTE: z.ZodEffects<z.ZodOptional<z.ZodUnion<[z.ZodString, z.ZodNumber]>>, number, string | number | undefined>;
26
+ BATCH_DELAY_MS: z.ZodEffects<z.ZodOptional<z.ZodUnion<[z.ZodString, z.ZodNumber]>>, number, string | number | undefined>;
22
27
  }, "strip", z.ZodTypeAny, {
23
28
  TEXT_EMBEDDING_MODEL: string;
24
29
  MAX_INPUT_TOKENS: number;
@@ -26,6 +31,11 @@ declare const ModelConfigSchema: z.ZodObject<{
26
31
  EMBEDDING_DIMENSION: number;
27
32
  LOAD_DOCS_ON_STARTUP: boolean;
28
33
  CTX_KNOWLEDGE_ENABLED: boolean;
34
+ RATE_LIMIT_ENABLED: boolean;
35
+ MAX_CONCURRENT_REQUESTS: number;
36
+ REQUESTS_PER_MINUTE: number;
37
+ TOKENS_PER_MINUTE: number;
38
+ BATCH_DELAY_MS: number;
29
39
  EMBEDDING_PROVIDER?: "openai" | "google" | undefined;
30
40
  TEXT_PROVIDER?: "openai" | "google" | "anthropic" | "openrouter" | undefined;
31
41
  OPENAI_API_KEY?: string | undefined;
@@ -55,6 +65,11 @@ declare const ModelConfigSchema: z.ZodObject<{
55
65
  EMBEDDING_DIMENSION?: string | number | undefined;
56
66
  LOAD_DOCS_ON_STARTUP?: boolean | undefined;
57
67
  CTX_KNOWLEDGE_ENABLED?: boolean | undefined;
68
+ RATE_LIMIT_ENABLED?: boolean | undefined;
69
+ MAX_CONCURRENT_REQUESTS?: string | number | undefined;
70
+ REQUESTS_PER_MINUTE?: string | number | undefined;
71
+ TOKENS_PER_MINUTE?: string | number | undefined;
72
+ BATCH_DELAY_MS?: string | number | undefined;
58
73
  }>;
59
74
  type ModelConfig = z.infer<typeof ModelConfigSchema>;
60
75
  /**
@@ -65,6 +80,8 @@ interface ProviderRateLimits {
65
80
  requestsPerMinute: number;
66
81
  tokensPerMinute?: number;
67
82
  provider: string;
83
+ rateLimitEnabled: boolean;
84
+ batchDelayMs: number;
68
85
  }
69
86
  /**
70
87
  * Options for text generation overrides
@@ -149,6 +166,11 @@ interface KnowledgeConfig {
149
166
  EMBEDDING_PROVIDER?: string;
150
167
  TEXT_PROVIDER?: string;
151
168
  TEXT_EMBEDDING_MODEL?: string;
169
+ RATE_LIMIT_ENABLED?: boolean;
170
+ MAX_CONCURRENT_REQUESTS?: number;
171
+ REQUESTS_PER_MINUTE?: number;
172
+ TOKENS_PER_MINUTE?: number;
173
+ BATCH_DELAY_MS?: number;
152
174
  }
153
175
  interface LoadResult {
154
176
  successful: number;
package/dist/index.html CHANGED
@@ -5,8 +5,8 @@
5
5
  <link rel="icon" type="image/svg+xml" href="/vite.svg" />
6
6
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
7
7
  <title>Agent Plugin View</title>
8
- <script type="module" crossorigin src="./assets/index-DtOcbZ9V.js"></script>
9
- <link rel="stylesheet" crossorigin href="./assets/index-crC0VS8M.css">
8
+ <script type="module" crossorigin src="./assets/index-DcxhjPNa.js"></script>
9
+ <link rel="stylesheet" crossorigin href="./assets/index-CFqKS0Ch.css">
10
10
  </head>
11
11
  <body>
12
12
  <div id="root"></div>
package/dist/index.js CHANGED
@@ -181,7 +181,20 @@ var ModelConfigSchema = z.object({
181
181
  // config setting
182
182
  LOAD_DOCS_ON_STARTUP: z.boolean().default(false),
183
183
  // Contextual Knowledge settings
184
- CTX_KNOWLEDGE_ENABLED: z.boolean().default(false)
184
+ CTX_KNOWLEDGE_ENABLED: z.boolean().default(false),
185
+ // Rate limiting settings
186
+ // Set RATE_LIMIT_ENABLED=false to disable all rate limiting for fast uploads
187
+ // Useful when using APIs without rate limits (e.g., self-hosted models)
188
+ // High defaults optimized for Vercel gateway / high-throughput APIs
189
+ RATE_LIMIT_ENABLED: z.boolean().default(true),
190
+ // Maximum concurrent requests (default: 150, set higher for faster processing)
191
+ MAX_CONCURRENT_REQUESTS: z.string().or(z.number()).optional().transform((val) => val ? typeof val === "string" ? parseInt(val, 10) : val : 150),
192
+ // Requests per minute limit (default: 300)
193
+ REQUESTS_PER_MINUTE: z.string().or(z.number()).optional().transform((val) => val ? typeof val === "string" ? parseInt(val, 10) : val : 300),
194
+ // Tokens per minute limit (default: 750000)
195
+ TOKENS_PER_MINUTE: z.string().or(z.number()).optional().transform((val) => val ? typeof val === "string" ? parseInt(val, 10) : val : 75e4),
196
+ // Delay between batches in milliseconds (default: 100, set to 0 for no delay)
197
+ BATCH_DELAY_MS: z.string().or(z.number()).optional().transform((val) => val ? typeof val === "string" ? parseInt(val, 10) : val : 100)
185
198
  });
186
199
  var KnowledgeServiceType = {
187
200
  KNOWLEDGE: "knowledge"
@@ -243,7 +256,14 @@ function validateModelConfig(runtime) {
243
256
  MAX_OUTPUT_TOKENS: getSetting("MAX_OUTPUT_TOKENS", "4096"),
244
257
  EMBEDDING_DIMENSION: embeddingDimension,
245
258
  LOAD_DOCS_ON_STARTUP: parseBooleanEnv(getSetting("LOAD_DOCS_ON_STARTUP")),
246
- CTX_KNOWLEDGE_ENABLED: ctxKnowledgeEnabled
259
+ CTX_KNOWLEDGE_ENABLED: ctxKnowledgeEnabled,
260
+ // Rate limiting settings - disable for fast uploads with APIs without limits
261
+ // High defaults optimized for Vercel gateway / high-throughput APIs
262
+ RATE_LIMIT_ENABLED: parseBooleanEnv(getSetting("RATE_LIMIT_ENABLED", "true")),
263
+ MAX_CONCURRENT_REQUESTS: getSetting("MAX_CONCURRENT_REQUESTS", "150"),
264
+ REQUESTS_PER_MINUTE: getSetting("REQUESTS_PER_MINUTE", "300"),
265
+ TOKENS_PER_MINUTE: getSetting("TOKENS_PER_MINUTE", "750000"),
266
+ BATCH_DELAY_MS: getSetting("BATCH_DELAY_MS", "100")
247
267
  });
248
268
  validateConfigRequirements(config, assumePluginOpenAI);
249
269
  return config;
@@ -309,49 +329,36 @@ function validateConfigRequirements(config, assumePluginOpenAI) {
309
329
  }
310
330
  async function getProviderRateLimits(runtime) {
311
331
  const config = validateModelConfig(runtime);
312
- const getSetting = (key, defaultValue) => {
313
- if (runtime) {
314
- return runtime.getSetting(key) || defaultValue;
315
- }
316
- return process.env[key] || defaultValue;
317
- };
318
- const maxConcurrentRequests = parseInt(getSetting("MAX_CONCURRENT_REQUESTS", "30"), 10);
319
- const requestsPerMinute = parseInt(getSetting("REQUESTS_PER_MINUTE", "60"), 10);
320
- const tokensPerMinute = parseInt(getSetting("TOKENS_PER_MINUTE", "150000"), 10);
332
+ const rateLimitEnabled = config.RATE_LIMIT_ENABLED;
333
+ const maxConcurrentRequests = config.MAX_CONCURRENT_REQUESTS;
334
+ const requestsPerMinute = config.REQUESTS_PER_MINUTE;
335
+ const tokensPerMinute = config.TOKENS_PER_MINUTE;
336
+ const batchDelayMs = config.BATCH_DELAY_MS;
321
337
  const primaryProvider = config.TEXT_PROVIDER || config.EMBEDDING_PROVIDER;
338
+ if (!rateLimitEnabled) {
339
+ logger.info(
340
+ `[Document Processor] Rate limiting DISABLED - unlimited throughput mode (concurrent: ${maxConcurrentRequests}, batch delay: ${batchDelayMs}ms)`
341
+ );
342
+ return {
343
+ maxConcurrentRequests,
344
+ requestsPerMinute: Number.MAX_SAFE_INTEGER,
345
+ tokensPerMinute: Number.MAX_SAFE_INTEGER,
346
+ provider: primaryProvider || "unlimited",
347
+ rateLimitEnabled: false,
348
+ batchDelayMs
349
+ };
350
+ }
322
351
  logger.debug(
323
- `[Document Processor] Rate limiting for ${primaryProvider}: ${requestsPerMinute} RPM, ${tokensPerMinute} TPM, ${maxConcurrentRequests} concurrent`
352
+ `[Document Processor] Rate limiting for ${primaryProvider}: ${requestsPerMinute} RPM, ${tokensPerMinute} TPM, ${maxConcurrentRequests} concurrent, ${batchDelayMs}ms batch delay`
324
353
  );
325
- switch (primaryProvider) {
326
- case "anthropic":
327
- return {
328
- maxConcurrentRequests,
329
- requestsPerMinute,
330
- tokensPerMinute,
331
- provider: "anthropic"
332
- };
333
- case "openai":
334
- return {
335
- maxConcurrentRequests,
336
- requestsPerMinute: Math.min(requestsPerMinute, 3e3),
337
- tokensPerMinute: Math.min(tokensPerMinute, 15e4),
338
- provider: "openai"
339
- };
340
- case "google":
341
- return {
342
- maxConcurrentRequests,
343
- requestsPerMinute: Math.min(requestsPerMinute, 60),
344
- tokensPerMinute: Math.min(tokensPerMinute, 1e5),
345
- provider: "google"
346
- };
347
- default:
348
- return {
349
- maxConcurrentRequests,
350
- requestsPerMinute,
351
- tokensPerMinute,
352
- provider: primaryProvider || "unknown"
353
- };
354
- }
354
+ return {
355
+ maxConcurrentRequests,
356
+ requestsPerMinute,
357
+ tokensPerMinute,
358
+ provider: primaryProvider || "unknown",
359
+ rateLimitEnabled: true,
360
+ batchDelayMs
361
+ };
355
362
  }
356
363
 
357
364
  // src/ctx-embeddings.ts
@@ -1433,8 +1440,9 @@ function getCtxKnowledgeEnabled(runtime) {
1433
1440
  let source;
1434
1441
  let rawValue;
1435
1442
  if (runtime) {
1436
- rawValue = runtime.getSetting("CTX_KNOWLEDGE_ENABLED");
1437
- const cleanValue = rawValue?.toString().trim().toLowerCase();
1443
+ const settingValue = runtime.getSetting("CTX_KNOWLEDGE_ENABLED");
1444
+ rawValue = typeof settingValue === "string" ? settingValue : settingValue?.toString();
1445
+ const cleanValue = rawValue?.trim().toLowerCase();
1438
1446
  result = cleanValue === "true";
1439
1447
  source = "runtime.getSetting()";
1440
1448
  } else {
@@ -1490,15 +1498,22 @@ async function processFragmentsSynchronously({
1490
1498
  }
1491
1499
  const docName = documentTitle || documentId.substring(0, 8);
1492
1500
  logger4.info(`[Document Processor] "${docName}": Split into ${chunks.length} chunks`);
1493
- const providerLimits = await getProviderRateLimits();
1494
- const CONCURRENCY_LIMIT = Math.min(30, providerLimits.maxConcurrentRequests || 30);
1501
+ const providerLimits = await getProviderRateLimits(runtime);
1502
+ const CONCURRENCY_LIMIT = providerLimits.maxConcurrentRequests || 30;
1495
1503
  const rateLimiter = createRateLimiter(
1496
1504
  providerLimits.requestsPerMinute || 60,
1497
- providerLimits.tokensPerMinute
1498
- );
1499
- logger4.debug(
1500
- `[Document Processor] Rate limits: ${providerLimits.requestsPerMinute} RPM, ${providerLimits.tokensPerMinute} TPM (${providerLimits.provider}, concurrency: ${CONCURRENCY_LIMIT})`
1505
+ providerLimits.tokensPerMinute,
1506
+ providerLimits.rateLimitEnabled
1501
1507
  );
1508
+ if (!providerLimits.rateLimitEnabled) {
1509
+ logger4.info(
1510
+ `[Document Processor] UNLIMITED MODE: concurrency ${CONCURRENCY_LIMIT}, batch delay ${providerLimits.batchDelayMs}ms`
1511
+ );
1512
+ } else {
1513
+ logger4.debug(
1514
+ `[Document Processor] Rate limits: ${providerLimits.requestsPerMinute} RPM, ${providerLimits.tokensPerMinute} TPM (${providerLimits.provider}, concurrency: ${CONCURRENCY_LIMIT})`
1515
+ );
1516
+ }
1502
1517
  const { savedCount, failedCount } = await processAndSaveFragments({
1503
1518
  runtime,
1504
1519
  documentId,
@@ -1511,7 +1526,8 @@ async function processFragmentsSynchronously({
1511
1526
  worldId: worldId || agentId,
1512
1527
  concurrencyLimit: CONCURRENCY_LIMIT,
1513
1528
  rateLimiter,
1514
- documentTitle
1529
+ documentTitle,
1530
+ batchDelayMs: providerLimits.batchDelayMs
1515
1531
  });
1516
1532
  const successRate = (savedCount / chunks.length * 100).toFixed(1);
1517
1533
  if (failedCount > 0) {
@@ -1617,7 +1633,8 @@ async function processAndSaveFragments({
1617
1633
  worldId,
1618
1634
  concurrencyLimit,
1619
1635
  rateLimiter,
1620
- documentTitle
1636
+ documentTitle,
1637
+ batchDelayMs = 500
1621
1638
  }) {
1622
1639
  let savedCount = 0;
1623
1640
  let failedCount = 0;
@@ -1693,8 +1710,8 @@ async function processAndSaveFragments({
1693
1710
  failedChunks.push(originalChunkIndex);
1694
1711
  }
1695
1712
  }
1696
- if (i + concurrencyLimit < chunks.length) {
1697
- await new Promise((resolve2) => setTimeout(resolve2, 500));
1713
+ if (i + concurrencyLimit < chunks.length && batchDelayMs > 0) {
1714
+ await new Promise((resolve2) => setTimeout(resolve2, batchDelayMs));
1698
1715
  }
1699
1716
  }
1700
1717
  return { savedCount, failedCount, failedChunks };
@@ -1795,10 +1812,11 @@ async function generateContextsInBatch(runtime, fullDocumentText, chunks, conten
1795
1812
  if (!chunks || chunks.length === 0) {
1796
1813
  return [];
1797
1814
  }
1798
- const providerLimits = await getProviderRateLimits();
1815
+ const providerLimits = await getProviderRateLimits(runtime);
1799
1816
  const rateLimiter = createRateLimiter(
1800
1817
  providerLimits.requestsPerMinute || 60,
1801
- providerLimits.tokensPerMinute
1818
+ providerLimits.tokensPerMinute,
1819
+ providerLimits.rateLimitEnabled
1802
1820
  );
1803
1821
  const config = validateModelConfig(runtime);
1804
1822
  const isUsingOpenRouter = config.TEXT_PROVIDER === "openrouter";
@@ -1839,9 +1857,11 @@ async function generateContextsInBatch(runtime, fullDocumentText, chunks, conten
1839
1857
  }
1840
1858
  } else {
1841
1859
  if (item.usesCaching) {
1860
+ const combinedPrompt = item.systemPrompt ? `${item.systemPrompt}
1861
+
1862
+ ${item.promptText}` : item.promptText;
1842
1863
  return await runtime.useModel(ModelType.TEXT_LARGE, {
1843
- prompt: item.promptText,
1844
- system: item.systemPrompt
1864
+ prompt: combinedPrompt
1845
1865
  });
1846
1866
  } else {
1847
1867
  return await runtime.useModel(ModelType.TEXT_LARGE, {
@@ -1980,11 +2000,14 @@ async function withRateLimitRetry(operation, errorContext, retryDelay) {
1980
2000
  throw error;
1981
2001
  }
1982
2002
  }
1983
- function createRateLimiter(requestsPerMinute, tokensPerMinute) {
2003
+ function createRateLimiter(requestsPerMinute, tokensPerMinute, rateLimitEnabled = true) {
1984
2004
  const requestTimes = [];
1985
2005
  const tokenUsage = [];
1986
2006
  const intervalMs = 60 * 1e3;
1987
2007
  return async function rateLimiter(estimatedTokens = 1e3) {
2008
+ if (!rateLimitEnabled) {
2009
+ return;
2010
+ }
1988
2011
  const now = Date.now();
1989
2012
  while (requestTimes.length > 0 && now - requestTimes[0] > intervalMs) {
1990
2013
  requestTimes.shift();
@@ -2274,7 +2297,8 @@ var KnowledgeService = class _KnowledgeService extends Service {
2274
2297
  );
2275
2298
  try {
2276
2299
  await new Promise((resolve2) => setTimeout(resolve2, 1e3));
2277
- const knowledgePath = this.runtime.getSetting("KNOWLEDGE_PATH");
2300
+ const knowledgePathSetting = this.runtime.getSetting("KNOWLEDGE_PATH");
2301
+ const knowledgePath = typeof knowledgePathSetting === "string" ? knowledgePathSetting : void 0;
2278
2302
  const result = await loadDocsFromPath(
2279
2303
  this,
2280
2304
  this.runtime.agentId,
@@ -3039,7 +3063,11 @@ var documentsProvider = {
3039
3063
  logger8.warn("Knowledge service not available for documents provider");
3040
3064
  return {
3041
3065
  data: { documents: [] },
3042
- values: { documents: "" },
3066
+ values: {
3067
+ documentsCount: 0,
3068
+ documents: "",
3069
+ availableDocuments: ""
3070
+ },
3043
3071
  text: ""
3044
3072
  };
3045
3073
  }
@@ -3055,7 +3083,11 @@ var documentsProvider = {
3055
3083
  if (!documents || documents.length === 0) {
3056
3084
  return {
3057
3085
  data: { documents: [] },
3058
- values: { documents: "" },
3086
+ values: {
3087
+ documentsCount: 0,
3088
+ documents: "",
3089
+ availableDocuments: ""
3090
+ },
3059
3091
  text: ""
3060
3092
  };
3061
3093
  }
@@ -3099,7 +3131,8 @@ ${documentsList}`
3099
3131
  },
3100
3132
  values: {
3101
3133
  documentsCount: documents.length,
3102
- documents: documentsList
3134
+ documents: documentsList,
3135
+ availableDocuments: documentsText
3103
3136
  },
3104
3137
  text: documentsText
3105
3138
  };
@@ -3107,7 +3140,11 @@ ${documentsList}`
3107
3140
  logger8.error("Error in documents provider:", error.message);
3108
3141
  return {
3109
3142
  data: { documents: [], error: error.message },
3110
- values: { documents: "" },
3143
+ values: {
3144
+ documentsCount: 0,
3145
+ documents: "",
3146
+ availableDocuments: ""
3147
+ },
3111
3148
  text: ""
3112
3149
  };
3113
3150
  }