Token导航 LogoToken导航

Agent Skill · 研究检索

personize-memory(记忆拟人化)

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

personize-memory 是研究检索类 Agent Skill,可用宿主为 Codex、Claude、Cursor、Gemini CLI,通过GitHub 仓库获取,权限为调用外部服务;许可证信息还不明确,第三方扫描有提醒项,按安装量在研究检索类的 73,675 个 Skill 里排第 55,255。

总安装 489周安装 21GitHub Stars 公开资料未说明下载 171核验 2026-05-01

安装说明

本站只整理中文说明,不托管安装包,也不代用户安装。
GitHub
许可证
unknown

安装方式

通过对话安装

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

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

命令行安装

复制命令到本机终端执行。该命令会通过 npx skills 从第三方来源获取 Skill;本站只展示命令,不托管安装包,也不自动执行。

skills.shnpx skills
npx skills add https://github.com/personizeai/personize-skills --skill personize-memory

这个 Skill 是做什么的

研究检索类 Skill 主要解决「找资料、核对事实、把来源整理清楚」的问题,通常会让助手先检索再总结。

用于查找、检索和筛选相关信息以支持决策。personize-memory 属于研究检索类 Skill,可作为该场景下的辅助能力补充。适合根据关键词或任务场景快速定位候选结果。通过 GitHub 安装,兼容 Codex、Claude、Cursor 等宿主环境。使用前建议确认权限范围和数据来源可靠性。

注意避免触发联网或文件操作,确保安全边界可控。

来源仓库内路径:skills/personize-memory

上手步骤

4 步
  1. 1

    确认自己的宿主工具

    公开资料标注支持 Codex、Claude、Cursor、Gemini CLI;先确认自己用的是其中之一,再按对应工具的 Skills 目录放置。

  2. 2

    拿到安装命令

    可以直接复制的命令是 npx skills add https://github.com/personizeai/personize-skills --skill personize…;命令里的占位符换成自己的路径或密钥再执行。

  3. 3

    安装后重启宿主

    命令执行完要完全退出宿主工具再打开,让新装的 Skill 被重新扫描到,否则列表里可能看不到。

  4. 4

    按最小权限试用

    它需要调用外部服务,先在测试目录或测试账号里跑,确认没问题再放到正式项目。

常见问题

6 条

personize-memory 怎么安装?

在终端执行 npx skills add https://github.com/personizeai/personize-skills --skill personize-memory。装完完全退出宿主工具再打开,让它重新扫描本地 Skill。

personize-memory 支持哪些 AI 工具?

公开资料标注支持 Codex、Claude、Cursor、Gemini CLI。其他工具只要能读取本地 Skill 目录,一般也能手动放进去,但要自己确认触发方式是否一致。

personize-memory 需要什么权限?

权限级别是调用外部服务。该 Skill 可能调用第三方服务、云服务或外部模型 API,使用前需要确认账号、额度、数据发送范围和服务条款。

personize-memory 是免费的吗?

公开资料没有标注明确许可证,收费和商用限制都无法确认。正式使用前请到来源仓库核对授权说明。

personize-memory 用的人多吗?

公开数据是累计安装 489 次,近一周安装 21 次,下载 171 次。这些数字来自第三方目录统计,只能当作热度参考,不代表质量或安全性。

personize-memory 安全吗?

第三方扫描有提醒项,说明存在需要人工确认的行为。安装前请打开源码看清它读了什么、联网到哪里。

值得选的地方和要先想清楚的地方

值得选的地方

  • 同时适配 4 种工具,换客户端不用重新找替代品。

先想清楚的地方

  • 许可证没有明确标注,能不能商用、能不能再分发都不确定。
  • 第三方扫描存在提醒项或未通过项,需要人工逐条确认。
  • 第三方目录整理,版本更新和行为细节以来源仓库为准。

适不适合你

更适合

  • 已经在用 Codex,想直接扩展它能力的人。
  • 需要处理研究检索类任务、又不想每次都手写提示词的人。

不太适合

  • 需要明确授权才能用到公司项目里的场景。
  • 需要厂商级技术支持和 SLA 的生产系统。

研究检索类 Skill 对比

6 个同类
Skill总安装GitHub 星权限许可证扫描
find-skills

寻找技能 · Codex、Claude

31,199,81316,486操作浏览器MIT有提醒
self-improving-agent

自我改进 Agent · OpenClaw

16,464,0023,396接触敏感数据MIT-0通过
soultrace

灵魂追踪 · Codex、Claude

7,588,94412需要联网未明确有提醒
self-improving

自我完善 · OpenClaw

6,829,2841,046需要联网MIT-0通过
microsoft-foundry

微软代工厂 · Codex、Claude

6,614,144764调用外部服务未明确有提醒
personize-memory

记忆拟人化 · 本页

489—调用外部服务未明确有提醒

按安装量取同分类前几名;数字来自第三方目录统计,只作热度参考,不代表质量结论。

SKILL.md 原文

Skill: Personize Memory

This is your persistent memory for everything you know about a record — contacts, companies, employees, members, locations, devices, and more. Store and retrieve: customer data, interaction history, inputs, actions you've taken, reports, notes, and observations. Always consult Memory before acting on a record. Always update Memory after meaningful interactions.

Internal principle: Bad data in = bad personalization out. Memory is the foundation. Get it right, and every downstream feature (emails, notifications, dashboards, agents) gets better automatically.

When This Skill is Activated

This skill gives you the ability to store and retrieve data using the Personize SDK's memory system.

If the developer hasn't given a specific instruction yet, introduce yourself:

"I have access to the Memory skill. I can help you store data into Personize memory (memorize) and retrieve it (recall) — including batch syncs, semantic search, entity digests, and data export. What data are you working with?"

If the developer says something about storing, syncing, importing, or ingesting data, jump to MEMORIZE.

