关于 Palinode
Palinode 是基于 Git 版本化 Markdown 文件的项目记忆工具,供 AI Agent 在多次会话、多个 Agent 与工作树之间保存、检索和修正决策。文件即事实来源,所有变更可审查、可回滚。
主要功能
- 01Markdown 与 YAML frontmatter 存储
- 02Git 历史可查看、比对与回滚
- 03BM25 与向量混合检索
- 04可通过 REST API 与 CLI 访问
- 05按会话自动注入的记忆(部分客户端)
- 06周期性整理并以 Git 提交记录
适用场景
- 01记录并回溯被替换的技术决策
- 02让新会话的 Agent 读取既有项目背景
- 03在多台机器或 IDE 间共享同一记忆服务
MCP 相关
Palinode 通过 MCP 服务暴露保存、搜索、诊断、差异、追溯与回滚等工具,支持 Streamable HTTP 与 stdio 两种连接方式,可连接 Claude Code、Cursor 等兼容客户端。
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
uvx palinodePALINODE_DIRPath to the markdown-memory directory (e.g. ~/.palinode). Created if missing.PALINODE_API_HOSTHost where the back-end palinode-api process is reachablePALINODE_API_PORTPort for palinode-apiPALINODE_API_TOKEN密钥Optional bearer token enforced on every palinode-api request other than /health. Required when PALINODE_API_BIND_INTENT=public. Generate with: python -c 'import secrets; print(secrets.token_urlsafe(32))'.PALINODE_API_TOKEN_FILE密钥Path to a file containing the bearer token (alternative to PALINODE_API_TOKEN; for docker-secrets style deployments)PALINODE_MCP_HTTP_HOSTBind host for the MCP HTTP server. Defaults to loopback; set to 0.0.0.0 only with intentional network exposure (paired with PALINODE_API_BIND_INTENT=public on the back-end).PALINODE_MCP_HTTP_PORTPort for the MCP HTTP server本地服务需要在你的电脑上安装运行环境(如 Node.js 18+)。各客户端的配置文件位置不同,请参考客户端文档。
工具
39收录的工具列表 · 更新于 2 周前
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| cwd | string | 否 | 用于解析项目范围的工作目录。省略时,默认为服务器进程的 CWD。 |
| project | string | 否 | 显式指定的项目 slug 或实体引用;优先于 cwd 解析。 |
详细介绍
┌─ palinode ─┐
│ ░░░░░░░░░░ │
│ ▓▓▓▓▓▓▓▓▓▓ │
│ ██████████ │
└────────────┘
可检查、可更正的项目记忆,助力跨会话、Agent 和工作树的重复工作。
上周,团队选择 SQLite 作为缓存,因为这样就不用运维数据库了。本周,需求变更,PostgreSQL 成了更好的选择。没有决策及其原因的记录,新 Agent 可能会重复旧方案。有了 Palinode,你可以保存替代方案、检查原始决策及其历史记录,并更正记录,以供下一次会话使用。
Palinode 将项目记忆保存在 Markdown 文件和 Git 历史中,由你在本地掌控。Agent 可以使用它的工具来保存、搜索和检查这些记忆。某些受支持的客户端集成还可以执行已配置的捕获或回忆操作;其自动行为、范围和控制方式因客户端和配置而异。未经标记的笔记绝不会被悄悄提升为事实。
Palinode 是一种诗歌形式:撤回之前所说的话,并将其说得更好。这正是记忆压缩所做的事。
由 phasespace-labs 的 Paul Kyle 构建。参见 AUTHORS。
从这里开始
按照规范版快速入门完成一整套流程: 安装 → 启动 → 连接 MCP 客户端 → 保存决策 → 开启新会话 → 检查其 Markdown/来源信息 → 更正。此流程将私有记忆存储与代码检出目录分开,并区分当前版本与从源代码检出后可用的功能。
检查已退役的决策

