@elizaos/plugin-experience 2.0.0-alpha.1
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.
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../index.ts", "../../actions/record-experience.ts", "../../generated/specs/specs.ts", "../../generated/specs/spec-helpers.ts", "../../evaluators/experienceEvaluator.ts", "../../generated/prompts/typescript/prompts.ts", "../../types.ts", "../../providers/experienceProvider.ts", "../../service.ts", "../../utils/confidenceDecay.ts", "../../utils/experienceRelationships.ts"],
|
|
4
|
+
"sourcesContent": [
|
|
5
|
+
"import type { IAgentRuntime, Plugin } from \"@elizaos/core\";\nimport { logger } from \"@elizaos/core\";\nimport { recordExperienceAction } from \"./actions/record-experience\";\nimport { experienceEvaluator } from \"./evaluators/experienceEvaluator\";\nimport { experienceProvider } from \"./providers/experienceProvider\";\nimport { ExperienceService } from \"./service\";\nimport \"./types\";\n\nexport const experiencePlugin: Plugin = {\n name: \"experience\",\n description:\n \"Self-learning experience system that records and recalls transferable agent learnings\",\n\n actions: [recordExperienceAction],\n services: [ExperienceService],\n providers: [experienceProvider],\n evaluators: [experienceEvaluator],\n\n async init(config: Record<string, string>, runtime: IAgentRuntime): Promise<void> {\n logger.info(\"[ExperiencePlugin] Initializing experience learning system\");\n\n const maxExperiences = parseOptionalNumber(config.MAX_EXPERIENCES, 10000);\n const autoRecordThreshold = parseOptionalNumber(config.AUTO_RECORD_THRESHOLD, 0.7);\n\n runtime.setSetting(\"MAX_EXPERIENCES\", maxExperiences.toString());\n runtime.setSetting(\"AUTO_RECORD_THRESHOLD\", autoRecordThreshold.toString());\n\n const experienceService = runtime.getService<ExperienceService>(\"EXPERIENCE\");\n experienceService?.setMaxExperiences(maxExperiences);\n\n logger.info(`[ExperiencePlugin] Configuration:\n - MAX_EXPERIENCES: ${maxExperiences}\n - AUTO_RECORD_THRESHOLD: ${autoRecordThreshold}`);\n },\n};\n\nexport default experiencePlugin;\n\nexport { ExperienceService } from \"./service\";\nexport * from \"./types\";\n\nfunction parseOptionalNumber(value: string | undefined, fallback: number): number {\n if (!value) return fallback;\n const parsed = Number.parseFloat(value);\n return Number.isFinite(parsed) ? parsed : fallback;\n}\n",
|
|
6
|
+
"import {\n type Action,\n type ActionExample,\n type ActionResult,\n createUniqueUuid,\n type HandlerCallback,\n type HandlerOptions,\n type IAgentRuntime,\n logger,\n type Memory,\n type State,\n} from \"@elizaos/core\";\nimport { requireActionSpec } from \"../generated/specs/spec-helpers\";\n\nconst spec = requireActionSpec(\"RECORD_EXPERIENCE\");\n\nexport const recordExperienceAction: Action = {\n name: spec.name,\n similes: spec.similes ? [...spec.similes] : [],\n description: spec.description,\n examples: (spec.examples ?? []) as ActionExample[][],\n\n async validate(_runtime: IAgentRuntime, message: Memory): Promise<boolean> {\n const text = message.content.text?.toLowerCase();\n return text?.includes(\"remember\") || text?.includes(\"record\") || false;\n },\n\n async handler(\n runtime: IAgentRuntime,\n message: Memory,\n state?: State,\n _options?: HandlerOptions,\n _callback?: HandlerCallback\n ): Promise<ActionResult> {\n void _options;\n void _callback;\n\n logger.info(\"Recording experience for message:\", message.id);\n\n // Create experience memory with context\n const experienceMemory: Memory = {\n id: createUniqueUuid(runtime, `experience-${message.id}`),\n entityId: message.entityId,\n agentId: runtime.agentId,\n roomId: message.roomId,\n content: {\n text: message.content.text,\n source: message.content.source,\n type: \"experience\",\n context: state?.text,\n },\n createdAt: Date.now(),\n };\n\n // Store in experiences table\n await runtime.createMemory(experienceMemory, \"experiences\", true);\n logger.info(\"Experience recorded successfully\");\n\n return {\n success: true,\n text: \"Experience recorded.\",\n data: {\n experienceMemoryId: experienceMemory.id,\n },\n };\n },\n};\n",
|
|
7
|
+
"/**\n * Auto-generated canonical action/provider/evaluator docs for plugin-experience.\n * DO NOT EDIT - Generated from prompts/specs/**.\n */\n\nexport type ActionDoc = {\n name: string;\n description: string;\n similes?: readonly string[];\n parameters?: readonly unknown[];\n examples?: readonly (readonly unknown[])[];\n};\n\nexport type ProviderDoc = {\n name: string;\n description: string;\n position?: number;\n dynamic?: boolean;\n};\n\nexport type EvaluatorDoc = {\n name: string;\n description: string;\n similes?: readonly string[];\n alwaysRun?: boolean;\n examples?: readonly unknown[];\n};\n\nexport const coreActionsSpec = {\n version: \"1.0.0\",\n actions: [\n {\n name: \"RECORD_EXPERIENCE\",\n description:\n \"Record a learning or experience for future reference. Use this when the user explicitly asks you to remember something or when you've learned something important.\",\n similes: [\"REMEMBER\", \"LEARN\", \"STORE_EXPERIENCE\", \"SAVE_EXPERIENCE\", \"RECORD_LEARNING\"],\n parameters: [],\n examples: [\n [\n {\n name: \"{{name1}}\",\n content: {\n text: \"Remember that installing dependencies is required for Python scripts\",\n },\n },\n {\n name: \"{{name2}}\",\n content: {\n text: \"I'll record that experience. Learning: Need to install dependencies before running Python scripts.\",\n actions: [\"RECORD_EXPERIENCE\"],\n },\n },\n ],\n [\n {\n name: \"{{name1}}\",\n content: {\n text: \"Remember that users prefer shorter responses\",\n },\n },\n {\n name: \"{{name2}}\",\n content: {\n text: \"I'll remember that preference.\",\n actions: [\"RECORD_EXPERIENCE\"],\n },\n },\n ],\n [\n {\n name: \"{{name1}}\",\n content: {\n text: \"What's 2+2?\",\n },\n },\n {\n name: \"{{name2}}\",\n content: {\n text: \"2+2 equals 4.\",\n },\n },\n ],\n [\n {\n name: \"{{name1}}\",\n content: {\n text: \"Can you help me with math?\",\n },\n },\n {\n name: \"{{name2}}\",\n content: {\n text: \"Of course! What math problem do you need help with?\",\n },\n },\n ],\n ],\n },\n ],\n} as const;\nexport const allActionsSpec = {\n version: \"1.0.0\",\n actions: [\n {\n name: \"RECORD_EXPERIENCE\",\n description:\n \"Record a learning or experience for future reference. Use this when the user explicitly asks you to remember something or when you've learned something important.\",\n similes: [\"REMEMBER\", \"LEARN\", \"STORE_EXPERIENCE\", \"SAVE_EXPERIENCE\", \"RECORD_LEARNING\"],\n parameters: [],\n examples: [\n [\n {\n name: \"{{name1}}\",\n content: {\n text: \"Remember that installing dependencies is required for Python scripts\",\n },\n },\n {\n name: \"{{name2}}\",\n content: {\n text: \"I'll record that experience. Learning: Need to install dependencies before running Python scripts.\",\n actions: [\"RECORD_EXPERIENCE\"],\n },\n },\n ],\n [\n {\n name: \"{{name1}}\",\n content: {\n text: \"Remember that users prefer shorter responses\",\n },\n },\n {\n name: \"{{name2}}\",\n content: {\n text: \"I'll remember that preference.\",\n actions: [\"RECORD_EXPERIENCE\"],\n },\n },\n ],\n [\n {\n name: \"{{name1}}\",\n content: {\n text: \"What's 2+2?\",\n },\n },\n {\n name: \"{{name2}}\",\n content: {\n text: \"2+2 equals 4.\",\n },\n },\n ],\n [\n {\n name: \"{{name1}}\",\n content: {\n text: \"Can you help me with math?\",\n },\n },\n {\n name: \"{{name2}}\",\n content: {\n text: \"Of course! What math problem do you need help with?\",\n },\n },\n ],\n ],\n },\n ],\n} as const;\nexport const coreProvidersSpec = {\n version: \"1.0.0\",\n providers: [\n {\n name: \"experienceProvider\",\n description: \"Provides relevant past experiences and learnings for the current context\",\n dynamic: true,\n },\n ],\n} as const;\nexport const allProvidersSpec = {\n version: \"1.0.0\",\n providers: [\n {\n name: \"experienceProvider\",\n description: \"Provides relevant past experiences and learnings for the current context\",\n dynamic: true,\n },\n ],\n} as const;\nexport const coreEvaluatorsSpec = {\n version: \"1.0.0\",\n evaluators: [],\n} as const;\nexport const allEvaluatorsSpec = {\n version: \"1.0.0\",\n evaluators: [],\n} as const;\n\nexport const coreActionDocs: readonly ActionDoc[] = coreActionsSpec.actions;\nexport const allActionDocs: readonly ActionDoc[] = allActionsSpec.actions;\nexport const coreProviderDocs: readonly ProviderDoc[] = coreProvidersSpec.providers;\nexport const allProviderDocs: readonly ProviderDoc[] = allProvidersSpec.providers;\nexport const coreEvaluatorDocs: readonly EvaluatorDoc[] = coreEvaluatorsSpec.evaluators;\nexport const allEvaluatorDocs: readonly EvaluatorDoc[] = allEvaluatorsSpec.evaluators;\n",
|
|
8
|
+
"/**\n * Helper functions to lookup action/provider/evaluator specs by name.\n * These allow language-specific implementations to import their text content\n * (description, similes, examples) from the centralized specs.\n *\n * DO NOT EDIT the spec data - update prompts/actions.json, prompts/providers.json, prompts/evaluators.json and regenerate.\n */\n\nimport {\n type ActionDoc,\n allActionDocs,\n allEvaluatorDocs,\n allProviderDocs,\n coreActionDocs,\n coreEvaluatorDocs,\n coreProviderDocs,\n type EvaluatorDoc,\n type ProviderDoc,\n} from \"./specs\";\n\n// Build lookup maps for O(1) access\nconst coreActionMap = new Map<string, ActionDoc>(coreActionDocs.map((doc) => [doc.name, doc]));\nconst allActionMap = new Map<string, ActionDoc>(allActionDocs.map((doc) => [doc.name, doc]));\nconst coreProviderMap = new Map<string, ProviderDoc>(\n coreProviderDocs.map((doc) => [doc.name, doc])\n);\nconst allProviderMap = new Map<string, ProviderDoc>(allProviderDocs.map((doc) => [doc.name, doc]));\nconst coreEvaluatorMap = new Map<string, EvaluatorDoc>(\n coreEvaluatorDocs.map((doc) => [doc.name, doc])\n);\nconst allEvaluatorMap = new Map<string, EvaluatorDoc>(\n allEvaluatorDocs.map((doc) => [doc.name, doc])\n);\n\n/**\n * Get an action spec by name from the core specs.\n * @param name - The action name\n * @returns The action spec or undefined if not found\n */\nexport function getActionSpec(name: string): ActionDoc | undefined {\n return coreActionMap.get(name) ?? allActionMap.get(name);\n}\n\n/**\n * Get an action spec by name, throwing if not found.\n * @param name - The action name\n * @returns The action spec\n * @throws Error if the action is not found\n */\nexport function requireActionSpec(name: string): ActionDoc {\n const spec = getActionSpec(name);\n if (!spec) {\n throw new Error(`Action spec not found: ${name}`);\n }\n return spec;\n}\n\n/**\n * Get a provider spec by name from the core specs.\n * @param name - The provider name\n * @returns The provider spec or undefined if not found\n */\nexport function getProviderSpec(name: string): ProviderDoc | undefined {\n return coreProviderMap.get(name) ?? allProviderMap.get(name);\n}\n\n/**\n * Get a provider spec by name, throwing if not found.\n * @param name - The provider name\n * @returns The provider spec\n * @throws Error if the provider is not found\n */\nexport function requireProviderSpec(name: string): ProviderDoc {\n const spec = getProviderSpec(name);\n if (!spec) {\n throw new Error(`Provider spec not found: ${name}`);\n }\n return spec;\n}\n\n/**\n * Get an evaluator spec by name from the core specs.\n * @param name - The evaluator name\n * @returns The evaluator spec or undefined if not found\n */\nexport function getEvaluatorSpec(name: string): EvaluatorDoc | undefined {\n return coreEvaluatorMap.get(name) ?? allEvaluatorMap.get(name);\n}\n\n/**\n * Get an evaluator spec by name, throwing if not found.\n * @param name - The evaluator name\n * @returns The evaluator spec\n * @throws Error if the evaluator is not found\n */\nexport function requireEvaluatorSpec(name: string): EvaluatorDoc {\n const spec = getEvaluatorSpec(name);\n if (!spec) {\n throw new Error(`Evaluator spec not found: ${name}`);\n }\n return spec;\n}\n\n// Re-export types for convenience\nexport type { ActionDoc, ProviderDoc, EvaluatorDoc };\n",
|
|
9
|
+
"import {\n type ActionResult,\n composePrompt,\n type Evaluator,\n type HandlerCallback,\n type HandlerOptions,\n type IAgentRuntime,\n logger,\n type Memory,\n ModelType,\n type State,\n} from \"@elizaos/core\";\nimport { EXTRACT_EXPERIENCES_TEMPLATE } from \"../generated/prompts/typescript/prompts.js\";\nimport type { ExperienceService } from \"../service\";\nimport { ExperienceType, OutcomeType } from \"../types\";\n\ntype ExtractedExperience = {\n type?: string;\n learning?: string;\n context?: string;\n confidence?: number;\n reasoning?: string;\n};\n\nexport const experienceEvaluator: Evaluator = {\n name: \"EXPERIENCE_EVALUATOR\",\n similes: [\"experience recorder\", \"learning evaluator\", \"self-reflection\"],\n description: \"Periodically analyzes conversation patterns to extract novel learning experiences\",\n alwaysRun: false,\n\n examples: [\n {\n prompt: \"The agent successfully executed a shell command after initially failing\",\n messages: [\n {\n name: \"Autoliza\",\n content: {\n text: \"Let me try to run this Python script.\",\n },\n },\n {\n name: \"Autoliza\",\n content: {\n text: \"Error: ModuleNotFoundError for pandas. I need to install it first.\",\n },\n },\n {\n name: \"Autoliza\",\n content: {\n text: \"After installing pandas, the script ran successfully and produced the expected output.\",\n },\n },\n ],\n outcome:\n \"Record a CORRECTION experience about needing to install dependencies before running Python scripts\",\n },\n {\n prompt: \"The agent discovered a new system capability\",\n messages: [\n {\n name: \"Autoliza\",\n content: {\n text: \"I found that the system has jq installed, which is perfect for parsing JSON data.\",\n },\n },\n ],\n outcome: \"Record a DISCOVERY experience about the availability of jq for JSON processing\",\n },\n ],\n\n async validate(runtime: IAgentRuntime, message: Memory, _state?: State): Promise<boolean> {\n // Only run every 10 messages and only on agent messages\n if (message.entityId !== runtime.agentId) {\n return false;\n }\n\n // Check cooldown - only extract experiences every 10 messages\n const lastExtractionKey = \"experience-extraction:last-message-count\";\n const currentCount = (await runtime.getCache<string>(lastExtractionKey)) || \"0\";\n const messageCount = Number.parseInt(currentCount, 10);\n const newMessageCount = messageCount + 1;\n\n await runtime.setCache(lastExtractionKey, newMessageCount.toString());\n\n // Trigger extraction every 10 messages\n const shouldExtract = newMessageCount % 10 === 0;\n\n if (shouldExtract) {\n logger.info(\n `[experienceEvaluator] Triggering experience extraction after ${newMessageCount} messages`\n );\n }\n\n return shouldExtract;\n },\n\n async handler(\n runtime: IAgentRuntime,\n message: Memory,\n state?: State,\n _options?: HandlerOptions,\n _callback?: HandlerCallback,\n _responses?: Memory[]\n ): Promise<ActionResult | undefined> {\n void _options;\n void _callback;\n void _responses;\n void state;\n\n const experienceService = runtime.getService(\"EXPERIENCE\") as ExperienceService | null;\n\n if (!experienceService) {\n logger.warn(\"[experienceEvaluator] Experience service not available\");\n return;\n }\n\n const recentMessages = await runtime.getMemories({\n tableName: \"messages\",\n roomId: message.roomId,\n count: 10,\n unique: false,\n });\n\n if (recentMessages.length < 3) {\n logger.debug(\"[experienceEvaluator] Not enough messages for experience extraction\");\n return;\n }\n\n // Combine recent messages into analysis context\n const conversationContext = recentMessages\n .map((m: Memory) => m.content.text)\n .filter(Boolean)\n .join(\" \");\n\n // Query existing experiences for similarity check\n const existingExperiences = await experienceService.queryExperiences({\n query: conversationContext,\n limit: 10,\n minConfidence: 0.7,\n });\n\n const existingExperiencesText =\n existingExperiences.length > 0\n ? existingExperiences.map((exp) => `- ${exp.learning}`).join(\"\\n\")\n : \"None\";\n\n const extractionPrompt = composePrompt({\n state: {\n conversation_context: conversationContext,\n existing_experiences: existingExperiencesText,\n },\n template: EXTRACT_EXPERIENCES_TEMPLATE,\n });\n\n const response = await runtime.useModel(ModelType.TEXT_LARGE, {\n prompt: extractionPrompt,\n });\n\n const experiences = parseExtractedExperiences(response);\n\n const threshold = getNumberSetting(runtime, \"AUTO_RECORD_THRESHOLD\", 0.6);\n\n // Record each novel experience\n const experienceTypeMap: Record<string, ExperienceType> = {\n DISCOVERY: ExperienceType.DISCOVERY,\n CORRECTION: ExperienceType.CORRECTION,\n SUCCESS: ExperienceType.SUCCESS,\n LEARNING: ExperienceType.LEARNING,\n };\n\n for (const exp of experiences.slice(0, 3)) {\n // Max 3 experiences per extraction\n if (!exp.learning || typeof exp.confidence !== \"number\" || exp.confidence < threshold) {\n continue;\n }\n\n const normalizedType = typeof exp.type === \"string\" ? exp.type.toUpperCase() : \"\";\n const experienceType = experienceTypeMap[normalizedType] ?? ExperienceType.LEARNING;\n const experienceTag = experienceType;\n\n await experienceService.recordExperience({\n type: experienceType,\n outcome:\n experienceType === ExperienceType.CORRECTION ? OutcomeType.POSITIVE : OutcomeType.NEUTRAL,\n context: sanitizeContext(exp.context || \"Conversation analysis\"),\n action: \"pattern_recognition\",\n result: exp.learning,\n learning: sanitizeContext(exp.learning),\n domain: detectDomain(exp.learning),\n tags: [\"extracted\", \"novel\", experienceTag],\n confidence: Math.min(exp.confidence, 0.9), // Cap confidence\n importance: 0.8, // High importance for extracted experiences\n });\n\n logger.info(\n `[experienceEvaluator] Recorded novel experience: ${exp.learning.substring(0, 100)}...`\n );\n }\n\n if (experiences.length > 0) {\n logger.info(\n `[experienceEvaluator] Extracted ${experiences.length} novel experiences from conversation`\n );\n } else {\n logger.debug(\"[experienceEvaluator] No novel experiences found in recent conversation\");\n }\n\n return {\n success: true,\n data: {\n extractedCount: experiences.length,\n },\n values: {\n extractedCount: experiences.length.toString(),\n },\n };\n },\n};\n\nfunction parseExtractedExperiences(response: string): ExtractedExperience[] {\n const jsonMatch = response.match(/\\[[\\s\\S]*\\]/);\n if (!jsonMatch) return [];\n\n try {\n const parsed = JSON.parse(jsonMatch[0]) as ExtractedExperience[];\n if (!Array.isArray(parsed)) return [];\n return parsed.filter((item) => item && typeof item === \"object\");\n } catch {\n return [];\n }\n}\n\nfunction getNumberSetting(runtime: IAgentRuntime, key: string, fallback: number): number {\n const value = runtime.getSetting(key);\n if (typeof value === \"number\") return value;\n if (typeof value === \"string\") {\n const parsed = Number.parseFloat(value);\n return Number.isFinite(parsed) ? parsed : fallback;\n }\n return fallback;\n}\n\nfunction sanitizeContext(text: string): string {\n if (!text) return \"Unknown context\";\n\n // Remove user-specific details while preserving technical context\n return text\n .replace(/\\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\.[A-Z|a-z]{2,}\\b/g, \"[EMAIL]\") // emails\n .replace(/\\b\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\b/g, \"[IP]\") // IP addresses\n .replace(/\\/Users\\/[^/\\s]+/g, \"/Users/[USER]\") // user directories\n .replace(/\\/home\\/[^/\\s]+/g, \"/home/[USER]\") // home directories\n .replace(/\\b[A-Z0-9]{20,}\\b/g, \"[TOKEN]\") // API keys/tokens\n .replace(/\\b(user|person|someone|they)\\s+(said|asked|told|mentioned)/gi, \"when asked\") // personal references\n .substring(0, 200); // limit length\n}\n\nfunction detectDomain(text: string): string {\n const domains: Record<string, string[]> = {\n shell: [\"command\", \"terminal\", \"bash\", \"shell\", \"execute\", \"script\", \"cli\"],\n coding: [\n \"code\",\n \"function\",\n \"variable\",\n \"syntax\",\n \"programming\",\n \"debug\",\n \"typescript\",\n \"javascript\",\n ],\n system: [\"file\", \"directory\", \"process\", \"memory\", \"cpu\", \"system\", \"install\", \"package\"],\n network: [\"http\", \"api\", \"request\", \"response\", \"url\", \"network\", \"fetch\", \"curl\"],\n data: [\"json\", \"csv\", \"database\", \"query\", \"data\", \"sql\", \"table\"],\n ai: [\"model\", \"llm\", \"embedding\", \"prompt\", \"token\", \"inference\"],\n };\n\n const lowerText = text.toLowerCase();\n\n for (const [domain, keywords] of Object.entries(domains)) {\n if (keywords.some((keyword) => lowerText.includes(keyword))) {\n return domain;\n }\n }\n\n return \"general\";\n}\n",
|
|
10
|
+
"/**\n * Auto-generated prompt templates\n * DO NOT EDIT - Generated from ../../../../prompts/*.txt\n *\n * These prompts use Handlebars-style template syntax:\n * - {{variableName}} for simple substitution\n * - {{#each items}}...{{/each}} for iteration\n * - {{#if condition}}...{{/if}} for conditionals\n */\n\nexport const extractExperiencesTemplate = `# Task: Extract Novel Learning Experiences\n\nAnalyze this conversation for novel learning experiences that would be surprising or valuable to remember.\n\n## Conversation context\n{{conversation_context}}\n\n## Existing similar experiences\n{{existing_experiences}}\n\n## Instructions\nExtract ONLY experiences that are:\n1. Genuinely novel (not in existing experiences)\n2. Actionable learnings about how things work\n3. Corrections of previous mistakes or assumptions\n4. Discoveries of new capabilities or patterns\n5. Surprising outcomes that contradict expectations\n\nFocus on technical knowledge, patterns, and cause-effect relationships that transfer to other contexts.\nAvoid personal details, user-specific information, or routine interactions.\n\nRespond with JSON array of experiences (max 3):\n[{\n \"type\": \"DISCOVERY|CORRECTION|SUCCESS|LEARNING\",\n \"learning\": \"What was learned (generic, transferable)\",\n \"context\": \"What situation triggered this (anonymized)\",\n \"confidence\": 0.0-1.0,\n \"reasoning\": \"Why this is novel and valuable\"\n}]\n\nReturn empty array [] if no novel experiences found.`;\n\nexport const EXTRACT_EXPERIENCES_TEMPLATE = extractExperiencesTemplate;\n\n",
|
|
11
|
+
"import type { Memory, ServiceTypeRegistry, UUID } from \"@elizaos/core\";\n\nexport type JsonPrimitive = string | number | boolean | null;\nexport type JsonValue = JsonPrimitive | JsonValue[] | { [key: string]: JsonValue };\nexport type JsonObject = { [key: string]: JsonValue };\n\n// Extend the core service types with experience service\ndeclare module \"@elizaos/core\" {\n interface ServiceTypeRegistry {\n EXPERIENCE: \"EXPERIENCE\";\n }\n}\n\n// Export service type constant\nexport const ExperienceServiceType = {\n EXPERIENCE: \"EXPERIENCE\" as const,\n} satisfies Partial<ServiceTypeRegistry>;\n\nexport enum ExperienceType {\n SUCCESS = \"success\", // Agent accomplished something\n FAILURE = \"failure\", // Agent failed at something\n DISCOVERY = \"discovery\", // Agent discovered new information\n CORRECTION = \"correction\", // Agent corrected a mistake\n LEARNING = \"learning\", // Agent learned something new\n HYPOTHESIS = \"hypothesis\", // Agent formed a hypothesis\n VALIDATION = \"validation\", // Agent validated a hypothesis\n WARNING = \"warning\", // Agent encountered a warning/limitation\n}\n\nexport enum OutcomeType {\n POSITIVE = \"positive\",\n NEGATIVE = \"negative\",\n NEUTRAL = \"neutral\",\n MIXED = \"mixed\",\n}\n\nexport interface Experience {\n id: UUID;\n agentId: UUID;\n type: ExperienceType;\n outcome: OutcomeType;\n\n // Context and details\n context: string; // What was happening\n action: string; // What the agent tried to do\n result: string; // What actually happened\n learning: string; // What was learned\n\n // Categorization\n tags: string[]; // Tags for categorization\n domain: string; // Domain of experience (e.g., 'shell', 'coding', 'system')\n\n // Related experiences\n relatedExperiences?: UUID[]; // Links to related experiences\n supersedes?: UUID; // If this experience updates/replaces another\n\n // Confidence and importance\n confidence: number; // 0-1, how confident the agent is in this learning\n importance: number; // 0-1, how important this experience is\n\n // Temporal information\n createdAt: number;\n updatedAt: number;\n lastAccessedAt?: number;\n accessCount: number;\n\n // For corrections\n previousBelief?: string; // What the agent previously believed\n correctedBelief?: string; // The corrected understanding\n\n // Memory integration\n embedding?: number[]; // For semantic search\n memoryIds?: UUID[]; // Related memory IDs\n}\n\nexport interface ExperienceQuery {\n query?: string; // Text query for semantic search\n type?: ExperienceType | ExperienceType[];\n outcome?: OutcomeType | OutcomeType[];\n domain?: string | string[];\n tags?: string[];\n minImportance?: number;\n minConfidence?: number;\n timeRange?: {\n start?: number;\n end?: number;\n };\n limit?: number;\n includeRelated?: boolean;\n}\n\nexport interface ExperienceAnalysis {\n pattern?: string; // Detected pattern\n frequency?: number; // How often this occurs\n reliability?: number; // How reliable this knowledge is\n alternatives?: string[]; // Alternative approaches discovered\n recommendations?: string[]; // Recommendations based on experience\n}\n\nexport interface ExperienceEvent {\n experienceId: UUID;\n eventType: \"created\" | \"accessed\" | \"updated\" | \"superseded\";\n timestamp: number;\n metadata?: JsonObject;\n}\n\nexport interface ExperienceMemory extends Memory {\n experienceId: string;\n experienceType: ExperienceType;\n}\n",
|
|
12
|
+
"import {\n type IAgentRuntime,\n logger,\n type Memory,\n type Provider,\n type ProviderResult,\n type State,\n} from \"@elizaos/core\";\nimport { requireProviderSpec } from \"../generated/specs/spec-helpers\";\nimport type { ExperienceService } from \"../service\";\n\n/**\n * Simple experience provider that injects relevant experiences into context\n * Similar to the knowledge provider but focused on agent learnings\n */\nconst spec = requireProviderSpec(\"experienceProvider\");\n\nexport const experienceProvider: Provider = {\n name: spec.name,\n description: \"Provides relevant past experiences and learnings for the current context\",\n\n async get(runtime: IAgentRuntime, message: Memory, _state?: State): Promise<ProviderResult> {\n const experienceService = runtime.getService(\"EXPERIENCE\") as ExperienceService | null;\n\n if (!experienceService) {\n return { text: \"\", data: {}, values: {} };\n }\n\n // Get message text for context\n const messageText = message.content.text || \"\";\n if (messageText.length < 10) {\n return { text: \"\", data: {}, values: {} };\n }\n\n // Find relevant experiences using semantic search\n const relevantExperiences = await experienceService.queryExperiences({\n query: messageText,\n limit: 5,\n minConfidence: 0.6,\n minImportance: 0.5,\n });\n\n if (relevantExperiences.length === 0) {\n return { text: \"\", data: {}, values: {} };\n }\n\n // Format experiences for context injection\n const experienceText = relevantExperiences\n .map((exp, index) => {\n return `Experience ${index + 1}: In ${exp.domain} context, when ${exp.context}, I learned: ${exp.learning}`;\n })\n .join(\"\\n\");\n\n const contextText = `[RELEVANT EXPERIENCES]\\n${experienceText}\\n[/RELEVANT EXPERIENCES]`;\n\n logger.debug(\n `[experienceProvider] Injecting ${relevantExperiences.length} relevant experiences`\n );\n\n return {\n text: contextText,\n data: {\n experiences: relevantExperiences,\n count: relevantExperiences.length,\n },\n values: {\n experienceCount: relevantExperiences.length.toString(),\n },\n };\n },\n};\n",
|
|
13
|
+
"import {\n type IAgentRuntime,\n logger,\n ModelType,\n Service,\n type ServiceTypeName,\n type UUID,\n} from \"@elizaos/core\";\nimport { v4 as uuidv4 } from \"uuid\";\nimport {\n type Experience,\n type ExperienceAnalysis,\n type ExperienceQuery,\n ExperienceServiceType,\n ExperienceType,\n OutcomeType,\n} from \"./types\";\nimport { ConfidenceDecayManager } from \"./utils/confidenceDecay\";\nimport { ExperienceRelationshipManager } from \"./utils/experienceRelationships\";\n\nexport class ExperienceService extends Service {\n static override serviceType: ServiceTypeName = ExperienceServiceType.EXPERIENCE;\n override capabilityDescription =\n \"Manages agent experiences, learning from successes and failures to improve future decisions\";\n\n private experiences: Map<UUID, Experience> = new Map();\n private experiencesByDomain: Map<string, Set<UUID>> = new Map();\n private experiencesByType: Map<ExperienceType, Set<UUID>> = new Map();\n private maxExperiences = 10000;\n private decayManager: ConfidenceDecayManager;\n private relationshipManager: ExperienceRelationshipManager;\n\n constructor(runtime: IAgentRuntime) {\n super(runtime);\n this.decayManager = new ConfidenceDecayManager();\n this.relationshipManager = new ExperienceRelationshipManager();\n\n const max = getNumberSetting(runtime, \"MAX_EXPERIENCES\", this.maxExperiences);\n if (Number.isFinite(max) && max > 0) {\n this.maxExperiences = Math.floor(max);\n }\n\n void this.loadExperiences();\n }\n\n static async start(runtime: IAgentRuntime): Promise<ExperienceService> {\n const service = new ExperienceService(runtime);\n // loadExperiences is triggered in constructor\n return service;\n }\n\n setMaxExperiences(maxExperiences: number): void {\n if (!Number.isFinite(maxExperiences) || maxExperiences <= 0) return;\n this.maxExperiences = Math.floor(maxExperiences);\n }\n\n private async loadExperiences(): Promise<void> {\n // Load experiences from memory service\n const allMemories = await this.runtime.getMemories({\n entityId: this.runtime.agentId,\n count: this.maxExperiences,\n tableName: \"memories\",\n });\n\n // Filter for experience type memories\n const memories = allMemories.filter((m) => m.content.type === \"experience\");\n\n for (const memory of memories) {\n const experienceData = memory.content.data as Partial<Experience> | null;\n if (experienceData?.id) {\n const memoryCreatedAt =\n typeof memory.createdAt === \"number\" ? memory.createdAt : Date.now();\n\n const toTimestamp = (value: number | Date | undefined, fallback: number): number => {\n if (value === undefined) return fallback;\n if (typeof value === \"number\") return value;\n if (value instanceof Date) return value.getTime();\n return fallback;\n };\n\n const experience: Experience = {\n id: experienceData.id as UUID,\n agentId: this.runtime.agentId,\n type: experienceData.type || ExperienceType.LEARNING,\n outcome: experienceData.outcome || OutcomeType.NEUTRAL,\n context: experienceData.context || \"\",\n action: experienceData.action || \"\",\n result: experienceData.result || \"\",\n learning: experienceData.learning || \"\",\n domain: experienceData.domain || \"general\",\n tags: experienceData.tags || [],\n confidence: experienceData.confidence || 0.5,\n importance: experienceData.importance || 0.5,\n createdAt: toTimestamp(\n experienceData.createdAt as number | Date | undefined,\n memoryCreatedAt\n ),\n updatedAt: toTimestamp(\n experienceData.updatedAt as number | Date | undefined,\n memoryCreatedAt\n ),\n accessCount: experienceData.accessCount ?? 0,\n lastAccessedAt: toTimestamp(\n experienceData.lastAccessedAt as number | Date | undefined,\n memoryCreatedAt\n ),\n embedding: experienceData.embedding,\n relatedExperiences: experienceData.relatedExperiences,\n supersedes: experienceData.supersedes,\n previousBelief: experienceData.previousBelief,\n correctedBelief: experienceData.correctedBelief,\n };\n\n this.experiences.set(experience.id, experience);\n\n // Update indexes\n if (!this.experiencesByDomain.has(experience.domain)) {\n this.experiencesByDomain.set(experience.domain, new Set());\n }\n this.experiencesByDomain.get(experience.domain)?.add(experience.id);\n\n if (!this.experiencesByType.has(experience.type)) {\n this.experiencesByType.set(experience.type, new Set());\n }\n this.experiencesByType.get(experience.type)?.add(experience.id);\n }\n }\n\n logger.info(`[ExperienceService] Loaded ${this.experiences.size} experiences from memory`);\n }\n\n async recordExperience(experienceData: Partial<Experience>): Promise<Experience> {\n // Generate embedding for the experience\n const embeddingText = `${experienceData.context} ${experienceData.action} ${experienceData.result} ${experienceData.learning}`;\n const embedding = await this.runtime.useModel(ModelType.TEXT_EMBEDDING, {\n text: embeddingText,\n });\n\n const now = Date.now();\n\n const experience: Experience = {\n id: uuidv4() as UUID,\n agentId: this.runtime.agentId,\n type: experienceData.type || ExperienceType.LEARNING,\n outcome: experienceData.outcome || OutcomeType.NEUTRAL,\n context: experienceData.context || \"\",\n action: experienceData.action || \"\",\n result: experienceData.result || \"\",\n learning: experienceData.learning || \"\",\n domain: experienceData.domain || \"general\",\n tags: experienceData.tags || [],\n confidence: experienceData.confidence || 0.5,\n importance: experienceData.importance || 0.5,\n createdAt: now,\n updatedAt: now,\n accessCount: 0,\n lastAccessedAt: now,\n embedding,\n relatedExperiences: experienceData.relatedExperiences,\n supersedes: experienceData.supersedes,\n previousBelief: experienceData.previousBelief,\n correctedBelief: experienceData.correctedBelief,\n };\n\n // Store the experience\n this.experiences.set(experience.id, experience);\n\n // Update indexes\n if (!this.experiencesByDomain.has(experience.domain)) {\n this.experiencesByDomain.set(experience.domain, new Set());\n }\n this.experiencesByDomain.get(experience.domain)?.add(experience.id);\n\n if (!this.experiencesByType.has(experience.type)) {\n this.experiencesByType.set(experience.type, new Set());\n }\n this.experiencesByType.get(experience.type)?.add(experience.id);\n\n // Save to memory service\n await this.saveExperienceToMemory(experience);\n\n // Check for contradictions and add relationships\n const allExperiences = Array.from(this.experiences.values());\n const contradictions = this.relationshipManager.findContradictions(experience, allExperiences);\n\n for (const contradiction of contradictions) {\n this.relationshipManager.addRelationship({\n fromId: experience.id,\n toId: contradiction.id,\n type: \"contradicts\",\n strength: 0.8,\n });\n }\n\n // Prune if necessary\n if (this.experiences.size > this.maxExperiences) {\n await this.pruneOldExperiences();\n }\n\n logger.info(`[ExperienceService] Recorded experience: ${experience.id} (${experience.type})`);\n\n return experience;\n }\n\n private async saveExperienceToMemory(experience: Experience): Promise<void> {\n const memory = {\n id: experience.id,\n entityId: this.runtime.agentId,\n agentId: this.runtime.agentId,\n roomId: this.runtime.agentId,\n content: {\n text: `Experience: ${experience.learning}`,\n type: \"experience\",\n data: {\n id: experience.id,\n agentId: experience.agentId,\n type: experience.type,\n outcome: experience.outcome,\n context: experience.context,\n action: experience.action,\n result: experience.result,\n learning: experience.learning,\n domain: experience.domain,\n tags: experience.tags,\n confidence: experience.confidence,\n importance: experience.importance,\n createdAt: experience.createdAt,\n updatedAt: experience.updatedAt,\n accessCount: experience.accessCount,\n lastAccessedAt: experience.lastAccessedAt,\n embedding: experience.embedding,\n relatedExperiences: experience.relatedExperiences,\n supersedes: experience.supersedes,\n previousBelief: experience.previousBelief,\n correctedBelief: experience.correctedBelief,\n },\n },\n createdAt: experience.createdAt,\n };\n\n await this.runtime.createMemory(memory, \"experiences\", true);\n }\n\n async queryExperiences(query: ExperienceQuery): Promise<Experience[]> {\n let results: Experience[] = [];\n\n // If query string provided, use semantic search\n if (query.query) {\n const similarExperiences = await this.findSimilarExperiences(query.query, query.limit || 10);\n let candidates = similarExperiences;\n\n // Apply additional filters to semantic search results\n if (query.type) {\n const types = Array.isArray(query.type) ? query.type : [query.type];\n candidates = candidates.filter((exp) => types.includes(exp.type));\n }\n\n if (query.outcome) {\n candidates = candidates.filter((exp) => exp.outcome === query.outcome);\n }\n\n if (query.domain) {\n const domains = Array.isArray(query.domain) ? query.domain : [query.domain];\n candidates = candidates.filter((exp) => domains.includes(exp.domain));\n }\n\n if (query.tags && query.tags.length > 0) {\n candidates = candidates.filter((exp) => query.tags?.some((tag) => exp.tags.includes(tag)));\n }\n\n if (query.minConfidence !== undefined) {\n const minConfidence = query.minConfidence;\n candidates = candidates.filter((exp) => {\n const decayedConfidence = this.decayManager.getDecayedConfidence(exp);\n return decayedConfidence >= minConfidence;\n });\n }\n\n if (query.minImportance !== undefined) {\n const minImportance = query.minImportance;\n candidates = candidates.filter((exp) => exp.importance >= minImportance);\n }\n\n if (query.timeRange) {\n candidates = candidates.filter((exp) => {\n if (query.timeRange?.start && exp.createdAt < query.timeRange?.start) return false;\n if (query.timeRange?.end && exp.createdAt > query.timeRange?.end) return false;\n return true;\n });\n }\n\n results = candidates;\n } else {\n // Start with all experiences for non-semantic queries\n let candidates = Array.from(this.experiences.values());\n\n if (query.type) {\n const types = Array.isArray(query.type) ? query.type : [query.type];\n candidates = candidates.filter((exp) => types.includes(exp.type));\n }\n\n if (query.outcome) {\n candidates = candidates.filter((exp) => exp.outcome === query.outcome);\n }\n\n if (query.domain) {\n const domains = Array.isArray(query.domain) ? query.domain : [query.domain];\n candidates = candidates.filter((exp) => domains.includes(exp.domain));\n }\n\n if (query.tags && query.tags.length > 0) {\n candidates = candidates.filter((exp) => query.tags?.some((tag) => exp.tags.includes(tag)));\n }\n\n if (query.minConfidence !== undefined) {\n const minConfidence = query.minConfidence;\n candidates = candidates.filter((exp) => {\n const decayedConfidence = this.decayManager.getDecayedConfidence(exp);\n return decayedConfidence >= minConfidence;\n });\n }\n\n if (query.minImportance !== undefined) {\n const minImportance = query.minImportance;\n candidates = candidates.filter((exp) => exp.importance >= minImportance);\n }\n\n if (query.timeRange) {\n candidates = candidates.filter((exp) => {\n if (query.timeRange?.start && exp.createdAt < query.timeRange?.start) return false;\n if (query.timeRange?.end && exp.createdAt > query.timeRange?.end) return false;\n return true;\n });\n }\n\n // Sort by relevance (considering decayed confidence)\n candidates.sort((a, b) => {\n const scoreA = this.decayManager.getDecayedConfidence(a) * a.importance;\n const scoreB = this.decayManager.getDecayedConfidence(b) * b.importance;\n return scoreB - scoreA;\n });\n\n results = candidates.slice(0, query.limit || 10);\n }\n\n // Include related experiences if requested\n if (query.includeRelated) {\n const relatedIds = new Set<UUID>();\n for (const exp of results) {\n if (exp.relatedExperiences) {\n exp.relatedExperiences.forEach((id) => {\n relatedIds.add(id);\n });\n }\n }\n\n const related = Array.from(relatedIds)\n .map((id) => this.experiences.get(id))\n .filter((exp): exp is Experience => exp !== undefined)\n .filter((exp) => !results.some((r) => r.id === exp.id));\n\n results.push(...related);\n }\n\n // Update access counts\n for (const exp of results) {\n exp.accessCount++;\n exp.lastAccessedAt = Date.now();\n }\n\n return results;\n }\n\n async findSimilarExperiences(text: string, limit = 5): Promise<Experience[]> {\n if (!text || this.experiences.size === 0) {\n return [];\n }\n\n const queryEmbedding = await this.runtime.useModel(ModelType.TEXT_EMBEDDING, {\n text,\n });\n\n const similarities: Array<{ experience: Experience; similarity: number }> = [];\n\n for (const experience of this.experiences.values()) {\n if (experience.embedding) {\n const similarity = this.cosineSimilarity(queryEmbedding, experience.embedding);\n similarities.push({ experience, similarity });\n }\n }\n\n similarities.sort((a, b) => b.similarity - a.similarity);\n const results = similarities.slice(0, limit).map((item) => item.experience);\n\n for (const exp of results) {\n exp.accessCount++;\n exp.lastAccessedAt = Date.now();\n }\n\n return results;\n }\n\n async analyzeExperiences(domain?: string, type?: ExperienceType): Promise<ExperienceAnalysis> {\n const experiences = await this.queryExperiences({\n domain: domain ? [domain] : undefined,\n type: type ? [type] : undefined,\n limit: 100,\n });\n\n if (experiences.length === 0) {\n return {\n pattern: \"No experiences found for analysis\",\n frequency: 0,\n reliability: 0,\n alternatives: [],\n recommendations: [],\n };\n }\n\n const learnings = experiences.map((exp) => exp.learning);\n const commonWords = this.findCommonPatterns(learnings);\n\n const avgConfidence =\n experiences.reduce((sum, exp) => sum + exp.confidence, 0) / experiences.length;\n const outcomeConsistency = this.calculateOutcomeConsistency(experiences);\n const reliability = (avgConfidence + outcomeConsistency) / 2;\n\n const alternatives = this.extractAlternatives(experiences);\n const recommendations = this.generateRecommendations(experiences, reliability);\n\n return {\n pattern:\n commonWords.length > 0\n ? `Common patterns: ${commonWords.join(\", \")}`\n : \"No clear patterns detected\",\n frequency: experiences.length,\n reliability,\n alternatives,\n recommendations,\n };\n }\n\n private cosineSimilarity(a: number[], b: number[]): number {\n if (a.length !== b.length) return 0;\n\n let dotProduct = 0;\n let normA = 0;\n let normB = 0;\n\n for (let i = 0; i < a.length; i++) {\n const valueA = a[i] ?? 0;\n const valueB = b[i] ?? 0;\n dotProduct += valueA * valueB;\n normA += valueA * valueA;\n normB += valueB * valueB;\n }\n\n if (normA === 0 || normB === 0) return 0;\n return dotProduct / (Math.sqrt(normA) * Math.sqrt(normB));\n }\n\n private findCommonPatterns(texts: string[]): string[] {\n const wordFreq = new Map<string, number>();\n\n for (const text of texts) {\n const words = text.toLowerCase().split(/\\s+/);\n for (const word of words) {\n if (word.length > 3) {\n wordFreq.set(word, (wordFreq.get(word) || 0) + 1);\n }\n }\n }\n\n const threshold = texts.length * 0.3;\n return Array.from(wordFreq.entries())\n .filter(([_, count]) => count >= threshold)\n .sort((a, b) => b[1] - a[1])\n .slice(0, 5)\n .map(([word]) => word);\n }\n\n private calculateOutcomeConsistency(experiences: Experience[]): number {\n if (experiences.length === 0) return 0;\n\n const outcomeCounts = new Map<OutcomeType, number>();\n for (const exp of experiences) {\n outcomeCounts.set(exp.outcome, (outcomeCounts.get(exp.outcome) || 0) + 1);\n }\n\n const maxCount = Math.max(...outcomeCounts.values());\n return maxCount / experiences.length;\n }\n\n private extractAlternatives(experiences: Experience[]): string[] {\n const alternatives = new Set<string>();\n\n for (const exp of experiences) {\n if (exp.type === ExperienceType.CORRECTION && exp.correctedBelief) {\n alternatives.add(exp.correctedBelief);\n }\n if (exp.outcome === OutcomeType.NEGATIVE && exp.learning.includes(\"instead\")) {\n const match = exp.learning.match(/instead\\s+(.+?)(?:\\.|$)/i);\n const alternative = match?.[1]?.trim();\n if (alternative) {\n alternatives.add(alternative);\n }\n }\n }\n\n return Array.from(alternatives).slice(0, 5);\n }\n\n private generateRecommendations(experiences: Experience[], reliability: number): string[] {\n const recommendations: string[] = [];\n\n if (reliability > 0.8) {\n recommendations.push(\"Continue using successful approaches\");\n recommendations.push(\"Document and share these reliable methods\");\n } else if (reliability > 0.6) {\n recommendations.push(\"Continue using successful approaches with caution\");\n recommendations.push(\"Monitor for potential issues\");\n recommendations.push(\"Consider backup strategies\");\n } else if (reliability > 0.4) {\n recommendations.push(\"Review and improve current approaches\");\n recommendations.push(\"Investigate failure patterns\");\n recommendations.push(\"Consider alternative methods\");\n } else {\n recommendations.push(\"Significant changes needed to current approach\");\n recommendations.push(\"Analyze failure causes thoroughly\");\n recommendations.push(\"Seek alternative solutions\");\n }\n\n const failureTypes = new Map<string, number>();\n experiences\n .filter((e) => e.outcome === OutcomeType.NEGATIVE)\n .forEach((e) => {\n const key = e.learning.toLowerCase();\n failureTypes.set(key, (failureTypes.get(key) || 0) + 1);\n });\n\n if (failureTypes.size > 0) {\n const mostCommonFailure = Array.from(failureTypes.entries()).sort((a, b) => b[1] - a[1])[0];\n\n if (mostCommonFailure && mostCommonFailure[1] > 1) {\n recommendations.push(`Address recurring issue: ${mostCommonFailure[0]}`);\n }\n }\n\n const domains = new Set(experiences.map((e) => e.domain));\n if (domains.has(\"shell\")) {\n recommendations.push(\"Verify command syntax and permissions\");\n }\n if (domains.has(\"coding\")) {\n recommendations.push(\"Test thoroughly before deployment\");\n }\n if (domains.has(\"network\")) {\n recommendations.push(\"Implement retry logic and error handling\");\n }\n\n return recommendations.slice(0, 5);\n }\n\n private async pruneOldExperiences(): Promise<void> {\n if (this.experiences.size <= this.maxExperiences) {\n return;\n }\n\n const experienceArray = Array.from(this.experiences.values());\n experienceArray.sort((a, b) => {\n if (a.importance !== b.importance) {\n return a.importance - b.importance;\n }\n if (a.accessCount !== b.accessCount) {\n return a.accessCount - b.accessCount;\n }\n return a.createdAt - b.createdAt;\n });\n\n const toRemove = experienceArray.slice(0, experienceArray.length - this.maxExperiences);\n let removedCount = 0;\n\n for (const experience of toRemove) {\n this.experiences.delete(experience.id);\n\n const domainSet = this.experiencesByDomain.get(experience.domain);\n if (domainSet) {\n domainSet.delete(experience.id);\n if (domainSet.size === 0) {\n this.experiencesByDomain.delete(experience.domain);\n }\n }\n\n const typeSet = this.experiencesByType.get(experience.type);\n if (typeSet) {\n typeSet.delete(experience.id);\n if (typeSet.size === 0) {\n this.experiencesByType.delete(experience.type);\n }\n }\n\n removedCount++;\n }\n\n logger.info(`[ExperienceService] Pruned ${removedCount} old experiences`);\n }\n\n async stop(): Promise<void> {\n logger.info(\"[ExperienceService] Stopping...\");\n\n const experiencesToSave = Array.from(this.experiences.values());\n let savedCount = 0;\n\n for (const experience of experiencesToSave) {\n await this.saveExperienceToMemory(experience);\n savedCount++;\n }\n\n logger.info(`[ExperienceService] Saved ${savedCount} experiences`);\n }\n}\n\nfunction getNumberSetting(runtime: IAgentRuntime, key: string, fallback: number): number {\n const value = runtime.getSetting(key);\n if (typeof value === \"number\") return value;\n if (typeof value === \"string\") {\n const parsed = Number.parseFloat(value);\n return Number.isFinite(parsed) ? parsed : fallback;\n }\n return fallback;\n}\n",
|
|
14
|
+
"import type { Experience } from \"../types\";\nimport { ExperienceType } from \"../types\";\n\nexport interface DecayConfig {\n halfLife: number; // Time in milliseconds for confidence to decay by half\n minConfidence: number; // Minimum confidence level (never decays below this)\n decayStartDelay: number; // Time before decay starts (grace period)\n}\n\nconst DEFAULT_DECAY_CONFIG: DecayConfig = {\n halfLife: 30 * 24 * 60 * 60 * 1000, // 30 days\n minConfidence: 0.1, // 10% minimum\n decayStartDelay: 7 * 24 * 60 * 60 * 1000, // 7 days grace period\n};\n\nexport class ConfidenceDecayManager {\n private config: DecayConfig;\n\n constructor(config: Partial<DecayConfig> = {}) {\n this.config = { ...DEFAULT_DECAY_CONFIG, ...config };\n }\n\n /**\n * Calculate the decayed confidence for an experience\n */\n getDecayedConfidence(experience: Experience): number {\n const now = Date.now();\n const age = now - experience.createdAt;\n const specificConfig = this.getDomainSpecificDecay(experience);\n\n // No decay during grace period\n if (age < specificConfig.decayStartDelay) {\n return experience.confidence;\n }\n\n // Calculate decay based on half-life\n const decayTime = age - specificConfig.decayStartDelay;\n const halfLives = decayTime / specificConfig.halfLife;\n const decayFactor = 0.5 ** halfLives;\n\n // Apply decay but respect minimum\n const decayedConfidence = experience.confidence * decayFactor;\n return Math.max(specificConfig.minConfidence, decayedConfidence);\n }\n\n /**\n * Get experiences that need reinforcement (low confidence due to decay)\n */\n getExperiencesNeedingReinforcement(experiences: Experience[], threshold = 0.3): Experience[] {\n return experiences.filter((exp) => {\n const decayed = this.getDecayedConfidence(exp);\n return decayed < threshold && decayed > this.config.minConfidence;\n });\n }\n\n /**\n * Calculate reinforcement boost when an experience is validated\n */\n calculateReinforcementBoost(experience: Experience, validationStrength = 1.0): number {\n const currentConfidence = this.getDecayedConfidence(experience);\n const boost = (1 - currentConfidence) * validationStrength * 0.5;\n return Math.min(1, currentConfidence + boost);\n }\n\n /**\n * Adjust decay rate based on experience type and domain\n */\n getDomainSpecificDecay(experience: Experience): DecayConfig {\n const config = { ...this.config };\n\n // Facts and discoveries decay slower\n if (\n experience.type === ExperienceType.DISCOVERY ||\n experience.type === ExperienceType.LEARNING\n ) {\n config.halfLife *= 2; // Double the half-life\n }\n\n // Warnings and corrections decay slower (important to remember)\n if (\n experience.type === ExperienceType.WARNING ||\n experience.type === ExperienceType.CORRECTION\n ) {\n config.halfLife *= 1.5;\n config.minConfidence = 0.2; // Higher minimum\n }\n\n // Domain-specific adjustments\n switch (experience.domain) {\n case \"security\":\n case \"safety\":\n config.halfLife *= 3; // Security lessons decay very slowly\n config.minConfidence = 0.3;\n break;\n case \"performance\":\n config.halfLife *= 0.5; // Performance insights may change quickly\n break;\n case \"user_preference\":\n config.halfLife *= 0.7; // User preferences can change\n break;\n }\n\n return config;\n }\n\n /**\n * Get confidence trend for an experience over time\n */\n getConfidenceTrend(\n experience: Experience,\n points = 10\n ): Array<{ timestamp: number; confidence: number }> {\n const trend: Array<{ timestamp: number; confidence: number }> = [];\n const now = Date.now();\n const totalTime = now - experience.createdAt;\n const interval = totalTime / (points - 1);\n const specificConfig = this.getDomainSpecificDecay(experience);\n\n for (let i = 0; i < points; i++) {\n const timestamp = experience.createdAt + interval * i;\n const age = timestamp - experience.createdAt;\n\n let confidence: number;\n if (age < specificConfig.decayStartDelay) {\n confidence = experience.confidence;\n } else {\n const decayTime = age - specificConfig.decayStartDelay;\n const halfLives = decayTime / specificConfig.halfLife;\n const decayFactor = 0.5 ** halfLives;\n confidence = Math.max(specificConfig.minConfidence, experience.confidence * decayFactor);\n }\n\n trend.push({ timestamp, confidence });\n }\n\n return trend;\n }\n}\n",
|
|
15
|
+
"import type { UUID } from \"@elizaos/core\";\nimport type { Experience, JsonObject } from \"../types\";\nimport { ExperienceType, OutcomeType } from \"../types\";\n\nexport interface ExperienceChain {\n rootExperience: string; // UUID of the root experience\n chain: string[]; // Ordered list of experience IDs\n strength: number; // How strong the causal relationship is\n validated: boolean; // Whether the chain has been validated\n}\n\nexport interface ExperienceRelationship {\n fromId: string;\n toId: string;\n type: \"causes\" | \"contradicts\" | \"supports\" | \"supersedes\" | \"related\";\n strength: number; // 0-1\n metadata?: JsonObject;\n}\n\nexport class ExperienceRelationshipManager {\n private relationships: Map<string, ExperienceRelationship[]> = new Map();\n\n addRelationship(relationship: ExperienceRelationship): void {\n const { fromId } = relationship;\n if (!this.relationships.has(fromId)) {\n this.relationships.set(fromId, []);\n }\n this.relationships.get(fromId)?.push(relationship);\n }\n\n findRelationships(experienceId: string, type?: string): ExperienceRelationship[] {\n const rels = this.relationships.get(experienceId) || [];\n if (type) {\n return rels.filter((r) => r.type === type);\n }\n return rels;\n }\n\n detectCausalChain(experiences: Experience[]): ExperienceChain[] {\n const chains: ExperienceChain[] = [];\n\n // Sort experiences by timestamp\n const sorted = [...experiences].sort((a, b) => a.createdAt - b.createdAt);\n\n // Look for sequences where validation follows hypothesis\n for (let i = 0; i < sorted.length - 1; i++) {\n const current = sorted[i];\n if (!current) {\n continue;\n }\n\n if (current.type === ExperienceType.HYPOTHESIS) {\n const chain: string[] = [current.id];\n let j = i + 1;\n\n // Look for related experiences\n while (j < sorted.length) {\n const next = sorted[j];\n if (!next) {\n j++;\n continue;\n }\n\n // Check if next experience validates or contradicts the hypothesis\n if (next.relatedExperiences?.includes(current.id) || this.isRelated(current, next)) {\n chain.push(next.id);\n\n // If we found a validation, create a chain\n if (next.type === ExperienceType.VALIDATION) {\n chains.push({\n rootExperience: current.id,\n chain,\n strength: next.confidence,\n validated: next.outcome === OutcomeType.POSITIVE,\n });\n break;\n }\n }\n j++;\n }\n }\n }\n\n return chains;\n }\n\n private isRelated(exp1: Experience, exp2: Experience): boolean {\n // Check domain match\n if (exp1.domain === exp2.domain) {\n // Check temporal proximity (within 5 minutes)\n const timeDiff = Math.abs(exp2.createdAt - exp1.createdAt);\n if (timeDiff < 5 * 60 * 1000) {\n // Check content similarity\n if (this.contentSimilarity(exp1, exp2) > 0.7) {\n return true;\n }\n }\n }\n return false;\n }\n\n private contentSimilarity(exp1: Experience, exp2: Experience): number {\n // Simple keyword overlap for now\n const words1 = new Set(exp1.learning.toLowerCase().split(/\\s+/));\n const words2 = new Set(exp2.learning.toLowerCase().split(/\\s+/));\n\n const intersection = new Set([...words1].filter((x) => words2.has(x)));\n const union = new Set([...words1, ...words2]);\n\n return intersection.size / union.size;\n }\n\n findContradictions(experience: Experience, allExperiences: Experience[]): Experience[] {\n const contradictions: Experience[] = [];\n\n for (const other of allExperiences) {\n if (other.id === experience.id) continue;\n\n // Same action, different outcome\n if (\n other.action === experience.action &&\n other.outcome !== experience.outcome &&\n other.domain === experience.domain\n ) {\n contradictions.push(other);\n }\n\n // Explicit contradiction relationship\n const rels = this.findRelationships(experience.id, \"contradicts\");\n if (rels.some((r) => r.toId === other.id)) {\n contradictions.push(other);\n }\n }\n\n return contradictions;\n }\n\n getExperienceImpact(experienceId: string, allExperiences: Experience[]): number {\n let impact = 0;\n\n for (const exp of allExperiences) {\n if (exp.relatedExperiences?.includes(experienceId as UUID)) {\n impact += exp.importance;\n }\n }\n\n // Add impact from relationships\n const relationships = this.findRelationships(experienceId);\n for (const rel of relationships) {\n if (rel.type === \"causes\") {\n impact += rel.strength;\n }\n }\n\n return impact;\n }\n}\n"
|
|
16
|
+
],
|
|
17
|
+
"mappings": "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",
|
|
18
|
+
"debugId": "332CCD4C6A890DF464756E2164756E21",
|
|
19
|
+
"names": []
|
|
20
|
+
}
|