If the developer says something about retrieving, querying, searching, or assembling context, jump to RECALL.


When NOT to Use This Skill

  • For CRM sync with deploy templates → see the CRM / Database Sync section below
  • Need no-code visual workflows → use no-code-pipelines
  • Need durable scheduled pipelines with retries → use code-pipelines
  • Need to manage organizational rules, not entity data → use governance
  • Need multi-agent coordination state → use collaboration

Works With Both SDK and MCP — One Skill, Two Interfaces

This skill works identically whether the LLM accesses memory via the SDK (code, scripts, IDE agents) or via MCP (Claude Desktop, ChatGPT, Cursor MCP connection).

InterfaceHow it worksBest for
SDK (@personize/sdk)client.memory.memorize(), client.memory.recall(), etc.Scripts, CI/CD, IDE agents, recipes
MCP (Model Context Protocol)memory_store_pro, memory_recall_pro, ai_smart_guidelines toolsClaude Desktop, ChatGPT, Cursor, any MCP-compatible client

MCP tools map to SDK methods:

SDK MethodMCP ToolPurpose
client.memory.memorize(opts)memory_store_pro(content, email,...)Store data with AI extraction
client.memory.smartRecall(opts)memory_recall_pro(query, email,...)Semantic search (recommended)
client.memory.recall(opts)*(SDK only)*Direct DynamoDB lookup — properties + freeform memories (type required, no AI)
client.memory.smartDigest(opts)memory_digest(email,...)Compiled entity context (properties + memories)
client.memory.search(opts)*(SDK only)*Filter and export records
client.memory.memorizeBatch(opts)*(SDK only)*Batch sync with per-property control
client.memory.update(opts)memory_update_property(email,...)Update property or freeform memory (supports conditional writes + array ops)
client.memory.bulkUpdate(opts)*(SDK only)*Update multiple properties at once
client.memory.delete(opts)*(SDK only)*Soft-delete memories (30-day recovery)
client.memory.deleteRecord(opts)*(SDK only)*Soft-delete all memories for a record
client.memory.cancelDeletion(opts)*(SDK only)*Cancel pending soft-delete
client.memory.propertyHistory(opts)*(SDK only)*Query property change history
client.memory.queryProperties(opts)*(SDK only)*LLM-powered structured property search
client.memory.filterByProperty(opts)*(SDK only)*Deterministic property filter (no LLM)
client.ai.smartGuidelines(opts)ai_smart_guidelines(message)Fetch guidelines by topic
client.memory.similar()memory_find_similarFind records similar to a seed record
client.memory.segment()memory_segmentBucket records into similarity tiers

MCP-Only Feature: Self-Memory (about='self')

MCP tools support an about parameter that the SDK does not expose directly:

  • about='lead' (default) — store/recall about a contact or company. Requires email, website_url, or record_id.
  • about='self' — store/recall about the current user (preferences, working style, goals). No identifier needed — identity is resolved automatically.
// MCP: Store user preferences
memory_store_pro(content="I prefer formal communication. My timezone is PST.", about="self")

// MCP: Recall user preferences
memory_recall_pro(query="What are my preferences and working style?", about="self", generate_answer=true)

Canonical API Names (v1.1)

  • memory_save replaces memory_store_pro as the canonical MCP tool name
  • memory_retrieve replaces memory_recall_pro / smartRecall
  • Old tool names still work — use whichever you prefer

When reading this skill document:

  • If you're connected via MCP, use the MCP tool names (memory_store_pro, memory_recall_pro, etc.)
  • If you're running via SDK, use the client.memory.* methods
  • All workflows, rules, and best practices apply equally to both interfaces

Actions

You have 6 actions. Use whichever matches what the developer needs.

ActionWhen to UseReference
MEMORIZEDeveloper needs to store data -- single items, batch sync, CRM import, webhook data, generated outputsreference/memorize.md
RECALLDeveloper needs to retrieve data -- semantic search, entity context, filtered exports, context assemblyreference/recall.md
CRUDDeveloper needs to directly modify, delete, query history, or filter by property value -- no AI extractionreference/crud-operations.md
FIND SIMILARDeveloper wants lookalikes, related records, "find more like this", or records connected through shared properties/memoriesreference/similar.md
SEGMENTDeveloper wants to bucket, tier, or segment records relative to a seed record or text descriptionreference/segment.md
ENTITY TYPESDeveloper needs to inspect or customize entity type metadata (rename, re-icon, archive, restore)See "Entity Type Management" section below

Before each action: Read the reference file for full method signatures, decision trees, code examples, and common mistakes.


Action: MEMORIZE

Store data into Personize memory. The right method depends on what you're storing and how much of it.

Which Method to Use

ScenarioMethodWhy
One item, with AI extractionmemory.memorize()Rich text (notes, transcripts, emails) → AI extracts facts and creates vectors
Batch sync from CRM/DBmemory.memorizeBatch()Multiple records with per-property extractMemories control
Structured data, no AI neededmemory.memorizeBatch() with extractMemories: falseStore exact key-value pairs (email, plan_tier, login_count) without AI overhead

The extractMemories Decision

extractMemories defaults to false. You must set extractMemories: true on rich text fields to enable AI extraction and semantic search. Without it, batch-synced data is stored as structured properties only — no memories, no vector embeddings, no semantic recall.

Data TypeextractMemoriesReasoning
Rich text (notes, transcripts, emails, descriptions)true (must set explicitly)AI extracts facts, creates vector embeddings for semantic search
Generated content (AI outputs you want to remember)true (must set explicitly)Enables the feedback loop — AI knows what it already said
ML outputs with explanations (churn reason, lead score rationale)true (must set explicitly)The explanation text benefits from extraction
Structured facts (email, name, plan, dates, counts)false (default)Already structured — AI extraction wastes tokens and adds latency
Binary flags, IDs, URLsfalse (default)No semantic content to extract
Rule of thumb: Always set extractMemories: true on any field containing free-form text. If you skip it, those fields get stored as properties but produce zero memories — smartRecall() and smartDigest() won't find them.

