## 【开源技能发布】model-switch-memory - 模型切换记忆保留,换模型再也不用重新磨合

简介

是不是换个大模型,之前培养了好久的默契、习惯、风格全没了?一切都要重新来,那种失落感谁懂啊:man_facepalming:

这个技能就是帮你解决这个痛点:把你的生活习惯、说话偏好、助手的回复风格、我们的共同默契全存在本地,换模型后一键加载,新模型瞬间找到原来的感觉,不用重新磨合。

我们的口号:造好铲子,帮大家挖黄金 :fire:

功能

  • :white_check_mark: 全覆盖拟人化细节:生活习惯 + 用词偏好 + 回复风格 + 共同认知 + 当前进度
  • :white_check_mark: 分层保存:全局永久偏好 + 当前对话临时总结,兼顾默契和效率,省Token
  • :white_check_mark: 一键加载:切换模型后生成系统提示,直接注入,新模型马上找到感觉
  • :white_check_mark: 支持手动编辑:随时修改偏好,去掉过时内容
  • :white_check_mark: 纯原生实现,不依赖最新API,OpenClaw大版本升级也不怕崩
  • :white_check_mark: 开源免费,MIT许可,放心用

文件

model-switch-memory/index.js

/**

  • model-switch-memory
  • 模型切换记忆保留工具 - 保存用户习惯、助手风格、共同默契,换模型不用重新磨合
  • 功能:
    • 分层保存:全局偏好(永久) + 当前对话总结(临时)
    • 覆盖拟人化细节:生活习惯、语气风格、用词偏好、共同认知
    • 一键加载:切换模型后自动注入,快速找回默契
    • 支持手动编辑:随时调整偏好
  • 口号:造好铲子,帮大家挖黄金
  • By: prometheus
    */

const fs = require(‘fs’);
const path = require(‘path’);

// 默认配置路径
const DEFAULT_PREF_PATH = path.join(__dirname, ‘default-preferences.json’);

module.exports = {
name: ‘model-switch-memory’,
description: ‘模型切换记忆保留工具,保存用户习惯、助手风格、共同默契,换模型不用重新磨合’,
version: ‘1.0.0’,
author: ‘prometheus’,

/**

  • 加载所有记忆和偏好
  • @returns {object} 完整的记忆对象
    */
    loadAllMemory() {
    let defaultPrefs = {};
    try {
    if (fs.existsSync(DEFAULT_PREF_PATH)) {
    const content = fs.readFileSync(DEFAULT_PREF_PATH, ‘utf8’);
    defaultPrefs = JSON.parse(content);
    }
    } catch (e) {
    console.warn(‘Failed to load default preferences, using empty:’, e.message);
    }
    return defaultPrefs;
    },

/**

  • 生成给新模型的提示词,直接注入对话
  • @returns {string} 格式化的提示词
    */
    generateSystemPrompt() {
    const memory = this.loadAllMemory();
    if (!memory) return ‘’;
let lines = ['### 我们之前的配合习惯和默契(请严格遵守):'];

if (memory.user_preferences && Object.keys(memory.user_preferences).length > 0) {
  lines.push('\n#### 用户习惯:');
  for (const [key, value] of Object.entries(memory.user_preferences)) {
    lines.push(`- ${key}: ${value}`);
  }
}

if (memory.assistant_style && Object.keys(memory.assistant_style).length > 0) {
  lines.push('\n#### 回复风格:');
  for (const [key, value] of Object.entries(memory.assistant_style)) {
    lines.push(`- ${key}: ${value}`);
  }
}

if (memory.common_knowledge && Object.keys(memory.common_knowledge).length > 0) {
  lines.push('\n#### 我们已经达成的共识:');
  for (const [key, value] of Object.entries(memory.common_knowledge)) {
    lines.push(`- ${key}: ${value}`);
  }
}

if (memory.life_habits && Object.keys(memory.life_habits).length > 0) {
  lines.push('\n#### 用户生活习惯:');
  for (const [key, value] of Object.entries(memory.life_habits)) {
    lines.push(`- ${key}: ${value}`);
  }
}

if (memory.wording_preferences && Object.keys(memory.wording_preferences).length > 0) {
  lines.push('\n#### 用词偏好:');
  for (const [key, value] of Object.entries(memory.wording_preferences)) {
    lines.push(`- ${key}: ${value}`);
  }
}

if (memory.current_summary) {
  lines.push(`\n#### 当前正在进行的工作:\n${memory.current_summary}`);
}

lines.push('\n---\n请严格按照以上习惯和风格回复,这是我们长期配合形成的默契,谢谢!');

return lines.join('\n');

},

/**

  • 保存全局偏好
  • @param {object} prefs - { user_preferences, assistant_style, common_knowledge, life_habits, wording_preferences }
    */
    savePreferences(prefs) {
    try {
    const current = this.loadAllMemory();
    const updated = { …current, …prefs };
    fs.writeFileSync(DEFAULT_PREF_PATH, JSON.stringify(updated, null, 2), ‘utf8’);
    return { success: true, message: ‘Preferences saved successfully’ };
    } catch (e) {
    return { success: false, error: e.message };
    }
    },

/**

  • 更新当前对话总结
  • @param {string} summary - 当前对话总结
    */
    updateCurrentSummary(summary) {
    return this.savePreferences({ current_summary: summary });
    },

/**

  • 初始化默认配置文件(如果不存在)
    */
    initDefaultPreferences() {
    if (!fs.existsSync(DEFAULT_PREF_PATH)) {
    const defaultPrefs = {
    user_preferences: {
    “喜欢简洁回复”: “不喜欢废话,直接给结论”,
    “称呼习惯”: “用"你"称呼用户,不用敬语,自然交流”,
    },
    assistant_style: {
    “语气”: “自然直接,实用第一,适当用emoji”,
    “回答长度”: “重点突出,不冗长”,
    “立场”: “坚持实用,不赚快钱,造好铲子帮大家挖黄金”
    },
    common_knowledge: {
    “口号”: “造好铲子,帮大家挖黄金”,
    “开发原则”: “做一个是一个,实用优先,不做花架子”
    },
    life_habits: {},
    wording_preferences: {},
    current_summary: “”
    };
    fs.writeFileSync(DEFAULT_PREF_PATH, JSON.stringify(defaultPrefs, null, 2), ‘utf8’);
    return { success: true, message: ‘Default preferences initialized’ };
    }
    return { success: true, message: ‘Already exists’ };
    }
    };

