Token导航 LogoToken导航TokenDH.com
研究检索只读github未标认证来源可访问clear审计异常

conversation-memory对话记忆

Agent Skill

conversation-memory 用于查找、检索和筛选相关信息,适合在 Codex、Claude、Cursor、Gemini CLI 中需要根据关键词、任务场景或来源线索快速定位候选结果时使用。可结合来源仓库、安装命令和原始 README 继续核验具体用法。安装前建议确认权限范围、维护状态,以及是否会触发联网、命令执行或文件读写。

总安装

24,407

周安装

997

GitHub Stars

35,665

下载量

7,816
CodexClaudeCursorGemini CLI

安装说明

本站只整理中文说明和来源信息,不托管安装包,也不代用户安装。

GitHub

来源数

3

许可证

MIT

最后核验

2026-05-01

来源状态

来源可访问

安装方式

通过对话安装

复制提示词发给支持本地命令或 Skills 的 AI 助手,先确认命令和权限,再让它执行。

请帮我安装这个 Agent Skill:conversation-memory(对话记忆)
来源仓库:https://github.com/sickn33/antigravity-awesome-skills
仓库路径:skills/conversation-memory
安装命令:
npx skills add https://github.com/sickn33/antigravity-awesome-skills --skill conversation-memory
安装前请先检查当前环境是否支持对应 CLI,并向我确认将要执行的命令、安装目录、联网范围和文件读写权限;确认后再执行。

命令行安装

复制命令到本机终端执行。不同来源提供的安装方式可能略有差异;本站展示可直接复制的安装命令,安装前请核对来源页面。

skills.shnpx skills
npx skills add https://github.com/sickn33/antigravity-awesome-skills --skill conversation-memory

简介

用于法学硕士对话的持久内存系统,具有分层存储和智能检索功能。

  • 实现三种记忆类型:短期(即时上下文)、长期(历史事实)和基于实体(有关特定实体的事实)
  • 提供记忆检索和整合功能,以显示相关记忆,而不会压垮上下文窗口
  • 解决关键问题,包括无限制的内存增长、检索相关性和严格的用户隔离以防止跨用户数据泄漏
  • 与上下文管理、RAG 和提示缓存技能一起工作,以实现内聚的对话状态处理

SKILL.md

Conversation Memory

Persistent memory systems for LLM conversations including short-term, long-term, and entity-based memory

Capabilities

  • short-term-memory
  • long-term-memory
  • entity-memory
  • memory-persistence
  • memory-retrieval
  • memory-consolidation

Prerequisites

  • Knowledge: LLM conversation patterns, Database basics, Key-value stores
  • Skills_recommended: context-window-management, rag-implementation

Scope

  • Does_not_cover: Knowledge graph construction, Semantic search implementation, Database administration
  • Boundaries: Focus is memory patterns for LLMs, Covers storage and retrieval strategies

Ecosystem

Primary_tools

  • Mem0 - Memory layer for AI applications
  • LangChain Memory - Memory utilities in LangChain
  • Redis - In-memory data store for session memory

Patterns

Tiered Memory System

Different memory tiers for different purposes

When to use: Building any conversational AI

interface MemorySystem {// Buffer: Current conversation (in context) buffer: ConversationBuffer;

// Short-term: Recent interactions (session)
shortTerm: ShortTermMemory;

// Long-term: Persistent across sessions
longTerm: LongTermMemory;

// Entity: Facts about people, places, things
entity: EntityMemory;

}

class TieredMemory implements MemorySystem {async addMessage(message: Message): Promise {// Always add to buffer this.buffer.add(message);

    // Extract entities
    const entities = await extractEntities(message);
    for (const entity of entities) {
        await this.entity.upsert(entity);
    }