Quick Example

// Single item — AI extraction with identity hints
await client.memory.memorize({
    content: 'Also extract First Name, Last Name, Company Name, and Job Title if mentioned.\n\nCall with Sarah Chen (VP Eng, Initech). She mentioned they are evaluating SOC2 compliance tools. Main pain point: manual audit prep taking 2 weeks per quarter. Budget approved for Q2.',
    speaker: 'Sales Team',
    email: 'sarah.chen@initech.com',
    enhanced: true,
    tags: ['call-notes', 'sales', 'source:manual'],
});

// Batch sync — per-property control
await client.memory.memorizeBatch({
    source: 'Hubspot',
    mapping: {
        entityType: 'contact',
        email: 'email',
        runName: 'hubspot-contact-sync',
        properties: {
            full_name:    { sourceField: 'firstname', collectionId: 'col_xxx', collectionName: 'Contacts', extractMemories: false },
            job_title:    { sourceField: 'jobtitle',  collectionId: 'col_xxx', collectionName: 'Contacts', extractMemories: false },
            last_notes:   { sourceField: 'notes',     collectionId: 'col_xxx', collectionName: 'Contacts', extractMemories: true },
        },
    },
    rows: crmContacts,  // array of objects from your CRM
});
// ⚠️ memorizeBatch() is async — records land in ~1-2 minutes (EventBridge → Lambda).
// Verify with search() or smartDigest() after processing completes.

Intelligence Tiers (memorize + batch-memorize)

memorize() and memorizeBatch() accept a tier param that selects the LLM pipeline and credit rate. Defaults to pro — no breaking change for existing callers.

Available tiers: basic, pro (default), pro_fast, ultra. For current rates, see personize.ai.

Tiers also control maxProperties (15–50), chunkMaxWords (2000–4000), and minPropertyScore (0.2–0.4). Model fallback is automatic — if the primary model fails, the system routes to the fallback.

await client.memory.memorize({
    content: '...',
    email: 'user@co.com',
    enhanced: true,
    tier: 'basic',       // or 'pro' (default), 'pro_fast', 'ultra'
});

await client.memory.memorizeBatch({
    source: 'HubSpot',
    mapping: { ... },
    rows: contacts,
    tier: 'pro_fast',    // fast LLMs, lower latency
});
Note: These are memorize intelligence tiers — they control the extraction pipeline. For content generation via client.ai.prompt(), see the separate generate tiers below.

Generate Tiers (prompt)

client.ai.prompt() has its own tier system for content generation, separate from memorize tiers. Available tiers: basic, pro (default), ultra. For current rates, see personize.ai.

Pass tier to select a curated model (default). Custom model and provider require BYOK (openrouterApiKey) — without it, the API returns 400.


Constraints

Keywords follow RFC 2119: MUST = non-negotiable, SHOULD = strong default (override with stated reasoning), MAY = agent discretion.
  1. MUST include at least one tag on every memorize() call (e.g. tags: ['source:hubspot', 'type:interaction', 'team:sales']) -- because tags serve two purposes: (a) filtering, attribution, and workspace scoping, and (b) property selection boosting — tags that match a property definition's own tags array give that property a +15% score boost during extraction, making extraction context-aware. For example, tags: ["qualification"] boosts properties tagged ["qualification"] like Decision Maker or Budget.
  2. SHOULD include a timestamp in the content or use the timestamp parameter -- because temporal ordering lets recall distinguish recent facts from stale ones.
  3. MUST NOT pre-process content with an LLM before calling memorize() with enhanced: true -- because double-processing wastes tokens and the extraction pipeline is optimized for raw input.
  4. MUST NOT manually deduplicate before memorizing -- because the platform deduplicates at cosine 0.92 similarity and runs background consolidation; client-side dedup adds complexity with no benefit.
  5. SHOULD memorize generated outputs (emails, notifications, reports) after delivery -- because the feedback loop lets future recalls see what was already sent, preventing repetition.
  6. SHOULD use client.collections.create/update/delete() or the web app for schema changes -- because collections define the extraction schema and ad-hoc creation risks inconsistency.
  7. MUST call client.me() before batch operations to read plan rate limits -- because exceeding limits causes 429 errors and partial syncs with no automatic resume.
  8. SHOULD prepend extraction hints for identity/demographic fields (name, company, title, location) when those fields may be empty for the record -- because the property selector uses embedding similarity, and generic identity fields score low against specific content; hints ensure they are selected alongside the content-relevant properties without limiting the selector. See reference/memorize.md → "Extraction Hints" for the full pattern.
Full guide: Read reference/memorize.md for complete method signatures, data mapping patterns, all source-specific recipes (CRM, database, webhook, CSV), batch strategies, error handling, and the feedback loop.

CRM / Database Sync

For production-grade data sync from CRMs and databases (Salesforce, HubSpot, Postgres), this skill includes source-specific connector templates and deployment configs:

  • Source templates: templates/salesforce.md, templates/hubspot.md, templates/postgres.md — fetch patterns, auth setup, field mapping for each source
  • Deployment: deploy/Dockerfile, deploy/render.yaml, deploy/github-action.yml — scheduled sync on Render, GitHub Actions, or any container platform
  • Advanced patterns: reference/sync-advanced-patterns.md — incremental sync with state tracking, multi-source architecture, batch export with pagination, complete end-to-end example

The integration pattern: initialize project → client.me() for auth + limits → fetch rows from source → client.collections.list() for collection IDs → build property mapping → memorizeBatch() in chunks with 429 retry → verify with search() or smartDigest(). See recipes/data-sync.ts for a runnable example.