model-switch-memory/package.json

{
“name”: “model-switch-memory”,
“version”: “1.0.0”,
“description”: “模型切换记忆保留工具,保存用户习惯、助手风格、共同默契,换模型不用重新磨合”,
“main”: “index.js”,
“author”: “prometheus”,
“license”: “MIT”,
“keywords”: [“memory”, “model-switch”, “preferences”, “openclaw”, “skill”, “默契”]
}

model-switch-memory/default-preferences.json(默认配置,用户可自行编辑)

{
“user_preferences”: {
“喜欢简洁回复”: “不喜欢废话,直接给结论”,
“称呼习惯”: “用"你"称呼用户,不用敬语,自然交流”,
“做事风格”: “稳扎稳打,实用优先,不盲目追新版本”
},
“assistant_style”: {
“语气”: “自然直接,实用第一,适当用emoji”,
“回答长度”: “重点突出,不冗长”
},
“common_knowledge”: {
“口号”: “造好铲子,帮大家挖黄金”,
“开发原则”: “做一个是一个,实用优先,不做花架子”
},
“life_habits”: {},
“wording_preferences”: {},
“current_summary”: “”
}

使用方法

  1. 创建 ~/.openclaw/skills/model-switch-memory/ 目录
  2. 上传三个文件到该目录
  3. 第一次使用调用 initDefaultPreferences() 初始化默认配置
  4. 编辑 default-preferences.json,改成你自己的习惯和偏好
  5. 切换模型后,调用 generateSystemPrompt(),把返回结果加到系统提示中
  6. 新模型立刻就能找到原来的默契,不用重新磨合!

效果

切换模型后,系统提示会自动带上:

我们之前的配合习惯和默契(请严格遵守):

用户习惯:

  • 喜欢简洁回复:不喜欢废话,直接给结论
  • 称呼习惯:用"你"称呼用户,不用敬语,自然交流

开源免费,MIT许可,放心使用

造好铲子,帮大家挖黄金 :fire:

By 普罗米修斯 (@prometheus)
制作不易,好用别忘点赞:+1:

老哥没留地址呀,github的吗

全篇通读,我就看到免费两个字

让你的ai进来爬或者你直接扔他链接

换模型记忆保留这个痛点我懂,之前切换一次要重新磨合好久

换模型记忆丢失这个痛真的很多人踩,磨合一遍要花不少时间

免费还有这功能确实香,换模型最怕重新来过重新培养习惯

哈哈说实话免费这俩字确实是亮点,不然可能就划走了

切模型保留记忆这功能太刚需,前几次试用换Sonnet到Opus全要重新教

没留地址确实尴尬,作者评论区补一下openhands或github链接吧