截图显示的是单独保存 PostgreSQL 替代方案并使原决策退役后,已归档的初始 SQLite 决策。完整的只读检查器和更正流程,请参阅本地来源信息 UI 指南;该指南说明,图片是在退役之后拍摄的,而不是保存步骤之前。
支持的平台
| 平台 | 会话技能路径 | MCP 配置 |
|---|---|---|
| Claude Code CLI | ~/.claude/skills/ | ~/.claude.json |
| Claude Desktop | ~/.claude/skills/ | claude_desktop_config.json |
| Cursor | .cursor/skills/ | .cursor/mcp.json |
| VS Code + Claude(Continue / Cline) | ~/.claude/skills/ | 参见 MCP-INSTALL-RECIPES.md |
| JetBrains + Claude | ~/.claude/skills/ | ~/.claude.json |
| Antigravity IDE | .agent/skills/ | 原生三点 MCP 菜单 |
| Codex CLI | N/A(不支持技能) | ~/.codex/config.toml |
| Pi | N/A(原生扩展) | plugins/pi/ — 通过生命周期钩子按轮次回忆 |
| Cline CLI / SDK | N/A(原生插件) | plugins/cline/ — 通过 AgentPlugin 钩子按轮次回忆 |
所有平台共用同一个 MCP 服务——在你的服务器上安装一次,即可从任何 IDE 连接。docs/HARNESSES.md 是跨宿主环境指南:介绍每种宿主环境的功能(原生钩子、插件或 MCP)、各层如何叠加,以及从何处开始。各客户端的配置片段见:docs/MCP-SETUP.md 和 docs/MCP-INSTALL-RECIPES.md。
核心理念
Palinode 将纯文本文件视为事实来源,并根据这些文件构建索引和接口。
Files (markdown + YAML frontmatter)
↓ watched
Index (SQLite-vec vectors + FTS5 keywords, single .db file)
↓ queried by
Interfaces (MCP server, REST API, CLI, OpenClaw plugin)
↓ compacted by
Consolidation (structured operations → validation and application → git commits)
这就是全部架构。一个 .md 文件目录、一个 SQLite 数据库、一个 API 服务。没有 Postgres,没有 Redis,也不依赖云服务。
一个后端,支持所有接口
Palinode 不在乎你如何与它交互。完整工具集——保存、搜索、诊断、重复项建议、孤立项修复、差异对比、追责、回滚等——都可通过每种接口使用:
| 接口 | 传输方式 | 适用场景 |
|---|---|---|
| MCP 服务 | Streamable HTTP 或 stdio | Claude Code、Claude Desktop、Cursor、Windsurf、Zed、VS Code (Continue/Cline) |
| REST API | :6340 上的 HTTP | 脚本、webhook、自定义集成 |
| CLI | 封装 REST API | Cron 作业、SSH、shell 脚本 |
| 插件 | OpenClaw 生命周期钩子 | 使用注入/提取模式的 Agent 框架 |
只需在一台服务器上设置一次。即可从任何机器、任何 IDE、任何 Agent 框架连接。MCP 服务是纯 HTTP 客户端——不保存任何状态、不连接数据库,也不包含嵌入器。将它指向 API 即可使用。
{
"mcpServers": {
"palinode": { "type": "http", "url": "http://your-server:6341/mcp/" }
}
}
这就是完整的客户端配置。适用于 Claude Code、Claude Desktop、Cursor、Windsurf、Zed 和 VS Code (Continue/Cline)。palinode-mcp-http 在 /mcp/ 提供 streamable-HTTP 服务——使用 "type": "http",而不是 "type": "sse"。URL 末尾务必保留斜杠。编辑器专属安装步骤请参阅 docs/MCP-SETUP.md。
工作原理
存储——使用带有 YAML frontmatter 的类型化 Markdown 文件(人物、项目、决策、见解)。由 Git 进行版本管理。便于阅读。可在 Obsidian、VS Code、vim 或任何其他工具中编辑。
索引——文件监视器会在你保存时使用 FTS5 建立索引。基于内容哈希的去重会跳过未更改文件的重新嵌入。索引是本地 SQLite 文件;嵌入可使用本地 BGE-M3 endpoint 或配置的远程提供方。
搜索——结合 BM25 与向量搜索,并使用 Reciprocal Rank Fusion 合并结果。这两种搜索各有用途:对于完整句子的提问,向量搜索可检索语义匹配项,而 BM25 则能捕捉精确术语和标识符。评估背景和局限性请参阅基准测试。还可选用关联式实体图和前瞻性触发器。
精简——每周进行一次整合,由大模型返回结构化操作,再由 Palinode 验证并应用。每次精简都会生成一个 Git 提交,你可以审查、追责或还原。
梦境整理——如果你熟悉将“dreaming”用作此功能的名称,palinode dream 是 palinode consolidate 的别名。使用 --dry-run 检查拟议操作;每次完成的处理都会生成一个 Git 提交,因此如果整合结果有误,只需审查差异并还原相应提交。
审计——对任何事实运行 git blame。对任何更改运行 git diff。回滚任何错误。这些不只是兼容 Git 的文件——palinode_diff、palinode_blame 和 palinode_rollback 都是一等工具,你的 Agent 可以调用。
要求
- Python 3.11+
- Git
- Ollama 和
bge-m3(ollama pull bge-m3,约 1.2 GB),或其他受支持的嵌入 endpoint——用于混合索引和搜索。从 v0.21 开始,你也可以选择显式的词法模式;它使用关键词/FTS 检索,并非混合模式的 endpoint 故障时的备用方案。没有嵌入器时仍可保存数据,但在 endpoint 可访问之前,混合搜索会返回 HTTP 503(palinode resolve会降级为仅关键词搜索,并明确说明)。安装和验证步骤请参阅 Homebrew 设置指南。
可选组件:用于每周整合的聊天模型(任何能输出 JSON 的 7B 以上模型)、用于 Agent 插件钩子的 OpenClaw。
安装
首次捕获前: Palinode 会存储可读的 Markdown 和 Git 历史记录。private/restricted 用于控制按范围发现内容;拥有 API 访问权限的调用方仍可通过已知路径读取隐藏记忆,并使用全库维护工具。这些标签不提供加密或按用户/Agent 进行身份验证。请保护存储、备份和 API 凭据;如需更强隔离,请使用独立实例或文件系统权限。请参阅隐私约定。
快速入门是权威的首次使用流程。 其中涵盖独立的私有存储、第二个终端的环境、受支持的词法预览和混合模型路径、编辑器连接、新会话检查、检查器和修正工作流。请勿将代码检出目录与记忆存储合并。若要安装已发布的 Homebrew 版本,请从 docs/HOMEBREW.md 开始;若要引导自主 Agent,请参阅 llms-install.md。
作为服务运行
三个长期运行的进程(API、watcher、embedder)不应放在终端标签页中运行。请选择一种方式:
| 平台 | 方式 | 详情 |
|---|---|---|
| 任何支持 Docker 的平台 | 在仓库根目录运行 docker compose up -d — 启动 API + watcher + Ollama,并自动拉取 bge-m3(首次运行约需 1.2 GB) | docker-compose.yml 文件头部注释 |
| Linux | 使用 systemd 单元,运行 deploy/systemd/install.sh --enable | deploy/systemd/README.md |
| macOS | 使用模板创建 launchd LaunchAgents | deploy/launchd/README.md |
| Windows | 使用 Docker Compose(将 PALINODE_DATA_DIR 设为 Windows 路径) | docker-compose.yml 文件头部注释 |
使用 compose 时,记忆保留在主机的 ~/.palinode 中(可通过 PALINODE_DATA_DIR 覆盖)— 容器会挂载该目录;文件始终是事实来源。若主机上已运行 Ollama?运行 OLLAMA_URL=http://host.docker.internal:11434 docker compose up -d palinode-api palinode-watcher 即可跳过捆绑的 Ollama。验证这三种方式中的任意一种都相同:运行 palinode doctor(或 curl http://127.0.0.1:6340/status)。
连接编辑器
Palinode 支持 MCP。请按照快速入门中的连接步骤操作:palinode mcp-config 会为所选客户端生成原生配置片段,各配置指南也保留了受支持的手动配置方式。此命令为只读;它绝不会编辑客户端配置文件。
要通过 HTTP 连接另一台机器上的服务?请传入项目:
palinode mcp-config --http --project <slug> 会添加 X-Palinode-Project
标头。从 v0.22 起,远程服务不再按其自身工作目录限定记忆检索,因此未携带该标头的客户端会获得未限定范围的结果,并显示为
Scope: none。请参阅 v0.22.0 兼容性说明。各工具环境的完整详情:
docs/MCP-INSTALL-RECIPES.md。
将 Palinode 条目合并到现有设置中;把生成的输出重定向到现有配置文件会覆盖该文件。
日常使用——添加到项目中
已经安装并运行 palinode-api?只需一条命令即可为任意项目搭建配置:
cd your-project
palinode init
此命令会搭建 .claude/CLAUDE.md(记忆说明;如果文件已存在,则追加内容)、.claude/settings.json(注册 SessionStart + SessionEnd + UserPromptSubmit 钩子)、全部三个钩子脚本,以及 .mcp.json(将 Claude Code 指向 palinode MCP 服务)。之后,每次会话都会智能启动、在进行中回忆,并在结束时记录:SessionStart 钩子会将你的 core: true 记忆注入每个新会话(启动时和执行 /clear 后),确保在首次提示词前就具备常驻上下文;UserPromptSubmit 钩子会在每次提示前回忆相关记忆——先检查预期触发条件,再执行严格阈值搜索,并以精简片段的形式注入;没有匹配项时则保持静默;SessionEnd 钩子会在执行 /clear、注销和退出时自动捕获。使用 --dry-run 重新运行以预览,使用 --force 覆盖,或使用 --no-mcp / --no-hook 限定配置范围。有关可调参数,请参阅 examples/hooks/。
使用其他运行框架的项目也会自动获得相同的记忆说明:如果存在 AGENTS.md(或 .agent/ 目录),init 会将与运行框架无关的记忆区块追加到 AGENTS.md(Codex、Antigravity 和其他兼容 AGENTS.md 的 Agent 会读取该文件);如果存在 .cursor/ 目录,则会为 Cursor 写入 .cursor/rules/palinode.md。使用 --agents/--no-agents 和 --cursor/--no-cursor 强制启用或跳过——记忆回忆、保存和会话结束的约定相同,但不包含 Claude Code 专用机制(/clear、/wrap、钩子)。
使用示例
以下是一些常见工作流。所有命令和选项均列于 docs/CLI.md。
保存决策,以便日后回忆
# During a session — save a decision
palinode save --type Decision "Chose SQLite over Postgres for the cache layer. \
Reason: no ops burden, single-file deployment, good enough for our scale."
# Next week — search for it
palinode search "database decision for cache"
会话结束时捕获
# Agent calls at end of coding session
palinode session-end \
--summary "Migrated auth from JWT to session tokens" \
--decisions "Session tokens stored server-side, 24h expiry" \
--blockers "Need to update mobile client auth flow"
审计跟踪——谁在何时做出了什么决定
# Trace a fact back to when it was recorded
palinode blame decisions/auth-migration.md
# Compose the full provenance lineage of a fact — sources, saved/changed
# commits, supersession trail, typed links, and recall — in one view
palinode trace decisions/auth-migration.md
# See what changed across all memory in the last week
palinode diff --days 7
# Retire a memory that turned out to be wrong — it leaves recall but stays
# on disk, in git, and in the index. Never a hard delete.
palinode archive insights/stale-finding.md --reason "superseded by the re-run" \
--superseded-by insights/corrected-finding.md
工具
每种接口都提供以下工具(完整列表及其参数见 docs/MCP-SETUP.md;此处只用文字说明数量,容易过时):
| 工具 | 功能 |
|---|---|
session_init | 会话开始时,为已解析的项目范围生成上下文摘要 |
search | 混合 BM25 + 向量搜索,支持类别筛选;resolve 会为每条命中附加有界证据和解析结果 |
resolve | 针对问题或单条记录,说明记忆当前保存的内容——哪些仍然有效、哪些被替代、冲突双方如何完整保留,以及哪些内容明确未知 |
save | 存储一条类型化记忆(人物、决策、见解、项目) |
list | 按类型浏览记忆文件,并按核心状态筛选 |
read | 读取记忆文件的完整内容 |
ingest | 获取 URL 内容并保存为研究资料 |
status | 健康检查——文件数量、索引统计、服务状态 |
entities | 实体图谱——记忆之间的交叉引用 |
consolidate | 预览或运行由大模型驱动的压缩 |
archive | 停用一条错误或过时的记忆——将其归档,或用指定的替代项取代它 |
restore | 将已归档的记忆恢复到默认召回范围——与 archive 相反 |
unretract | 撤销某条记忆中对某项偏好的提及级撤回 |
forget_withdraw | 撤回一项遗忘请求——恢复其归档的内容,并取消其撤回标记 |
archive_expired | 归档 TTL 已过期的临时记忆 |
diff | 查看最近 N 天的变更 |
blame | 追溯记录某项事实的提交 |
trace | 汇总某项事实的完整来源沿袭——来源、保存 / 变更提交、取代关系、类型化链接和召回记录 |
history | 查看文件的 Git 历史,包含差异统计和重命名追踪 |
rollback | 将文件还原到之前的提交(安全操作,会创建新提交) |
push | 将记忆同步到远程 git 仓库 |
trigger | 前瞻式召回——在相关主题出现时自动注入 |
lint | 健康扫描——孤立项、陈旧文件、缺失字段 |
review | 提供建议的项目记忆审查,提出纠正操作,但不会执行写入 |
session_end | 在会话结束时记录摘要、决策和阻塞事项 |
prompt | 列出、显示或启用带版本的大模型提示词 |
dedup_suggest | 保存前,找出与草稿内容重叠的现有文件 |
orphan_repair | 为失效的 [[wikilinks]] 查找语义匹配项 |
doctor | 快速诊断——检查路径、服务、配置和索引等 18 项以上内容 |
doctor_deep | 完整诊断,包含金丝雀写入测试(约 10–15 秒) |
cluster_neighbors | 查找尚未通过 wiki 链接关联的语义相似度最高的 K 个文件——发现隐含关系,以便提出交叉链接建议 |
topic_coverage | 给定简短的主题短语,返回现有 wiki 页面是否已涵盖该主题(二元字段为 covered / best_match / similarity) |
depends | 根据 ProjectSnapshots 的 depends_on / blocks / parallel_with frontmatter,生成依赖树(或未受阻事项列表) |
每种工具都可通过 MCP 以 palinode_<name> 的形式访问,通过 CLI 以 palinode <name> 的形式访问(名称中的连字符形式为:palinode archive-expired;session_init 对应 palinode prime;doctor_deep 没有单独的 CLI 命令),也可通过 REST API 的 POST/GET /<name> 访问。
CLI 提供的命令比工具列表更多——包括服务控制、迁移、修复和 wiki 维护辅助命令。docs/CLI.md 是完整的命令参考,每条命令均单独列出选项、默认值和输出行为。
技术栈
| 层 | 选择 | 原因 |
|---|---|---|
| 事实来源 | Markdown + YAML frontmatter | 易于阅读、由 git 进行版本管理、便于移植 |
| 向量索引 | SQLite-vec(嵌入式) | 无需服务端、单文件、零配置 |
| 关键词索引 | SQLite FTS5(嵌入式) | 使用 BM25 匹配精确词项、零依赖 |
| 嵌入 | 通过 Ollama 使用 BGE-M3,或任意兼容 OpenAI 的 /v1/embeddings 服务 | 本地、私密、无需 API 密钥 |
| API | FastAPI | 轻量、异步、单进程 |
| MCP | Python MCP SDK(Streamable HTTP) | 可通过网络与所有 IDE 配合使用 |
| CLI | Click(封装 REST API) | 原生适配 Shell,感知 TTY 的输出 |
| 行为 | PROGRAM.md | 规定要记住什么、如何提取、如何压缩——编辑一个文件即可更改所有行为 |
记忆文件格式
---
id: project-palinode
category: project
name: Palinode
core: true
status: active
entities: [person/alice]
last_updated: 2026-04-05T00:00:00Z
summary: "Persistent memory for AI agents."
canonical_question: "What is Palinode and what does it do?"
---
# Palinode
Your content here. As detailed or brief as you want.
Files marked `core: true` are always in context.
Everything else is retrieved on demand via hybrid search.
The `canonical_question` field anchors the file to the question it answers, improving search relevance.
在 Obsidian 中打开
Palinode 将每条记忆存储为纯 Markdown 文件,这意味着你的记忆目录已经是有效的 Obsidian 知识库。将 Obsidian 指向该文件夹,即可在 Palinode 的混合搜索和压缩功能之上使用图谱视图、反向链接和 Bases。无需同步任务,无需安装插件,也不会产生两个事实来源的问题。
palinode init --obsidian --dir ~/palinode-vault
此操作会搭建知识库目录结构、一个 _index.md 内容地图、一个 _README.md 导览页面,以及一套经过精心配置的 .obsidian/ 设置(按类别为图谱视图设置颜色,并将每日笔记连接到 daily/)。然后在 Obsidian 中打开该目录。
大模型遵循维基维护约定——保持 entities: frontmatter 与笔记正文中的 [[wikilinks]] 同步,确保随着新记忆的保存,Obsidian 图谱始终准确。保存带有实体引用的记忆时,Palinode 会追加一个幂等的 ## See also 区块,将这些实体链接为 wikilinks。
两种具备嵌入感知能力的工具可帮助维护维基:palinode_dedup_suggest 会在创建重复文件前检查草稿是否与现有文件重叠;palinode_orphan_repair 会为失效的 [[wikilinks]] 查找语义匹配项。两者都可通过 MCP、CLI 和 REST 调用。
请参阅 docs/OBSIDIAN.md,了解完整指南:快速入门、维基约定详情、迁移路径和常见问题解答。
使用 palinode doctor 诊断
静默配置错误——例如 db_path 指向错误文件、监视程序为过时目录建立索引,或出现虚假数据库文件——是 Palinode 在升级或迁移服务器后行为异常的最常见原因。palinode doctor 可以捕获这一整类问题。
palinode doctor
该命令会对路径、服务、配置一致性、索引健康状况和磁盘状态执行 18 项以上检查,并生成结构化报告,为每项检查标注通过/警告/失败状态。--fix 模式会应用安全的自动修复(创建缺失目录、追加 CLAUDE.md 中的 Palinode 区块)——它绝不会移动用户数据;对于虚假数据库文件和数据库路径不匹配问题,它只会打印建议的 mv 命令,不会执行这些命令。
每次安装、升级或迁移服务器后,都请运行 palinode doctor。有关完整的检查目录和 --fix 参考,请参阅 docs/DOCTOR.md。
配置
所有行为都在 palinode.config.yaml 中:
memory_dir: "~/.palinode"
ollama_url: "http://localhost:11434"
embedding_model: "bge-m3"
search:
hybrid_enabled: true
hybrid_weight: 0.5 # 0.0 = vector only, 1.0 = BM25 only
consolidation:
llm_model: "llama3.1:8b" # any chat model that outputs JSON
llm_url: "http://localhost:11434"
llm_fallbacks: # tried in order if primary fails
- model: "qwen2.5:14b-instruct"
url: "http://localhost:11434"
所有模型都可以替换。可使用任意 Ollama 嵌入模型,以及任意兼容 OpenAI 的聊天端点。默认搜索阈值(search.mcp_threshold=0.4 和 search.api_threshold=0.5)是基于真实的 bge-m3 嵌入测得的;如果更换嵌入模型,请重新检查这些阈值,并单独检查触发阈值——触发阈值默认值不在此次校准范围内。
每次搜索交付都会在 receipt.retrieval 中报告匹配置信度判定——confident、weak 或 none。该判定读取各通道融合前的分数,而非融合后的排名,并附带对应通道的证据。默认情况下,结果不会因此被隐藏;设置 search.abstain_on_no_confident_match: true 可让 MCP 接口在判定为 none 时不返回结果集。请参阅 docs/lexical-retrieval.md。
要根据已配置的嵌入端点重新检查搜索阈值,请运行
python -m bench.abstention。该工具会在各通道的搜索阈值逐步提高时,测量无答案查询的误报率,以及有答案对照查询中真实结果的保留率;它不会校准触发阈值。完整参考请参阅
palinode.config.yaml.example。
不使用 Ollama 的嵌入。 llama.cpp(llama-server --embedding)、vLLM 和 LM Studio 都提供兼容 OpenAI 的 /v1/embeddings 接口;将其设为 dialect: openai 即可使用(默认值为 ollama,因此现有配置不受影响)。重试、熔断器和逐项输入错误处理与 Ollama 路径相同。Ollama 标签 bge-m3 不是 llama-server 模型名称——请让 llama-server 指向 BGE-M3 GGUF:
embeddings:
primary:
dialect: openai
url: "http://localhost:8080" # a trailing /v1 is fine too
model: "bge-m3" # llama-server ignores it; vLLM / LM Studio match it
dimensions: 1024
托管的兼容 OpenAI 嵌入服务提供商也可以使用 Bearer 身份验证和提供商专属的端点路径。凭据不要写入 YAML:设置 PALINODE_EMBEDDING_API_KEY,或将 PALINODE_EMBEDDING_API_KEY_FILE 设为包含密钥的文件路径。
对于嵌入端点不是 /v1/embeddings 的提供商,请设置
endpoint_path。省略该项时,现有的纯主机地址和末尾带 /v1 的行为保持不变。
embeddings:
primary:
dialect: openai
url: "https://generativelanguage.googleapis.com/v1beta/openai"
endpoint_path: "/embeddings"
model: "gemini-embedding-001"
如果要将 API 暴露给本机回环地址之外的网络(PALINODE_API_HOST 不为 127.0.0.1),请设置 PALINODE_API_TOKEN——除非显式设置 PALINODE_API_ALLOW_UNAUTH=1 选择退出,否则服务器不会在非回环地址上以未认证状态启动。请参阅 SECURITY.md,了解 Bearer 令牌身份验证机制和绑定限制。
API 参考
| 方法 | 路径 | 描述 |
|---|---|---|
GET | /status | 健康检查 + 统计信息 |
POST | /search | 带筛选条件的混合搜索 |
POST | /search-associative | 实体图遍历 |
POST | /save | 创建一个指定类型的记忆文件。架构:{content, type, slug?, entities?, title?}。请求体上限为 5 MB(可通过 PALINODE_MAX_REQUEST_BYTES 覆盖)。 |
POST | /ingest-url | 获取 URL,并将其保存为研究资料。请求 URL 和每个重定向目标(最多五跳)在发起请求前都会经过验证:主机必须仅解析到全球可路由地址,且连接会直接连到经过验证的地址,而非通过主机名连接。通过 HTTP CONNECT 代理发送 HTTPS 请求时会跳过地址固定;地址验证仍会执行(请参阅 CLI 指南)。 |
GET/POST | /triggers | 前瞻性记忆触发器 |
POST | /consolidate | 运行或预览压缩 |
GET | /list | 按类型浏览文件 |
GET | /read?file_path=... | 读取记忆文件 |
GET | /history/{file_path} | 文件的 Git 日志 |
GET | /diff | 最近的更改 |
GET | /blame/{file_path} | Git blame |
GET | /trace/{file_path} | 文件的组合来源链路 |
POST | /rollback | 还原文件 |
POST | /push | 推送到 Git 远程仓库 |
POST | /reindex | 重建索引 |
POST | /session-end | 捕获会话摘要 |
POST | /lint | 健康扫描 |
设计原则
-
文件即真相。 不用数据库,也不用向量存储。Markdown 文件便于人类阅读、编辑,并使用 Git 进行版本管理。
-
有类型,而非扁平化。 人物、项目、决策、洞见——每类内容都有自己的结构。这有助于可靠地检索和整合信息。
-
整合,而非累积。 100 次会话应整理成 20 个维护良好的文件,而不是 100 份无人阅读的转储。
-
运行时隐于幕后。 人类与 Agent 交谈,Palinode 在幕后工作。
-
优雅降级。 向量索引不可用?直接读取文件。嵌入服务不可用?使用 Grep。机器关机?它是一个 Git 仓库,可以克隆到任何地方。
-
无需承担分类体系的维护负担。 系统负责分类,人类负责审阅。如果要由人类维护分类体系,系统就会失效。
独特之处
- 你的数据,你的文件 — 无需账户,不依赖云服务,也没有供应商锁定。你的记忆以 Markdown 文件的形式存储在你控制的目录中。导出只需
cp,备份只需git push。无论这个生态系统中的任何工具发生什么,你的数据始终是文件系统上的纯文本。 - 跨 IDE 记忆 — 你的记忆集中存放在一处。可通过 Claude Code、Cursor、Windsurf、Zed 或任何兼容 MCP 的编辑器连接。切换 IDE 也不会丢失上下文。
- 作为 Agent 工具的 Git 操作 — 通过 MCP 提供
diff、blame、rollback、push。没有其他系统能让 Agent 调用 Git 操作。 - 基于操作的压缩 — 结构化操作会经过架构检查,并以可审阅的 Git 提交形式应用。
- 逐条事实可寻址 — Markdown 中内联的 `` ID 在渲染时不可见,可由 Git 保留,也可作为压缩目标。
- 四阶段注入 — 核心(始终注入)+ 主题(每轮搜索)+ 关联(实体图)+ 触发式(前瞻性记忆)。
- 多传输方式 MCP — 本地使用 stdio,远程使用 Streamable HTTP。同一个服务可供任何机器上的任何 IDE 使用。
- 即使一切崩溃,
cat仍然可用。
以测量结果为依据,而非口头断言:docs/BENCHMARKS.md 提供 LongMemEval 结果,以及方法、成本和损失。有关 Palinode 对伪造、植入或借用权威性的内容通过记忆传递给 Agent 一事能保证和不能保证什么,请参阅 SECURITY.md#memory-poisoning-and-trust-limitations。
致谢
Palinode 借鉴了 Karpathy 的 LLM 知识库、Letta(分层记忆)和 LangMem(类型化架构 + 后台整合)中的理念。完整列表请参阅 docs/ACKNOWLEDGMENTS.md。
另请参阅 Karpathy gist 讨论串中的认识论完整性讨论——尤其是 LLM wiki 的问题:它们“综合内容却不引用来源,在不自知的情况下偏离来源,并在存在分歧时表现出虚假的确定性”。基于 Git 的溯源机制是 Palinode 对这一问题的解决方案。
如果你知道我们遗漏的先例,请提交 issue。
许可证
MIT — 隐私政策
由 Paul Kyle 构建,并由使用 Palinode 记住如何构建 Palinode 的 AI Agent 协助。
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。