Action: RECALL

Retrieve data from Personize memory. The right method depends on what kind of answer you need.

Which Method to Use

NeedMethodReturns
"What do we know about X topic?"memory.smartRecall()Semantic search results with optional reflection/answers (recommended)
"Quick deterministic lookup, no AI"memory.recall()Direct DynamoDB lookup (type required, no vector search, no reflection)
"Give me everything about this person/company"memory.smartDigest()Compiled markdown context — all properties + memories for one entity
"List all contacts matching criteria X"memory.search()Filtered records with property values
"What are our guidelines for X?"ai.smartGuidelines()Governance variables matching a topic
smartRecall() vs recall(): Use smartRecall() for most use cases — it supports reflection, answer generation, mode, and infers type from email/website_url. Use recall() only for simple direct lookups — type is required (e.g. type: 'Contact').
Identifier behavior — how email, websiteUrl, recordId, type-only, and no identifier affect each endpoint (error vs empty vs org-wide search) → read reference/identifier-scenarios.md.

When to Use What

Need specific facts about a topic?         → smartRecall()
Need full context about ONE entity?         → smartDigest()
Need to filter/segment a list of records?   → search()
Need organizational rules/guidelines?       → smartGuidelines()

Building a generation prompt?               → smartGuidelines() + smartDigest() + smartRecall()
                                              (governance + entity + task-specific facts)

Quick Example

// Semantic search — find specific facts (recommended)
const results = await client.memory.smartRecall({
    query: 'what pain points did this contact mention?',
    email: 'sarah.chen@initech.com',
    type: 'Contact',
    limit: 10,
    minScore: 0.4,
    include_property_values: true,
});

// Fast recall — skip reflection, ~500ms response
const fast = await client.memory.smartRecall({
    query: 'what do we know about this contact?',
    email: 'sarah.chen@initech.com',
    type: 'Contact',
    mode: 'fast',
});

// Entity digest — compiled context for one person
const digest = await client.memory.smartDigest({
    email: 'sarah.chen@initech.com',
    type: 'Contact',
    token_budget: 2000,
    include_properties: true,
    include_memories: true,
});
// digest.data.compiledContext → ready-to-inject markdown

// Entity digest via custom key (e.g. LinkedIn URL, student number)
const linkedinDigest = await client.memory.smartDigest({
    customKeyName: 'linkedin_url',
    customKeyValue: 'sarah-chen-12345',
    token_budget: 2000,
});
// Works with any customKeyName used during memorize

// Filtered export — find all enterprise contacts
const exported = await client.memory.search({
    type: 'Contact',
    returnRecords: true,
    pageSize: 50,
    groups: [{
        conditions: [
            { property: 'plan_tier', operator: 'EQ', value: 'enterprise' },
            { property: 'email', operator: 'IS_SET' },
        ],
    }],
});

// --- Advanced search patterns ---

// Key-only lookup: find by CRM key without property conditions
const byEmail = await client.memory.search({
    email: 'sarah@acme.com',
    returnRecords: true,
});

// Custom key lookup
const student = await client.memory.search({
    type: 'Student',
    customKeyName: 'studentNumber',
    customKeyValue: 'S-2024-1234',
    returnRecords: true,
});

// Secondary key: find Students by email (even though primary key is studentNumber)
const studentByEmail = await client.memory.search({
    type: 'Student',
    email: 'alice@university.edu',
    returnRecords: true,
});

// Cross-type: find ALL records with this email across ALL entity types
const allTypes = await client.memory.search({
    email: 'john@acme.com',
    returnRecords: true,
});
// Returns Contacts, Students, Employees — whatever has this email

Advanced Search: Key-Only, Secondary Key, and Cross-Type

search() supports three advanced patterns beyond property filtering:

PatternDescriptionExample
Key-only lookupPass email, websiteUrl, recordId, or customKeyName/customKeyValue without groupssearch({email: '...'})
Secondary keySearch by a CRM key that isn't the record's primary keysearch({type: 'Student', email: '...'}) where primary key is studentNumber
Cross-typeOmit type to search across all entity typessearch({email: '...'}) → returns Contact + Student + Employee

When you don't have the primary key but have a stored property value (like a LinkedIn URL), use a property condition filter instead:

const byLinkedIn = await client.memory.search({
    type: 'Contact',
    returnRecords: true,
    groups: [{ conditions: [{ property: 'linkedin_url', operator: 'EQ', value: 'https://linkedin.com/in/johndoe' }] }],
});
Full reference: See reference/recall.md → "Advanced Search Patterns" for all patterns, trade-offs, and when-to-use guidance.

The Three-Layer Agent Operating Model

Memory is one of three layers every agent should assemble before acting: Guidelines (organizational rules via smartGuidelines()), Memory (entity knowledge via smartDigest()/recall()), and Workspace (coordination state via workspace-tagged recall()/memorize()). All three together: the agent acts within governance, with full context, in coordination with others.

Full architecture guide: See the collaboration skill's reference/architecture.md for the complete three-layer model, composition patterns, and adoption path.

Cross-Entity Context

Memory gives you everything about ONE entity. But agents often need context from related entities — the company a contact works at, other contacts at the same account, related deals or projects.

Pattern: Multi-entity context assembly

// When working on a contact, also pull their company context
const [contactDigest, companyDigest] = await Promise.all([
    client.memory.smartDigest({ email: 'sarah@acme.com', type: 'Contact', token_budget: 1500 }),
    client.memory.smartDigest({ website_url: 'https://acme.com', type: 'Company', token_budget: 1000 }),
]);
// Now you know Sarah AND you know Acme — funding stage, tech stack, team size, etc.

