@elizaos/plugin-knowledge 1.5.15 → 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/.vite/manifest.json +1 -1
- package/dist/assets/{index-DRqE0iU1.js → index-DcxhjPNa.js} +4 -4
- package/dist/index.d.ts +22 -0
- package/dist/index.html +1 -1
- package/dist/index.js +84 -60
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
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,7 +5,7 @@
|
|
|
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-
|
|
8
|
+
<script type="module" crossorigin src="./assets/index-DcxhjPNa.js"></script>
|
|
9
9
|
<link rel="stylesheet" crossorigin href="./assets/index-CFqKS0Ch.css">
|
|
10
10
|
</head>
|
|
11
11
|
<body>
|
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
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
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
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
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
|
-
|
|
1437
|
-
|
|
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 =
|
|
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,
|
|
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:
|
|
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
|
|
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,
|