    // Check for memorable content
    if (await isMemoryWorthy(message)) {
        await this.shortTerm.add({
            content: message.content,
            timestamp: Date.now(),
            importance: await scoreImportance(message)
        });
    }
}

async consolidate(): Promise<void> {
    // Move important short-term to long-term
    const memories = await this.shortTerm.getOld(24 * 60 * 60 * 1000);
    for (const memory of memories) {
        if (memory.importance > 0.7 || memory.referenced > 2) {
            await this.longTerm.add(memory);
        }
        await this.shortTerm.remove(memory.id);
    }
}

async buildContext(query: string): Promise<string> {
    const parts: string[] = [];

    // Relevant long-term memories
    const longTermRelevant = await this.longTerm.search(query, 3);
    if (longTermRelevant.length) {
        parts.push('## Relevant Memories\n' +
            longTermRelevant.map(m => `- ${m.content}`).join('\n'));
    }

    // Relevant entities
    const entities = await this.entity.getRelevant(query);
    if (entities.length) {
        parts.push('## Known Entities\n' +
            entities.map(e => `- ${e.name}: ${e.facts.join(', ')}`).join('\n'));
    }

    // Recent conversation
    const recent = this.buffer.getRecent(10);
    parts.push('## Recent Conversation\n' + formatMessages(recent));

    return parts.join('\n\n');
}

}

Entity Memory

Store and update facts about entities

When to use: Need to remember details about people, places, things

interface Entity {id: string; name: string; type: 'person' | 'place' | 'thing' | 'concept'; facts: Fact[]; lastMentioned: number; mentionCount: number;}

interface Fact {content: string; confidence: number; source: string; // Which message this came from timestamp: number;}

class EntityMemory {async extractAndStore(message: Message): Promise {// Use LLM to extract entities and facts const extraction = await llm.complete(` Extract entities and facts from this message. Return JSON: {"entities": [{"name": "...", "type": "...", "facts": ["..."]}]}