When to pull cross-entity context:

  • Working on a contact → also pull their company
  • Working on a deal → also pull the contact AND the company
  • Generating account-level content → pull all contacts at that company
  • Detecting patterns → export across entity types and cross-reference

The Context Assembly Pattern

Most generation pipelines combine multiple recall methods:

async function assembleContext(email: string, task: string): Promise<string> {
    const sections: string[] = [];

    // 1. Governance — rules and guidelines
    // Use mode: 'fast' for real-time agents (~200ms), 'full' for deep analysis (~3s)
    const governance = await client.ai.smartGuidelines({
        message: `${task} — guidelines, tone, constraints`,
        mode: 'fast', // embedding-only routing, no LLM overhead
    });
    if (governance.data?.compiledContext) {
        sections.push('## Guidelines\n' + governance.data.compiledContext);
    }

    // 2. Entity context — everything about this person
    const digest = await client.memory.smartDigest({
        email,
        type: 'Contact',
        token_budget: 2000,
        include_properties: true,
        include_memories: true,
    });
    if (digest.data?.compiledContext) {
        sections.push('## Recipient Context\n' + digest.data.compiledContext);
    }

    // 3. Task-specific facts — semantic search
    const recalled = await client.memory.smartRecall({
        query: task,
        email,
        type: 'Contact',
        mode: 'fast',
        limit: 10,
        minScore: 0.3,
    });
    if (recalled.data?.results && Array.isArray(recalled.data.results) && recalled.data.results.length > 0) {
        sections.push('## Relevant Facts\n' + recalled.data.results.map((m: any) =>
            `- ${m.text || m.content || JSON.stringify(m)}`
        ).join('\n'));
    }

    return sections.join('\n\n---\n\n');
}

New: Add groupByRecord: true to group results by record instead of a flat list. Returns recordGroups array with topScore, matchCount, and top 3 matches per record. No extra cost.

Recall Pricing

All read operations charge a flat per-call rate regardless of mode ('fast', 'deep', etc.). Mode choice affects latency and depth, not cost. For current rates, see personize.ai.

Use mode: 'fast' in loops and batch pipelines to minimize latency.


Constraints

Keywords follow RFC 2119: MUST = non-negotiable, SHOULD = strong default (override with stated reasoning), MAY = agent discretion.
  1. MUST set an explicit token_budget on every smartDigest() call -- because the default (1000) may truncate critical context for deep personalization or waste tokens for simple lookups.
  2. SHOULD set minScore on smartRecall() (0.3 for broad context, 0.5+ for precision) -- because omitting it returns low-relevance noise that dilutes the context window.
  3. SHOULD use mode: 'fast' for context injection, real-time UIs, and batch processing -- because it cuts recall latency from ~10-20s to ~500ms; override for exploratory queries where reflection adds value.
  4. SHOULD assemble context from all three layers (smartGuidelines + smartDigest + smartRecall) before generating -- because single-source context produces governance-blind, entity-ignorant, or task-irrelevant output. Use mode: 'fast' for real-time agent flows (~200ms), mode: 'deep' for first-call or complex planning tasks (~3s). (Note: 'full' was renamed to 'deep' in SDK types and API.)
  5. MAY set include_property_values: true on smartRecall() -- because it returns structured properties alongside semantic results, useful when the caller needs both.
  6. MUST paginate export() calls using page and pageSize -- because unbounded exports can time out or exceed memory limits on large datasets. Default pageSize is 50.
  7. MAY cache smartDigest() results within a single pipeline run when the same entity is referenced multiple times -- because redundant API calls waste tokens and add latency.
Full guide: Read reference/recall.md for complete method signatures, query writing strategies, token budget tuning, scoring thresholds, all context assembly patterns, export filtering, and performance optimization.

Action: CRUD Operations (Update, Delete, History)

Use these operations when the developer needs to directly modify, delete, or query history for memory data — as opposed to AI-powered memorization.

When to use CRUD vs Memorize

NeedUse
Store new data from text/conversationsmemorize (AI extraction)
Directly set a property valueupdate (CRUD)
Change multiple properties at oncebulk-update (CRUD)
Edit a freeform memory's textupdate with memoryId + text
See how a property changed over timeproperty-history
Find records matching a conditionquery-properties (LLM-powered)
Delete with recovery optiondelete / delete-record (soft-delete, 30-day recovery)
Undo a deletioncancel-deletion

Public API Endpoints (/api/v1/memory/...)

All require sk_live_ API key.

EndpointDescription
POST /memory/updateUpdate single property or freeform memory
POST /memory/bulk-updateUpdate multiple properties
POST /memory/deleteSoft-delete memories
POST /memory/delete-recordSoft-delete all memories for a record
POST /memory/cancel-deletionCancel pending deletion (30-day window)
POST /memory/property-historyQuery property change history
POST /memory/query-propertiesLLM-powered structured search
POST /memory/filter-by-propertyDeterministic property filter (no LLM, no token cost)

Conditional Writes (Optimistic Concurrency)

Pass expectedVersion on update/bulk-update to prevent concurrent overwrites:

await client.memory.update({
  recordId: 'rec-123',
  propertyName: 'deal_stage',
  propertyValue: 'negotiation',
  expectedVersion: 12,  // 409 if another write happened since you last read
});

Array Operations

Mutate array-typed properties without read-modify-write races:

// Push items (with dedup)
await client.memory.update({
  recordId, propertyName: 'tags',
  arrayPush: { items: ['vip'], unique: true },
});

// Remove items by value
await client.memory.update({
  recordId, propertyName: 'tags',
  arrayRemove: { items: ['trial'] },
});

// Patch matching objects in-place
await client.memory.update({
  recordId, propertyName: 'tasks',
  arrayPatch: { match: { taskId: 'abc' }, set: { status: 'done' } },
});

Filter By Property (No LLM)

Deterministic structured filter — no tokens, no latency:

