@elizaos/plugin-knowledge
Version:
Plugin for Knowledge
430 lines (422 loc) • 16 kB
TypeScript
import { UUID, Service, Metadata, IAgentRuntime, Memory, KnowledgeItem, Provider, Plugin } from '@elizaos/core';
import z from 'zod';
declare const ModelConfigSchema: z.ZodObject<{
EMBEDDING_PROVIDER: z.ZodOptional<z.ZodEnum<["openai", "google"]>>;
TEXT_PROVIDER: z.ZodOptional<z.ZodEnum<["openai", "anthropic", "openrouter", "google"]>>;
OPENAI_API_KEY: z.ZodOptional<z.ZodString>;
ANTHROPIC_API_KEY: z.ZodOptional<z.ZodString>;
OPENROUTER_API_KEY: z.ZodOptional<z.ZodString>;
GOOGLE_API_KEY: z.ZodOptional<z.ZodString>;
OPENAI_BASE_URL: z.ZodOptional<z.ZodString>;
ANTHROPIC_BASE_URL: z.ZodOptional<z.ZodString>;
OPENROUTER_BASE_URL: z.ZodOptional<z.ZodString>;
GOOGLE_BASE_URL: z.ZodOptional<z.ZodString>;
TEXT_EMBEDDING_MODEL: z.ZodString;
TEXT_MODEL: z.ZodOptional<z.ZodString>;
MAX_INPUT_TOKENS: z.ZodEffects<z.ZodUnion<[z.ZodString, z.ZodNumber]>, number, string | number>;
MAX_OUTPUT_TOKENS: z.ZodEffects<z.ZodOptional<z.ZodUnion<[z.ZodString, z.ZodNumber]>>, number, string | number | undefined>;
EMBEDDING_DIMENSION: z.ZodEffects<z.ZodOptional<z.ZodUnion<[z.ZodString, z.ZodNumber]>>, number, string | number | undefined>;
LOAD_DOCS_ON_STARTUP: z.ZodDefault<z.ZodBoolean>;
CTX_KNOWLEDGE_ENABLED: z.ZodDefault<z.ZodBoolean>;
RATE_LIMIT_ENABLED: z.ZodDefault<z.ZodBoolean>;
MAX_CONCURRENT_REQUESTS: z.ZodEffects<z.ZodOptional<z.ZodUnion<[z.ZodString, z.ZodNumber]>>, number, string | number | undefined>;
REQUESTS_PER_MINUTE: z.ZodEffects<z.ZodOptional<z.ZodUnion<[z.ZodString, z.ZodNumber]>>, number, string | number | undefined>;
TOKENS_PER_MINUTE: z.ZodEffects<z.ZodOptional<z.ZodUnion<[z.ZodString, z.ZodNumber]>>, number, string | number | undefined>;
BATCH_DELAY_MS: z.ZodEffects<z.ZodOptional<z.ZodUnion<[z.ZodString, z.ZodNumber]>>, number, string | number | undefined>;
}, "strip", z.ZodTypeAny, {
TEXT_EMBEDDING_MODEL: string;
MAX_INPUT_TOKENS: number;
MAX_OUTPUT_TOKENS: number;
EMBEDDING_DIMENSION: number;
LOAD_DOCS_ON_STARTUP: boolean;
CTX_KNOWLEDGE_ENABLED: boolean;
RATE_LIMIT_ENABLED: boolean;
MAX_CONCURRENT_REQUESTS: number;
REQUESTS_PER_MINUTE: number;
TOKENS_PER_MINUTE: number;
BATCH_DELAY_MS: number;
EMBEDDING_PROVIDER?: "openai" | "google" | undefined;
TEXT_PROVIDER?: "openai" | "google" | "anthropic" | "openrouter" | undefined;
OPENAI_API_KEY?: string | undefined;
ANTHROPIC_API_KEY?: string | undefined;
OPENROUTER_API_KEY?: string | undefined;
GOOGLE_API_KEY?: string | undefined;
OPENAI_BASE_URL?: string | undefined;
ANTHROPIC_BASE_URL?: string | undefined;
OPENROUTER_BASE_URL?: string | undefined;
GOOGLE_BASE_URL?: string | undefined;
TEXT_MODEL?: string | undefined;
}, {
TEXT_EMBEDDING_MODEL: string;
MAX_INPUT_TOKENS: string | number;
EMBEDDING_PROVIDER?: "openai" | "google" | undefined;
TEXT_PROVIDER?: "openai" | "google" | "anthropic" | "openrouter" | undefined;
OPENAI_API_KEY?: string | undefined;
ANTHROPIC_API_KEY?: string | undefined;
OPENROUTER_API_KEY?: string | undefined;
GOOGLE_API_KEY?: string | undefined;
OPENAI_BASE_URL?: string | undefined;
ANTHROPIC_BASE_URL?: string | undefined;
OPENROUTER_BASE_URL?: string | undefined;
GOOGLE_BASE_URL?: string | undefined;
TEXT_MODEL?: string | undefined;
MAX_OUTPUT_TOKENS?: string | number | undefined;
EMBEDDING_DIMENSION?: string | number | undefined;
LOAD_DOCS_ON_STARTUP?: boolean | undefined;
CTX_KNOWLEDGE_ENABLED?: boolean | undefined;
RATE_LIMIT_ENABLED?: boolean | undefined;
MAX_CONCURRENT_REQUESTS?: string | number | undefined;
REQUESTS_PER_MINUTE?: string | number | undefined;
TOKENS_PER_MINUTE?: string | number | undefined;
BATCH_DELAY_MS?: string | number | undefined;
}>;
type ModelConfig = z.infer<typeof ModelConfigSchema>;
/**
* Interface for provider rate limits
*/
interface ProviderRateLimits {
maxConcurrentRequests: number;
requestsPerMinute: number;
tokensPerMinute?: number;
provider: string;
rateLimitEnabled: boolean;
batchDelayMs: number;
}
/**
* Options for text generation overrides
*/
interface TextGenerationOptions {
provider?: 'anthropic' | 'openai' | 'openrouter' | 'google';
modelName?: string;
maxTokens?: number;
/**
* Document to cache for contextual retrieval.
* When provided (along with an Anthropic model via OpenRouter), this enables prompt caching.
* The document is cached with the provider and subsequent requests will reuse the cached document,
* significantly reducing costs for multiple operations on the same document.
* Most effective with contextual retrieval for Knowledge applications.
*/
cacheDocument?: string;
/**
* Options for controlling the cache behavior.
* Currently supports { type: 'ephemeral' } which sets up a temporary cache.
* Cache expires after approximately 5 minutes with Anthropic models.
* This can reduce costs by up to 90% for reads after the initial cache write.
*/
cacheOptions?: {
type: 'ephemeral';
};
/**
* Whether to automatically detect and enable caching for contextual retrieval.
* Default is true for OpenRouter+Anthropic models with document-chunk prompts.
* Set to false to disable automatic caching detection.
*/
autoCacheContextualRetrieval?: boolean;
}
/**
* Options for adding knowledge to the system
*/
interface AddKnowledgeOptions {
/** Agent ID from the frontend - if not provided, will use runtime.agentId */
agentId?: UUID;
worldId: UUID;
roomId: UUID;
entityId: UUID;
/** Client-provided document ID */
clientDocumentId: UUID;
/** MIME type of the file */
contentType: string;
/** Original filename */
originalFilename: string;
/**
* Content of the document. Should be:
* - Base64 encoded string for binary files (PDFs, DOCXs, etc)
* - Plain text for text files
*/
content: string;
/**
* Optional metadata to associate with the knowledge
* Used for storing additional information like source URL
*/
metadata?: Record<string, unknown>;
}
declare module '@elizaos/core' {
interface ServiceTypeRegistry {
KNOWLEDGE: 'knowledge';
}
}
declare const KnowledgeServiceType: {
KNOWLEDGE: "knowledge";
};
interface KnowledgeDocumentMetadata extends Record<string, any> {
type: string;
source: string;
title?: string;
filename?: string;
fileExt?: string;
fileType?: string;
fileSize?: number;
}
interface KnowledgeConfig {
CTX_KNOWLEDGE_ENABLED: boolean;
LOAD_DOCS_ON_STARTUP: boolean;
MAX_INPUT_TOKENS?: string | number;
MAX_OUTPUT_TOKENS?: string | number;
EMBEDDING_PROVIDER?: string;
TEXT_PROVIDER?: string;
TEXT_EMBEDDING_MODEL?: string;
RATE_LIMIT_ENABLED?: boolean;
MAX_CONCURRENT_REQUESTS?: number;
REQUESTS_PER_MINUTE?: number;
TOKENS_PER_MINUTE?: number;
BATCH_DELAY_MS?: number;
}
interface LoadResult {
successful: number;
failed: number;
errors?: Array<{
filename: string;
error: string;
}>;
}
/**
* Extends the base MemoryMetadata from @elizaos/core with additional fields
*/
interface ExtendedMemoryMetadata extends Record<string, any> {
type?: string;
title?: string;
filename?: string;
path?: string;
description?: string;
fileExt?: string;
timestamp?: number;
contentType?: string;
documentId?: string;
source?: string;
fileType?: string;
fileSize?: number;
position?: number;
originalFilename?: string;
url?: string;
}
/**
* Knowledge Service - Provides retrieval augmented generation capabilities
*/
declare class KnowledgeService extends Service {
static readonly serviceType = "knowledge";
config: Metadata;
private knowledgeConfig;
capabilityDescription: string;
private knowledgeProcessingSemaphore;
/**
* Create a new Knowledge service
* @param runtime Agent runtime
*/
constructor(runtime: IAgentRuntime, config?: Partial<KnowledgeConfig>);
private loadInitialDocuments;
/**
* Start the Knowledge service
* @param runtime Agent runtime
* @returns Initialized Knowledge service
*/
static start(runtime: IAgentRuntime): Promise<KnowledgeService>;
/**
* Stop the Knowledge service
* @param runtime Agent runtime
*/
static stop(runtime: IAgentRuntime): Promise<void>;
/**
* Stop the service
*/
stop(): Promise<void>;
/**
* Add knowledge to the system
* @param options Knowledge options
* @returns Promise with document processing result
*/
addKnowledge(options: AddKnowledgeOptions): Promise<{
clientDocumentId: string;
storedDocumentMemoryId: UUID;
fragmentCount: number;
}>;
/**
* Process a document regardless of type - Called by public addKnowledge
* @param options Document options
* @returns Promise with document processing result
*/
private processDocument;
private handleProcessingError;
checkExistingKnowledge(knowledgeId: UUID): Promise<boolean>;
getKnowledge(message: Memory, scope?: {
roomId?: UUID;
worldId?: UUID;
entityId?: UUID;
}): Promise<KnowledgeItem[]>;
/**
* Enrich a conversation memory with RAG metadata
* This can be called after response generation to add RAG tracking data
* @param memoryId The ID of the conversation memory to enrich
* @param ragMetadata The RAG metadata to add
*/
enrichConversationMemoryWithRAG(memoryId: UUID, ragMetadata: {
retrievedFragments: Array<{
fragmentId: UUID;
documentTitle: string;
similarityScore?: number;
contentPreview: string;
}>;
queryText: string;
totalFragments: number;
retrievalTimestamp: number;
}): Promise<void>;
/**
* Set the current response memory ID for RAG tracking
* This is called by the knowledge provider to track which response memory to enrich
*/
private pendingRAGEnrichment;
/**
* Store RAG metadata for the next conversation memory that gets created
* @param ragMetadata The RAG metadata to associate with the next memory
*/
setPendingRAGMetadata(ragMetadata: any): void;
/**
* Try to enrich recent conversation memories with pending RAG metadata
* This is called periodically to catch memories that were created after RAG retrieval
*/
enrichRecentMemoriesWithPendingRAG(): Promise<void>;
processCharacterKnowledge(items: string[]): Promise<void>;
_internalAddKnowledge(item: KnowledgeItem, // item.id here is expected to be the ID of the "document"
options?: {
targetTokens: number;
overlap: number;
modelContextSize: number;
}, scope?: {
roomId: `${string}-${string}-${string}-${string}-${string}`;
entityId: `${string}-${string}-${string}-${string}-${string}`;
worldId: `${string}-${string}-${string}-${string}-${string}`;
}): Promise<void>;
private processDocumentFragment;
private splitAndCreateFragments;
/**
* Retrieves memories, typically documents, for the agent.
* Corresponds to GET /plugins/knowledge/documents
*/
getMemories(params: {
tableName: string;
roomId?: UUID;
count?: number;
offset?: number;
end?: number;
}): Promise<Memory[]>;
/**
* Counts memories for pagination.
* Corresponds to counting documents or fragments.
*/
countMemories(params: {
tableName: string;
roomId?: UUID;
unique?: boolean;
}): Promise<number>;
/**
* Deletes a specific memory item (knowledge document) by its ID.
* Corresponds to DELETE /plugins/knowledge/documents/:knowledgeId
* Assumes the memoryId corresponds to an item in the 'documents' table or that
* runtime.deleteMemory can correctly identify it.
*/
deleteMemory(memoryId: UUID): Promise<void>;
}
/**
* Represents a knowledge provider that retrieves knowledge from the knowledge base.
* @type {Provider}
* @property {string} name - The name of the knowledge provider.
* @property {string} description - The description of the knowledge provider.
* @property {boolean} dynamic - Indicates if the knowledge provider is dynamic or static.
* @property {Function} get - Asynchronously retrieves knowledge from the knowledge base.
* @param {IAgentRuntime} runtime - The agent runtime object.
* @param {Memory} message - The message containing the query for knowledge retrieval.
* @returns {Object} An object containing the retrieved knowledge data, values, and text.
*/
declare const knowledgeProvider: Provider;
/**
* Represents a static provider that lists available documents in the knowledge base.
* This provider helps the agent understand which documents are available for retrieval.
* @type {Provider}
* @property {string} name - The name of the documents provider.
* @property {string} description - The description of the documents provider.
* @property {boolean} dynamic - Indicates if the provider is static (false).
* @property {Function} get - Asynchronously retrieves the list of available documents.
* @param {IAgentRuntime} runtime - The agent runtime object.
* @returns {Object} An object containing the available documents list.
*/
declare const documentsProvider: Provider;
/**
* Knowledge Plugin - Main Entry Point
*
* This file exports all the necessary functions and types for the Knowledge plugin.
*/
/**
* Configuration options for the Knowledge Plugin
*/
interface KnowledgePluginConfig {
/**
* Enable frontend UI and routes
* Set to false for cloud/server-only deployments
* @default true
*/
enableUI?: boolean;
/**
* Enable HTTP routes for document management
* Set to false for browser-only or minimal deployments
* @default true
*/
enableRoutes?: boolean;
/**
* Enable actions (PROCESS_KNOWLEDGE, SEARCH_KNOWLEDGE)
* @default true
*/
enableActions?: boolean;
/**
* Enable tests
* @default true
*/
enableTests?: boolean;
}
/**
* Create a Knowledge Plugin with custom configuration
* @param config Plugin configuration options
* @returns Configured Plugin instance
*
* @example
* // Cloud runtime mode (service + provider only)
* const plugin = createKnowledgePlugin({
* enableUI: false,
* enableRoutes: false,
* });
*
* @example
* // Browser-only mode (no routes)
* const plugin = createKnowledgePlugin({
* enableRoutes: false,
* });
*
* @example
* // Full mode (default)
* const plugin = createKnowledgePlugin();
*/
declare function createKnowledgePlugin(config?: KnowledgePluginConfig): Plugin;
/**
* Knowledge Plugin - Core mode (Service + Provider only)
* Use this for cloud runtimes or minimal deployments
*/
declare const knowledgePluginCore: Plugin;
/**
* Knowledge Plugin - Headless mode (Service + Provider + Actions, no UI)
* Use this for server deployments without frontend
*/
declare const knowledgePluginHeadless: Plugin;
/**
* Knowledge Plugin - Full mode (default)
* Includes everything: Service, Provider, Actions, Routes, UI, Tests
*/
declare const knowledgePlugin: Plugin;
export { type AddKnowledgeOptions, type ExtendedMemoryMetadata, type KnowledgeConfig, type KnowledgeDocumentMetadata, type KnowledgePluginConfig, KnowledgeService, KnowledgeServiceType, type LoadResult, type ModelConfig, ModelConfigSchema, type ProviderRateLimits, type TextGenerationOptions, createKnowledgePlugin, knowledgePlugin as default, documentsProvider, knowledgePlugin, knowledgePluginCore, knowledgePluginHeadless, knowledgeProvider };