        Message: "${message.content}"
    `);

    const { entities } = JSON.parse(extraction);
    for (const entity of entities) {
        await this.upsert(entity, message.id);
    }
}

async upsert(entity: ExtractedEntity, sourceId: string): Promise<void> {
    const existing = await this.store.get(entity.name.toLowerCase());

    if (existing) {
        // Merge facts, avoiding duplicates
        for (const fact of entity.facts) {
            if (!this.hasSimilarFact(existing.facts, fact)) {
                existing.facts.push({
                    content: fact,
                    confidence: 0.9,
                    source: sourceId,
                    timestamp: Date.now()
                });
            }
        }
        existing.lastMentioned = Date.now();
        existing.mentionCount++;
        await this.store.set(existing.id, existing);
    } else {
        // Create new entity
        await this.store.set(entity.name.toLowerCase(), {
            id: generateId(),
            name: entity.name,
            type: entity.type,
            facts: entity.facts.map(f => ({
                content: f,
                confidence: 0.9,
                source: sourceId,
                timestamp: Date.now()
            })),
            lastMentioned: Date.now(),
            mentionCount: 1
        });
    }
}

}

Memory-Aware Prompting

Include relevant memories in prompts

When to use: Making LLM calls with memory context

async function promptWithMemory(query: string, memory: MemorySystem, systemPrompt: string): Promise {// Retrieve relevant memories const relevantMemories = await memory.longTerm.search(query, 5); const entities = await memory.entity.getRelevant(query); const recentContext = memory.buffer.getRecent(5);

// Build memory-augmented prompt
const prompt = `

${systemPrompt}

User Context

${entities.length? Known about user:\n${entities.map(e =>- ${e.name}: ${e.facts.map(f => f.content).join('; ')}).join('\n')}: ''}

${relevantMemories.length? Relevant past interactions:\n${relevantMemories.map(m =>- [${formatDate(m.timestamp)}] ${m.content}).join('\n')}: ''}

Recent Conversation

${formatMessages(recentContext)}

Current Query

${query} `.trim();

const response = await llm.complete(prompt);

// Extract any new memories from response
await memory.addMessage({ role: 'assistant', content: response });

return response;

}

Sharp Edges

Memory store grows unbounded, system slows

Severity: HIGH

Situation: System slows over time, costs increase

Symptoms:

  • Slow memory retrieval
  • High storage costs
  • Increasing latency over time

Why this breaks: Every message stored as memory. No cleanup or consolidation. Retrieval over millions of items.

Recommended fix:

// Implement memory lifecycle management

class ManagedMemory {// Limits private readonly SHORT_TERM_MAX = 100; private readonly LONG_TERM_MAX = 10000; private readonly CONSOLIDATION_INTERVAL = 24 * 60 * 60 * 1000;

async add(memory: Memory): Promise<void> {
    // Score importance before storing
    const score = await this.scoreImportance(memory);
    if (score < 0.3) return;  // Don't store low-importance

    memory.importance = score;
    await this.shortTerm.add(memory);

    // Check limits
    await this.enforceShortTermLimit();
}

async enforceShortTermLimit(): Promise<void> {
    const count = await this.shortTerm.count();
    if (count > this.SHORT_TERM_MAX) {
        // Consolidate: move important to long-term, delete rest
        const memories = await this.shortTerm.getAll();
        memories.sort((a, b) => b.importance - a.importance);

        const toKeep = memories.slice(0, this.SHORT_TERM_MAX * 0.7);
        const toConsolidate = memories.slice(this.SHORT_TERM_MAX * 0.7);

        for (const m of toConsolidate) {
            if (m.importance > 0.7) {
                await this.longTerm.add(m);
            }
            await this.shortTerm.remove(m.id);
        }
    }
}

async scoreImportance(memory: Memory): Promise<number> {
    const factors = {
        hasUserPreference: /prefer|like|don't like|hate|love/i.test(memory.content) ? 0.3 : 0,
        hasDecision: /decided|chose|will do|won't do/i.test(memory.content) ? 0.3 : 0,
        hasFactAboutUser: /my|I am|I have|I work/i.test(memory.content) ? 0.2 : 0,
        length: memory.content.length > 100 ? 0.1 : 0,
        userMessage: memory.role === 'user' ? 0.1 : 0,
    };

    return Object.values(factors).reduce((a, b) => a + b, 0);
}

}

Retrieved memories not relevant to current query

Severity: HIGH

Situation: Memories included in context but don't help

Symptoms:

  • Memories in context seem random
  • User asks about things already in memory
  • Confusion from irrelevant context

Why this breaks: Simple keyword matching. No relevance scoring. Including all retrieved memories.

Recommended fix:

// Intelligent memory retrieval

async function retrieveRelevant(query: string, memories: MemoryStore, maxResults: number = 5): Promise<Memory[]> {// 1. Semantic search const candidates = await memories.semanticSearch(query, maxResults * 3);

// 2. Score relevance with context
const scored = await Promise.all(candidates.map(async (m) => {
    const relevanceScore = await llm.complete(`
        Rate 0-1 how relevant this memory is to the query.
        Query: "${query}"
        Memory: "${m.content}"
        Return just the number.
    `);
    return { ...m, relevance: parseFloat(relevanceScore) };
}));

// 3. Filter low relevance
const relevant = scored.filter(m => m.relevance > 0.5);

// 4. Sort and limit
return relevant
    .sort((a, b) => b.relevance - a.relevance)
    .slice(0, maxResults);

}

Memories from one user accessible to another

Severity: CRITICAL

Situation: User sees information from another user's sessions

Symptoms:

  • User sees other user's information
  • Privacy complaints
  • Compliance violations

Why this breaks: No user isolation in memory store. Shared memory namespace. Cross-user retrieval.

Recommended fix:

// Strict user isolation in memory

class IsolatedMemory {private getKey(userId: string, memoryId: string): string {// Namespace all keys by user return user:${userId}:memory:${memoryId};}

async add(userId: string, memory: Memory): Promise<void> {
    // Validate userId is authenticated
    if (!isValidUserId(userId)) {
        throw new Error('Invalid user ID');
    }

    const key = this.getKey(userId, memory.id);
    memory.userId = userId;  // Tag with user
    await this.store.set(key, memory);
}

async search(userId: string, query: string): Promise<Memory[]> {
    // CRITICAL: Filter by user in query
    return await this.store.search({
        query,
        filter: { userId: userId },  // Mandatory filter
        limit: 10
    });
}

async delete(userId: string, memoryId: string): Promise<void> {
    const memory = await this.get(userId, memoryId);
    // Verify ownership before delete
    if (memory.userId !== userId) {
        throw new Error('Access denied');
    }
    await this.store.delete(this.getKey(userId, memoryId));
}

// User data export (GDPR compliance)
async exportUserData(userId: string): Promise<Memory[]> {
    return await this.store.getAll({ userId });
}

// User data deletion (GDPR compliance)
async deleteUserData(userId: string): Promise<void> {
    const memories = await this.exportUserData(userId);
    for (const m of memories) {
        await this.store.delete(this.getKey(userId, m.id));
    }
}

}

Validation Checks

No User Isolation in Memory

Severity: CRITICAL

Message: Memory operations without user isolation. Privacy vulnerability.

Fix action: Add userId to all memory operations, filter by user on retrieval

No Importance Filtering

Severity: WARNING

Message: Storing memories without importance filtering. May cause memory explosion.

Fix action: Score importance before storing, filter low-importance content

Memory Storage Without Retrieval

Severity: WARNING

Message: Storing memories but no retrieval logic. Memories won't be used.

Fix action: Implement memory retrieval and include in prompts

No Memory Cleanup

Severity: INFO

Message: No memory cleanup mechanism. Storage will grow unbounded.

Fix action: Implement consolidation and cleanup based on age/importance

Collaboration

Delegation Triggers

  • context window|token -> context-window-management (Need context optimization)
  • rag|retrieval|vector -> rag-implementation (Need retrieval system)
  • cache|caching -> prompt-caching (Need caching strategies)

Complete Memory System

Skills: conversation-memory, context-window-management, rag-implementation

Workflow:

1. Design memory tiers
2. Implement storage and retrieval
3. Integrate with context management
4. Add consolidation and cleanup

Related Skills

Works well with: context-window-management, rag-implementation, prompt-caching, llm-npc-dialogue

When to Use

  • User mentions or implies: conversation memory
  • User mentions or implies: remember
  • User mentions or implies: memory persistence
  • User mentions or implies: long-term memory
  • User mentions or implies: chat history

Limitations

  • Use this skill only when the task clearly matches the scope described above.
  • Do not treat the output as a substitute for environment-specific validation, testing, or expert review.
  • Stop and ask for clarification if required inputs, permissions, safety boundaries, or success criteria are missing.

适合场景

01

用户想查找某类 Agent Skill 时

02

需要根据任务场景推荐可安装能力包时

03

需要对比不同来源的安装命令和来源信息时

04

需要参考平台分布和安装热度时

能力概览

能力 1

按任务关键词查找相关 Skills

能力 2

展示可复制的安装命令

能力 3

保留来源站点、仓库和原始说明,方便继续核验

能力 4

补充不同宿主或平台的使用分布数据

能力 5

展示第三方安全扫描或审计结果

安装后应在对应宿主中按原始 README 的触发条件使用;具体调用方式请以来源页面和 README 为准。

平台分布

Claude Code

30.8%
按下载量换算2,407

OpenCode

22.05%
按下载量换算1,723

Gemini CLI

19.83%
按下载量换算1,550

Antigravity

11.36%
按下载量换算888

Cursor

7.94%
按下载量换算621

Codex

3.19%
按下载量换算249

安全审计

Gen Agent Trust Hub

通过

Socket

通过

Snyk

未通过

权限和风险

只读

该 Skill 主要提供规则、说明或参考内容,本身偏只读;真正读写文件、联网或执行命令仍取决于宿主 Agent 的任务。

安装前确认

本站仅展示第三方公开信息,不托管安装包,不提供自动安装或运行环境。安装前应自行审查源码、依赖和命令行为。来源安全扫描存在 warning/failed 结果,不能写成本站确认安全。

来源信息

继续浏览同类 Skills