@elizaos/plugin-knowledge 1.0.0-beta.71 → 1.0.0-beta.72

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.
@@ -1,5 +1,5 @@
1
1
  // src/docs-loader.ts
2
- import { logger } from "@elizaos/core";
2
+ import { logger, createUniqueUuid } from "@elizaos/core";
3
3
  import * as fs from "fs";
4
4
  import * as path from "path";
5
5
  function getKnowledgePath() {
@@ -62,7 +62,7 @@ async function loadDocsFromPath(service, agentId, worldId) {
62
62
  ].includes(contentType);
63
63
  const content = isBinary ? fileBuffer.toString("base64") : fileBuffer.toString("utf-8");
64
64
  const knowledgeOptions = {
65
- clientDocumentId: `${agentId}-docs-${Date.now()}-${fileName}`,
65
+ clientDocumentId: createUniqueUuid(agentId + fileName + Date.now(), fileName),
66
66
  contentType,
67
67
  originalFilename: fileName,
68
68
  worldId: worldId || agentId,
@@ -126,4 +126,4 @@ export {
126
126
  getKnowledgePath,
127
127
  loadDocsFromPath
128
128
  };
129
- //# sourceMappingURL=docs-loader-3LDO3WCY.js.map
129
+ //# sourceMappingURL=docs-loader-G3WS433E.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/docs-loader.ts"],"sourcesContent":["import { logger, UUID, createUniqueUuid } from \"@elizaos/core\";\nimport * as fs from \"fs\";\nimport * as path from \"path\";\nimport { KnowledgeService } from \"./service.ts\";\nimport { AddKnowledgeOptions } from \"./types.ts\";\n\n/**\n * Get the knowledge path from environment or default to ./docs\n */\nexport function getKnowledgePath(): string {\n const envPath = process.env.KNOWLEDGE_PATH;\n\n if (envPath) {\n // Resolve relative paths from current working directory\n const resolvedPath = path.resolve(envPath);\n\n if (!fs.existsSync(resolvedPath)) {\n logger.warn(\n `Knowledge path from environment variable does not exist: ${resolvedPath}`\n );\n logger.warn(\n \"Please create the directory or update KNOWLEDGE_PATH environment variable\"\n );\n }\n\n return resolvedPath;\n }\n\n // Default to docs folder in current working directory\n const defaultPath = path.join(process.cwd(), \"docs\");\n\n if (!fs.existsSync(defaultPath)) {\n logger.info(`Default docs folder does not exist at: ${defaultPath}`);\n logger.info(\"To use the knowledge plugin, either:\");\n logger.info('1. Create a \"docs\" folder in your project root');\n logger.info(\n \"2. Set KNOWLEDGE_PATH environment variable to your documents folder\"\n );\n }\n\n return defaultPath;\n}\n\n/**\n * Load documents from the knowledge path\n */\nexport async function loadDocsFromPath(\n service: KnowledgeService,\n agentId: UUID,\n worldId?: UUID\n): Promise<{ total: number; successful: number; failed: number }> {\n const docsPath = getKnowledgePath();\n\n if (!fs.existsSync(docsPath)) {\n logger.warn(`Knowledge path does not exist: ${docsPath}`);\n return { total: 0, successful: 0, failed: 0 };\n }\n\n logger.info(`Loading documents from: ${docsPath}`);\n\n // Get all files recursively\n const files = getAllFiles(docsPath);\n\n if (files.length === 0) {\n logger.info(\"No files found in knowledge path\");\n return { total: 0, successful: 0, failed: 0 };\n }\n\n logger.info(`Found ${files.length} files to process`);\n\n let successful = 0;\n let failed = 0;\n\n for (const filePath of files) {\n try {\n const fileName = path.basename(filePath);\n const fileExt = path.extname(filePath).toLowerCase();\n\n // Skip hidden files and directories\n if (fileName.startsWith(\".\")) {\n continue;\n }\n\n // Determine content type\n const contentType = getContentType(fileExt);\n\n // Skip unsupported file types\n if (!contentType) {\n logger.debug(`Skipping unsupported file type: ${filePath}`);\n continue;\n }\n\n // Read file\n const fileBuffer = fs.readFileSync(filePath);\n\n // For binary files, convert to base64\n const isBinary = [\n \"application/pdf\",\n \"application/msword\",\n \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\",\n ].includes(contentType);\n\n const content = isBinary\n ? fileBuffer.toString(\"base64\")\n : fileBuffer.toString(\"utf-8\");\n\n // Create knowledge options\n const knowledgeOptions: AddKnowledgeOptions = {\n clientDocumentId: createUniqueUuid(agentId + fileName + Date.now(), fileName),\n contentType,\n originalFilename: fileName,\n worldId: worldId || agentId,\n content,\n };\n\n // Process the document\n logger.debug(`Processing document: ${fileName}`);\n const result = await service.addKnowledge(knowledgeOptions);\n\n logger.info(\n `Successfully processed ${fileName}: ${result.fragmentCount} fragments created`\n );\n successful++;\n } catch (error) {\n logger.error(`Failed to process file ${filePath}:`, error);\n failed++;\n }\n }\n\n logger.info(\n `Document loading complete: ${successful} successful, ${failed} failed out of ${files.length} total`\n );\n\n return {\n total: files.length,\n successful,\n failed,\n };\n}\n\n/**\n * Recursively get all files in a directory\n */\nfunction getAllFiles(dirPath: string, files: string[] = []): string[] {\n try {\n const entries = fs.readdirSync(dirPath, { withFileTypes: true });\n\n for (const entry of entries) {\n const fullPath = path.join(dirPath, entry.name);\n\n if (entry.isDirectory()) {\n // Skip node_modules and other common directories\n if (\n ![\"node_modules\", \".git\", \".vscode\", \"dist\", \"build\"].includes(\n entry.name\n )\n ) {\n getAllFiles(fullPath, files);\n }\n } else if (entry.isFile()) {\n files.push(fullPath);\n }\n }\n } catch (error) {\n logger.error(`Error reading directory ${dirPath}:`, error);\n }\n\n return files;\n}\n\n/**\n * Get content type based on file extension\n */\nfunction getContentType(extension: string): string | null {\n const contentTypes: Record<string, string> = {\n \".txt\": \"text/plain\",\n \".md\": \"text/plain\",\n \".tson\": \"text/plain\",\n \".xml\": \"text/plain\",\n \".csv\": \"text/plain\",\n \".html\": \"text/html\",\n \".pdf\": \"application/pdf\",\n \".doc\": \"application/msword\",\n \".docx\":\n \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\",\n };\n\n return contentTypes[extension] || null;\n}\n"],"mappings":";AAAA,SAAS,QAAc,wBAAwB;AAC/C,YAAY,QAAQ;AACpB,YAAY,UAAU;AAOf,SAAS,mBAA2B;AACzC,QAAM,UAAU,QAAQ,IAAI;AAE5B,MAAI,SAAS;AAEX,UAAM,eAAoB,aAAQ,OAAO;AAEzC,QAAI,CAAI,cAAW,YAAY,GAAG;AAChC,aAAO;AAAA,QACL,4DAA4D,YAAY;AAAA,MAC1E;AACA,aAAO;AAAA,QACL;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAGA,QAAM,cAAmB,UAAK,QAAQ,IAAI,GAAG,MAAM;AAEnD,MAAI,CAAI,cAAW,WAAW,GAAG;AAC/B,WAAO,KAAK,0CAA0C,WAAW,EAAE;AACnE,WAAO,KAAK,sCAAsC;AAClD,WAAO,KAAK,gDAAgD;AAC5D,WAAO;AAAA,MACL;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAKA,eAAsB,iBACpB,SACA,SACA,SACgE;AAChE,QAAM,WAAW,iBAAiB;AAElC,MAAI,CAAI,cAAW,QAAQ,GAAG;AAC5B,WAAO,KAAK,kCAAkC,QAAQ,EAAE;AACxD,WAAO,EAAE,OAAO,GAAG,YAAY,GAAG,QAAQ,EAAE;AAAA,EAC9C;AAEA,SAAO,KAAK,2BAA2B,QAAQ,EAAE;AAGjD,QAAM,QAAQ,YAAY,QAAQ;AAElC,MAAI,MAAM,WAAW,GAAG;AACtB,WAAO,KAAK,kCAAkC;AAC9C,WAAO,EAAE,OAAO,GAAG,YAAY,GAAG,QAAQ,EAAE;AAAA,EAC9C;AAEA,SAAO,KAAK,SAAS,MAAM,MAAM,mBAAmB;AAEpD,MAAI,aAAa;AACjB,MAAI,SAAS;AAEb,aAAW,YAAY,OAAO;AAC5B,QAAI;AACF,YAAM,WAAgB,cAAS,QAAQ;AACvC,YAAM,UAAe,aAAQ,QAAQ,EAAE,YAAY;AAGnD,UAAI,SAAS,WAAW,GAAG,GAAG;AAC5B;AAAA,MACF;AAGA,YAAM,cAAc,eAAe,OAAO;AAG1C,UAAI,CAAC,aAAa;AAChB,eAAO,MAAM,mCAAmC,QAAQ,EAAE;AAC1D;AAAA,MACF;AAGA,YAAM,aAAgB,gBAAa,QAAQ;AAG3C,YAAM,WAAW;AAAA,QACf;AAAA,QACA;AAAA,QACA;AAAA,MACF,EAAE,SAAS,WAAW;AAEtB,YAAM,UAAU,WACZ,WAAW,SAAS,QAAQ,IAC5B,WAAW,SAAS,OAAO;AAG/B,YAAM,mBAAwC;AAAA,QAC5C,kBAAkB,iBAAiB,UAAU,WAAW,KAAK,IAAI,GAAG,QAAQ;AAAA,QAC5E;AAAA,QACA,kBAAkB;AAAA,QAClB,SAAS,WAAW;AAAA,QACpB;AAAA,MACF;AAGA,aAAO,MAAM,wBAAwB,QAAQ,EAAE;AAC/C,YAAM,SAAS,MAAM,QAAQ,aAAa,gBAAgB;AAE1D,aAAO;AAAA,QACL,0BAA0B,QAAQ,KAAK,OAAO,aAAa;AAAA,MAC7D;AACA;AAAA,IACF,SAAS,OAAO;AACd,aAAO,MAAM,0BAA0B,QAAQ,KAAK,KAAK;AACzD;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL,8BAA8B,UAAU,gBAAgB,MAAM,kBAAkB,MAAM,MAAM;AAAA,EAC9F;AAEA,SAAO;AAAA,IACL,OAAO,MAAM;AAAA,IACb;AAAA,IACA;AAAA,EACF;AACF;AAKA,SAAS,YAAY,SAAiB,QAAkB,CAAC,GAAa;AACpE,MAAI;AACF,UAAM,UAAa,eAAY,SAAS,EAAE,eAAe,KAAK,CAAC;AAE/D,eAAW,SAAS,SAAS;AAC3B,YAAM,WAAgB,UAAK,SAAS,MAAM,IAAI;AAE9C,UAAI,MAAM,YAAY,GAAG;AAEvB,YACE,CAAC,CAAC,gBAAgB,QAAQ,WAAW,QAAQ,OAAO,EAAE;AAAA,UACpD,MAAM;AAAA,QACR,GACA;AACA,sBAAY,UAAU,KAAK;AAAA,QAC7B;AAAA,MACF,WAAW,MAAM,OAAO,GAAG;AACzB,cAAM,KAAK,QAAQ;AAAA,MACrB;AAAA,IACF;AAAA,EACF,SAAS,OAAO;AACd,WAAO,MAAM,2BAA2B,OAAO,KAAK,KAAK;AAAA,EAC3D;AAEA,SAAO;AACT;AAKA,SAAS,eAAe,WAAkC;AACxD,QAAM,eAAuC;AAAA,IAC3C,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,SAAS;AAAA,IACT,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,SACE;AAAA,EACJ;AAEA,SAAO,aAAa,SAAS,KAAK;AACpC;","names":[]}
package/dist/index.d.ts CHANGED
@@ -1,4 +1,130 @@
1
- import { Plugin } from '@elizaos/core';
1
+ import { UUID, Plugin } from '@elizaos/core';
2
+ import z from 'zod';
3
+
4
+ declare const ModelConfigSchema: z.ZodObject<{
5
+ EMBEDDING_PROVIDER: z.ZodEnum<["openai", "google"]>;
6
+ TEXT_PROVIDER: z.ZodOptional<z.ZodEnum<["openai", "anthropic", "openrouter", "google"]>>;
7
+ OPENAI_API_KEY: z.ZodOptional<z.ZodString>;
8
+ ANTHROPIC_API_KEY: z.ZodOptional<z.ZodString>;
9
+ OPENROUTER_API_KEY: z.ZodOptional<z.ZodString>;
10
+ GOOGLE_API_KEY: z.ZodOptional<z.ZodString>;
11
+ OPENAI_BASE_URL: z.ZodOptional<z.ZodString>;
12
+ ANTHROPIC_BASE_URL: z.ZodOptional<z.ZodString>;
13
+ OPENROUTER_BASE_URL: z.ZodOptional<z.ZodString>;
14
+ GOOGLE_BASE_URL: z.ZodOptional<z.ZodString>;
15
+ TEXT_EMBEDDING_MODEL: z.ZodString;
16
+ TEXT_MODEL: z.ZodOptional<z.ZodString>;
17
+ MAX_INPUT_TOKENS: z.ZodEffects<z.ZodUnion<[z.ZodString, z.ZodNumber]>, number, string | number>;
18
+ MAX_OUTPUT_TOKENS: z.ZodEffects<z.ZodOptional<z.ZodUnion<[z.ZodString, z.ZodNumber]>>, number, string | number | undefined>;
19
+ EMBEDDING_DIMENSION: z.ZodEffects<z.ZodOptional<z.ZodUnion<[z.ZodString, z.ZodNumber]>>, number, string | number | undefined>;
20
+ CTX_KNOWLEDGE_ENABLED: z.ZodDefault<z.ZodBoolean>;
21
+ }, "strip", z.ZodTypeAny, {
22
+ MAX_INPUT_TOKENS: number;
23
+ MAX_OUTPUT_TOKENS: number;
24
+ CTX_KNOWLEDGE_ENABLED: boolean;
25
+ EMBEDDING_PROVIDER: "openai" | "google";
26
+ TEXT_EMBEDDING_MODEL: string;
27
+ EMBEDDING_DIMENSION: number;
28
+ TEXT_PROVIDER?: "openai" | "google" | "anthropic" | "openrouter" | undefined;
29
+ OPENAI_API_KEY?: string | undefined;
30
+ ANTHROPIC_API_KEY?: string | undefined;
31
+ OPENROUTER_API_KEY?: string | undefined;
32
+ GOOGLE_API_KEY?: string | undefined;
33
+ OPENAI_BASE_URL?: string | undefined;
34
+ ANTHROPIC_BASE_URL?: string | undefined;
35
+ OPENROUTER_BASE_URL?: string | undefined;
36
+ GOOGLE_BASE_URL?: string | undefined;
37
+ TEXT_MODEL?: string | undefined;
38
+ }, {
39
+ MAX_INPUT_TOKENS: string | number;
40
+ EMBEDDING_PROVIDER: "openai" | "google";
41
+ TEXT_EMBEDDING_MODEL: string;
42
+ MAX_OUTPUT_TOKENS?: string | number | undefined;
43
+ CTX_KNOWLEDGE_ENABLED?: boolean | undefined;
44
+ TEXT_PROVIDER?: "openai" | "google" | "anthropic" | "openrouter" | undefined;
45
+ OPENAI_API_KEY?: string | undefined;
46
+ ANTHROPIC_API_KEY?: string | undefined;
47
+ OPENROUTER_API_KEY?: string | undefined;
48
+ GOOGLE_API_KEY?: string | undefined;
49
+ OPENAI_BASE_URL?: string | undefined;
50
+ ANTHROPIC_BASE_URL?: string | undefined;
51
+ OPENROUTER_BASE_URL?: string | undefined;
52
+ GOOGLE_BASE_URL?: string | undefined;
53
+ TEXT_MODEL?: string | undefined;
54
+ EMBEDDING_DIMENSION?: string | number | undefined;
55
+ }>;
56
+ type ModelConfig = z.infer<typeof ModelConfigSchema>;
57
+ /**
58
+ * Interface for provider rate limits
59
+ */
60
+ interface ProviderRateLimits {
61
+ maxConcurrentRequests: number;
62
+ requestsPerMinute: number;
63
+ tokensPerMinute?: number;
64
+ provider: string;
65
+ }
66
+ /**
67
+ * Options for text generation overrides
68
+ */
69
+ interface TextGenerationOptions {
70
+ provider?: "anthropic" | "openai" | "openrouter" | "google";
71
+ modelName?: string;
72
+ maxTokens?: number;
73
+ /**
74
+ * Document to cache for contextual retrieval.
75
+ * When provided (along with an Anthropic model via OpenRouter), this enables prompt caching.
76
+ * The document is cached with the provider and subsequent requests will reuse the cached document,
77
+ * significantly reducing costs for multiple operations on the same document.
78
+ * Most effective with contextual retrieval for Knowledge applications.
79
+ */
80
+ cacheDocument?: string;
81
+ /**
82
+ * Options for controlling the cache behavior.
83
+ * Currently supports { type: 'ephemeral' } which sets up a temporary cache.
84
+ * Cache expires after approximately 5 minutes with Anthropic models.
85
+ * This can reduce costs by up to 90% for reads after the initial cache write.
86
+ */
87
+ cacheOptions?: {
88
+ type: "ephemeral";
89
+ };
90
+ /**
91
+ * Whether to automatically detect and enable caching for contextual retrieval.
92
+ * Default is true for OpenRouter+Anthropic models with document-chunk prompts.
93
+ * Set to false to disable automatic caching detection.
94
+ */
95
+ autoCacheContextualRetrieval?: boolean;
96
+ }
97
+ /**
98
+ * Options for adding knowledge to the system
99
+ */
100
+ interface AddKnowledgeOptions {
101
+ /** Client-provided document ID */
102
+ clientDocumentId: UUID;
103
+ /** MIME type of the file */
104
+ contentType: string;
105
+ /** Original filename */
106
+ originalFilename: string;
107
+ /** World ID for storage */
108
+ worldId: UUID;
109
+ /**
110
+ * Content of the document. Should be:
111
+ * - Base64 encoded string for binary files (PDFs, DOCXs, etc)
112
+ * - Plain text for text files
113
+ */
114
+ content: string;
115
+ /** Optional room ID for storage scoping */
116
+ roomId?: UUID;
117
+ /** Optional entity ID for storage scoping */
118
+ entityId?: UUID;
119
+ }
120
+ declare module "@elizaos/core" {
121
+ interface ServiceTypeRegistry {
122
+ KNOWLEDGE: "knowledge";
123
+ }
124
+ }
125
+ declare const KnowledgeServiceType: {
126
+ KNOWLEDGE: "knowledge";
127
+ };
2
128
 
3
129
  /**
4
130
  * Knowledge Plugin - Main Entry Point
@@ -11,4 +137,4 @@ import { Plugin } from '@elizaos/core';
11
137
  */
12
138
  declare const knowledgePlugin: Plugin;
13
139
 
14
- export { knowledgePlugin as default, knowledgePlugin };
140
+ export { type AddKnowledgeOptions, KnowledgeServiceType, type ModelConfig, ModelConfigSchema, type ProviderRateLimits, type TextGenerationOptions, knowledgePlugin as default, knowledgePlugin };
package/dist/index.js CHANGED
@@ -2763,7 +2763,7 @@ var KnowledgeTestSuite = class {
2763
2763
  var tests_default = new KnowledgeTestSuite();
2764
2764
 
2765
2765
  // src/actions.ts
2766
- import { logger as logger5 } from "@elizaos/core";
2766
+ import { logger as logger5, createUniqueUuid as createUniqueUuid2 } from "@elizaos/core";
2767
2767
  import * as fs2 from "fs";
2768
2768
  import * as path2 from "path";
2769
2769
  var processKnowledgeAction = {
@@ -2873,7 +2873,7 @@ var processKnowledgeAction = {
2873
2873
  else if ([".txt", ".md", ".tson", ".xml", ".csv"].includes(fileExt))
2874
2874
  contentType = "text/plain";
2875
2875
  const knowledgeOptions = {
2876
- clientDocumentId: `${runtime.agentId}-${Date.now()}-${fileName}`,
2876
+ clientDocumentId: createUniqueUuid2(runtime.agentId + fileName + Date.now(), fileName),
2877
2877
  contentType,
2878
2878
  originalFilename: fileName,
2879
2879
  worldId: runtime.agentId,
@@ -2900,7 +2900,7 @@ var processKnowledgeAction = {
2900
2900
  return;
2901
2901
  }
2902
2902
  const knowledgeOptions = {
2903
- clientDocumentId: `${runtime.agentId}-${Date.now()}-text`,
2903
+ clientDocumentId: createUniqueUuid2(runtime.agentId + "text" + Date.now(), "user-knowledge"),
2904
2904
  contentType: "text/plain",
2905
2905
  originalFilename: "user-knowledge.txt",
2906
2906
  worldId: runtime.agentId,
@@ -3089,7 +3089,7 @@ var knowledgePlugin = {
3089
3089
  try {
3090
3090
  const service = runtime.getService(KnowledgeService.serviceType);
3091
3091
  if (service instanceof KnowledgeService) {
3092
- const { loadDocsFromPath } = await import("./docs-loader-3LDO3WCY.js");
3092
+ const { loadDocsFromPath } = await import("./docs-loader-G3WS433E.js");
3093
3093
  const result = await loadDocsFromPath(service, runtime.agentId);
3094
3094
  if (result.successful > 0) {
3095
3095
  logger6.info(
@@ -3116,6 +3116,8 @@ var knowledgePlugin = {
3116
3116
  };
3117
3117
  var index_default = knowledgePlugin;
3118
3118
  export {
3119
+ KnowledgeServiceType,
3120
+ ModelConfigSchema,
3119
3121
  index_default as default,
3120
3122
  knowledgePlugin
3121
3123
  };