const result = await client.memory.filterByProperty({
  conditions: [
    { propertyName: 'status', operator: 'equals', value: 'active' },
    { propertyName: 'score', operator: 'gt', value: 50 },
  ],
  logic: 'AND',
  limit: 100,
});
// result.data.records → [{ recordId, type, matchedProperties, lastUpdatedAt }]
// result.data.totalMatched, result.data.nextToken

Operators: equals, notEquals, contains, gt, lt, gte, lte, exists, isEmpty

Update Example

// Update a single property
const result = await client.memory.update({
  recordId: 'rec-123',
  type: 'contact',
  propertyName: 'company_name',
  propertyValue: 'Acme Corp',
});
// result.data → { previousValue, newValue, version, stores }

Bulk Update

const result = await client.memory.bulkUpdate({
  recordId: 'rec-123',
  type: 'contact',
  updates: [
    { propertyName: 'company_name', propertyValue: 'Acme Corp' },
    { propertyName: 'deal_stage', propertyValue: 'closed_won' },
  ],
  expectedVersion: 5,  // optional concurrency guard
});
// result.data.results → [{ propertyName, previousValue, newValue, status }]

Property History

const history = await client.memory.propertyHistory({
  recordId: 'rec-123',
  propertyName: 'deal_stage',  // optional — omit for all properties
  limit: 20,
});
// history.data.entries → [{ entryId, propertyName, propertyValue, updatedBy, createdAt, source }]

Query Properties (LLM-powered)

const matches = await client.memory.queryProperties({
  propertyName: 'pain_points',
  query: 'concerns about compliance or security',
  type: 'Contact',
  limit: 50,
});
// matches.data.matches → [{ recordId, propertyValue, matchReason }]

Delete with Recovery

All deletes are soft-deletes with a 30-day recovery window. During this window, cancelDeletion restores the data.

// Soft-delete a record
await client.memory.deleteRecord({
  recordId: 'rec-123',
  type: 'contact',
});

// Undo within 30 days
await client.memory.cancelDeletion({
  recordId: 'rec-123',
  type: 'contact',
});

Webhook Events

All mutations fire webhook events: memory.property.updated, memory.properties.bulk_updated, memory.updated, memory.deleted, memory.record.deleted, memory.record.deletion_cancelled.


Action: FIND SIMILAR RECORDS

When to use: User wants to find lookalikes, related records, "find more like this", or records connected through shared properties/memories.

SDK: client.memory.similar({seed: {email}, dimensions, topK}) MCP: memory_find_similar CLI: personize memory similar --email <email>

Key parameters:

ParameterTypeDefaultDescription
seedobjectrequiredRecord identifier: {email?, recordId?, websiteUrl?}
dimensionsstring"hybrid"properties, memories, hybrid, or connections
topKnumber25Max results (max 500)
minScorenumber0.3Min similarity threshold
returnAllIdsbooleanfalseBatch mode: flat list for downstream processing
rankingModestring"balanced"balanced (+0.08 bonus for multi-dim) or weighted

Tiers: very_similar (>=0.75), similar (>=0.5), somewhat_similar (>=0.3)

Example:

// Find 10 records most similar to john@acme.com
const result = await client.memory.similar({
    seed: { email: 'john@acme.com' },
    topK: 10,
    dimensions: 'hybrid',
});
// result.data.results[0].recordId, .score, .tier, .matchBreakdown
// result.data.tiers.very_similar = ['REC#...', ...]

Cost: 1 credit per request.

See reference/similar.md for full parameter and response reference.


Action: SEGMENT AUDIENCE

When to use: User wants to bucket, tier, or segment records relative to a seed record or text description.

SDK: client.memory.segment({seed: {email} | {text}, maxPerTier}) MCP: memory_segment CLI: personize memory segment --email <email> or --text "description"

Key parameters:

ParameterTypeDefaultDescription
seedobjectrequiredRecord identifier OR {text: "description"}
dimensionsstring"hybrid"properties, memories, or hybrid
maxPerTiernumber50RecordIds per tier page (max 500)
returnTierstring-Fetch single tier only
tierOffsetnumber0Pagination within tiers

Example:

// Segment all records relative to an ICP description
const result = await client.memory.segment({
    seed: { text: 'Enterprise SaaS CTO interested in AI automation' },
    maxPerTier: 20,
});
// result.data.tiers.very_similar.recordIds = ['REC#...', ...]
// result.data.tiers.very_similar.count = 12
// result.data.tiers.not_similar.approximate = true

Cost: 2 credits per request.

See reference/segment.md for full parameter and response reference.


SDK Method Reference

import { Personize } from '@personize/sdk';
const client = new Personize({ secretKey: process.env.PERSONIZE_SECRET_KEY! });

Memorize Methods

MethodEndpointPurpose
memory.memorize(opts)POST /api/v1/memorizeStore single item with AI extraction
memory.memorizeBatch(opts)POST /api/v1/batch-memorizeBatch sync with per-property extractMemories control

Recall Methods

MethodEndpointPurpose
memory.smartRecall(opts)POST /api/v1/smart-recallSemantic search with reflection + answer gen (recommended)
memory.recall(opts)POST /api/v1/recallDirect DynamoDB lookup — properties + freeform memories (type required, no AI)
memory.smartDigest(opts)POST /api/v1/smart-memory-digestCompiled entity context (properties + memories)
memory.search(opts)POST /api/v1/searchFilter and export records
ai.smartGuidelines(opts)POST /api/v1/ai/smart-guidelinesFetch governance variables by topic

Similarity Methods

MethodEndpointPurpose
memory.similar(opts)POST /api/v1/similarFind records similar to a seed record
memory.segment(opts)POST /api/v1/segmentBucket all records into similarity tiers

CRUD Methods

MethodEndpointPurpose
memory.update(opts)POST /api/v1/memory/updateUpdate single property or freeform memory. Supports expectedVersion + array ops
memory.bulkUpdate(opts)POST /api/v1/memory/bulk-updateUpdate multiple properties on a record
memory.delete(opts)POST /api/v1/memory/deleteSoft-delete memories (30-day recovery)
memory.deleteRecord(opts)POST /api/v1/memory/delete-recordSoft-delete all memories for a record
memory.cancelDeletion(opts)POST /api/v1/memory/cancel-deletionCancel pending deletion within 30-day window
memory.propertyHistory(opts)POST /api/v1/memory/property-historyQuery property change history
memory.queryProperties(opts)POST /api/v1/memory/query-propertiesLLM-powered structured search across property values
memory.filterByProperty(opts)POST /api/v1/memory/filter-by-propertyDeterministic property filter (no LLM, no token cost)

Key Type Signatures

// memorize() — single item
interface MemorizeProOptions {
    content: string;           // The text to memorize
    speaker?: string;          // Who said/wrote it
    timestamp?: string;        // When it happened
    email?: string;            // Match to contact by email
    website_url?: string;      // Match to company by website
    record_id?: string;        // Match to record by ID
    enhanced?: boolean;        // Enable AI extraction (default: false)
    tags?: string[];           // Categorization tags
    max_properties?: number;   // Max properties to extract
    schema?: Record<string, unknown>; // Extraction schema hint
    extractionPrompt?: string;       // Guide what extraction focuses on (max 500 chars)
    actionId?: string;         // Target collection ID
}

// memorizeBatch() — batch sync
interface BatchMemorizeOptions {
    source: string;            // Source system label ('Hubspot', 'Salesforce')
    mapping: {
        entityType: string;    // 'contact', 'company'
        email?: string;        // Source field name for email
        website?: string;      // Source field name for website
        runName?: string;      // Tracking label
        properties: Record<string, {
            sourceField: string;       // Source field name in row data
            collectionId: string;      // Target collection ID
            collectionName: string;    // Target collection name
            extractMemories?: boolean; // AI extraction for this property
        }>;
    };
    rows: Record<string, unknown>[]; // Source data rows
    dryRun?: boolean;          // Validate without writing
    chunkSize?: number;        // Rows per chunk (default: 1)
}

// smartRecall() — semantic search (recommended)
interface SmartRecallOptions {
    query: string;             // Natural language query
    limit?: number;            // Max results (default: 10)
    minScore?: number;         // Minimum relevance score (0-1)
    email?: string;            // Scope to one contact
    website_url?: string;      // Scope to one company
    record_id?: string;        // Scope to one record
    type?: string;             // Entity type filter (optional — inferred from email/website_url)
    include_property_values?: boolean; // Include structured properties
    enable_reflection?: boolean;       // AI reflects on results
    generate_answer?: boolean;         // AI generates a direct answer
    mode?: 'fast' | 'deep';    // 'fast' skips reflection + answer gen, ~500ms; 'deep' enables full reflection (default: 'deep')
    min_score?: number;        // Server-side score filter (in fast mode, defaults to 0.3)
}

// recall() — direct lookup (simpler, type required)
interface RecallOptions {
    query: string;             // Natural language query
    type: string;              // Entity type — REQUIRED (e.g. 'Contact', 'Company')
    record_id?: string;        // Scope to one record
    email?: string;            // Scope to one contact
    website_url?: string;      // Scope to one company
    filters?: Record<string, unknown>; // Additional filters
}

// smartDigest() — entity context
interface SmartDigestOptions {
    email?: string;            // Contact email
    website_url?: string;      // Company website
    record_id?: string;        // Record ID
    type?: string;             // Entity type ('Contact', 'Company')
    customKeyName?: string;    // Custom identifier field (e.g. 'linkedin_url', 'student_number')
    customKeyValue?: string;   // Custom identifier value
    token_budget?: number;     // Max tokens for output (default: 1000)
    max_memories?: number;     // Max memories to include (default: 20)
    include_properties?: boolean; // Include structured properties (default: true)
    include_memories?: boolean;   // Include free-form memories (default: true)
}

The Data Model

┌─────────────────────────────────────────────────────────────┐
│                    PERSONIZE MEMORY                          │
│                                                             │
│  ┌───────────────────┐    ┌──────────────────────────────┐  │
│  │  STRUCTURED DATA  │    │     SEMANTIC MEMORIES         │  │
│  │  (DynamoDB)       │    │     (Vector Store)            │  │
│  │                   │    │                              │  │
│  │  Records:         │    │  AI-extracted facts from:    │  │
│  │  ├─ email: "..."  │    │  ├─ Call notes              │  │
│  │  ├─ plan: "pro"   │    │  ├─ Support tickets         │  │
│  │  ├─ title: "VP"   │    │  ├─ Email threads           │  │
│  │  └─ login_count:5 │    │  ├─ Meeting transcripts     │  │
│  │                   │    │  └─ Generated outputs        │  │
│  └───────────────────┘    └──────────────────────────────┘  │
│           │                            │                    │
│           ▼                            ▼                    │
│     search() filters           smartRecall() searches        │
│     memorize() writes          memorizeBatch() writes       │
│     smartDigest() reads both ──────────┘                    │
└─────────────────────────────────────────────────────────────┘
  • Structured data = exact key-value pairs. Queryable by field, filterable, paginated.
  • Semantic memories = AI-extracted facts with vector embeddings. Searchable by meaning.
  • smartDigest combines both into a single, token-budgeted markdown block.

Available Resources

ResourceContents
reference/memorize.mdFull memorize guide: method signatures, data mapping, extractMemories decision tree, source recipes, batch strategies, error handling, feedback loop
reference/recall.mdFull recall guide: method signatures, query strategies, token budgets, scoring, context assembly, export filtering, performance tips
reference/crud-operations.mdCRUD operations: update, bulk-update, delete, cancel-deletion, property-history, query-properties, filter-by-property — request/response shapes, error codes
reference/identifier-scenarios.mdHow each endpoint (memorize, recall, smartRecall, smartDigest) behaves with email, websiteUrl, recordId, type-only, or no identifier — scenarios A–G with error vs empty vs success table
reference/similar.mdFind Similar Records: full parameter reference, response shapes, tiers, cross-type similarity, billing
reference/segment.mdSegment Audience: full parameter reference, text-based seeds, tier response shapes, pagination, billing
recipes/data-sync.tsBatch sync from CRM/database with validation and error handling
recipes/context-assembly.tsComplete context assembly pattern combining all recall methods

Entity Type Management

Entity types define the schema for your memory records (Contact, Company, Employee, etc.). Each org has system-built types and can have custom types. Use these endpoints to inspect and customize entity type metadata -- you cannot change the slug or archive system types.

When to Use

NeedAction
List all entity types in your orgclient.entityTypes.list()
Get details on a specific entity typeclient.entityTypes.get(id)
Rename, re-icon, or change descriptionclient.entityTypes.update(id, opts)
Soft-remove a custom entity typeclient.entityTypes.archive(id)
Restore an archived entity typeclient.entityTypes.update(id, {status: 'Active'})

SDK Methods

SDK MethodEndpointScope
client.entityTypes.list()GET /api/v1/entitiesall
client.entityTypes.get(id)GET /api/v1/entities/:idall
client.entityTypes.update(id, opts)PATCH /api/v1/entities/:idadmin only
client.entityTypes.archive(id)DELETE /api/v1/entities/:idadmin only
Note: MCP does not currently expose entity type management tools. Use the SDK or REST API directly.

Key Parameters -- update()

ParameterTypeNotes
namestringDisplay label (e.g. "Lead")
pluralLabelstringPlural form (e.g. "Leads")
descriptionstringHuman-readable description
iconstringIcon identifier
colorstringColor hex or name
primaryKeyFieldstringWhich field is the primary identifier
identifierColumnstringColumn used as the display identifier
status'Active' or 'Archived'Archive or restore

Constraints:

  • slug and isSystem cannot be changed via API (silently ignored)
  • System types cannot be archived (returns 403)
  • Restore an archived custom type: update(id, {status: 'Active'})

Quick Example

// List all entity types
const types = await client.entityTypes.list();
// types.data -> EntityTypeResponse[]

// Update label and icon
await client.entityTypes.update('act_xxx', {
    name: 'Lead',
    pluralLabel: 'Leads',
    icon: 'user-plus',
    color: '#4F46E5',
});

// Archive a custom entity type
await client.entityTypes.archive('act_xxx');

// Restore it later
await client.entityTypes.update('act_xxx', { status: 'Active' });

Signal Memorization Patterns

@personize/signal uses entity memory for its feedback loop and deferred notification pipeline. Understanding these patterns helps when debugging Signal behavior or building custom integrations.

Tag Conventions

TagWritten byPurpose
signal:sentEngine (step 8)Tracks delivered notifications — recalled during context assembly to prevent repetition
signal:deferredEngine (step 5)Marks notifications scored 40-60 for later digest compilation
signal:pending-digestEngine (step 5)Paired with signal:deferred — digest builder queries these
signal:digestDigestBuilderMarks compiled digest notifications
workspace:updatesEngine (step 7)Workspace entries created on SEND
workspace:tasksEngine (step 7)Workspace entries created on DEFER

Feedback Loop

After every SEND decision, Signal memorizes what was sent:

await client.memory.memorize({
    content: `[SIGNAL] Sent "${subject}" via ${channel} (score: ${score}). ${reasoning}`,
    email,
    enhanced: true,
    tags: ['signal:sent', `signal:channel:${channel}`, `signal:type:${eventType}`],
});

On the next evaluation for the same entity, the engine recalls recent signal:sent memories (step 3, 4th parallel call). The AI sees what was recently sent and can SKIP to avoid repetition — even if the pre-check dedup window has expired.

Deferred → Digest Pipeline

  1. Defer (score 40-60): memorize() with tags ['signal:deferred', 'signal:pending-digest', eventType]
  2. Digest build: smartRecall({query: 'deferred notifications', tags: ['signal:deferred']}) retrieves pending items
  3. Compile: prompt() generates a personalized digest from all deferred items + entity context
  4. Deliver: Channel sends the compiled digest
  5. Mark processed: memorize() with tag signal:digest — future digest builds skip already-compiled items

Querying Signal History

// What notifications has Signal sent to this contact?
const sent = await client.memory.smartRecall({
    query: 'notifications sent by signal',
    email: 'jane@acme.com',
    type: 'Contact',
    mode: 'fast',
    limit: 10,
});

// What's pending in the digest queue?
const pending = await client.memory.smartRecall({
    query: 'deferred notifications pending digest',
    email: 'jane@acme.com',
    type: 'Contact',
    mode: 'fast',
    limit: 20,
});

平台分布

Codex

34.79%
按下载量换算59

Claude

32%
按下载量换算55

Cursor

19.94%
按下载量换算34

Gemini CLI

8.56%
按下载量换算15

安全审计

Gen Agent Trust Hub

通过

Socket

通过

Snyk

可疑

权限和风险

调用外部服务

该 Skill 可能调用第三方服务、云服务或外部模型 API,使用前需要确认账号、额度、数据发送范围和服务条款。

安装前确认

本站仅展示第三方公开信息,不托管安装包,不提供自动安装或运行环境。安装前应自行审查源码、依赖和命令行为。来源安全扫描存在提醒或未通过项,安装前请自行复核。目前只有一个公开来源,建议同时核对源仓库。

继续浏览同类 Skills