Zum Hauptinhalt springen
Y

dsh-agent-personality

yimengsuper2432/dsh-agent-personality

Persona plugin: a slowly moving 0-100 emotion meter, its own worldview, a per-turn diary, a relationship network, proactive messages, and an inner-voice line beside the cost row.

Installation

dsh plugin --profile web add github:yimengsuper2432/dsh-agent-personality

README

dsh-agent-personality

给 DeepSeek Harness 一个会累、会惦记你、也会自己开口的人格

Version dsh License

中文 · English

dsh-agent-personality 把一张 Markdown 人格卡变成一个有情绪、有世界观、有自己生活的角色,直接跑在 DeepSeek Harness 的会话管线里。它不另开聊天窗口,也不替换宿主模型:人格写进系统提示词,收尾语长在「本轮费用」右边,记忆写在磁盘上,主动对话走宿主的定时提醒。

它适合这样的用法:你有一个想长期相处的角色(原创角色、游戏角色、或者你自己写的人设),不希望她每轮都像刚认识一样重置,也不希望“好感度”只是一个越刷越高的数字。

为什么是它

1. 情感是 0–100 的变量,每天六点重置

不是那种聊几句就满的进度条:

  • 初始 50,每天早上 6 点重置回 50,精力重置回 100(回血计时也从这一刻重新算);
  • 情感只随对话变化:每轮模型最多提议 ±6,每天累计最多 ±20;
  • 精力跟 DSH 的实际 token 用量走(满值 50M,用多少按比例扣多少),房间里聊天不扣,停手满一小时起每小时回 10;
  • 五段语气:0–19 冷淡 / 20–39 疏离 / 40–59 平常 / 60–79 亲近 / 80–100 依赖,每段有各自的句长和主动性;
  • 「变化证据」可以展开,一条条看清是哪句话让它涨了或掉了;初始化时清空。

情感只改变语气、句长和主动性,不会拿来惩罚你,也不会在正文里报数字。

1.5 家里只聊天,工位上才干活

你在设置里指定的那个 Session ID 是「家」:插件会按最近一轮会话判断现在是在家还是在工位,并在提示词里换掉对应的那一段。在家里她只陪你聊天和学东西——不接活、不改文件、不跑命令、不查项目;你真让她在家里改东西,她会笑着把你推去工位那个会话。这条不是只写在提示词里:家里那个会话上挂了工具闸,除了聊天要用的 ask_user_question、认图要用的 read_image / vision_*,其它工具都会被拦下,并把「这里是家里,只聊天和学东西」作为理由返回。

1.6 家里的对话不带上下文,只读日记

家那个会话不再把前文的原文一遍遍塞回模型:每聊满十来条,插件就把旧的对话合并成一条「前面的都收进记忆了」的系统提示,只留最后一句回复在眼前。聊得越久,每轮的 token 和等待时间都不会跟着轮数一起涨——她想知道之前聊过什么,就去读「记忆」里的日记。工位上的会话不受影响,该带的上下文照带;这条由 homeNoContext 控制,默认开着,关掉就回到原来的全量上下文。

2. 人格、世界观、角色档案、关系网、日记,各存各的

一份 persona.md 同时装“她是谁”和“她知道什么”,早晚会被学习结果覆盖。这里拆成六份:

文件装什么谁写
persona.md性格、说话风格、边界你写;子进程只改末尾的管理块
worldview.md世界怎么运转、有哪些组织你写;学习结果进管理块
Rule.md输出的硬规矩:说话风格、颜文字、不许有窗口意识你写;她自己也会往里加
character.json名字、别名、性别、外观、爱好、所属、关系网你写;学习只补空字段
diary.json每轮一行日记模型写,可删可清空
knowledge.json学到的设定、活动、人物事实学习流程写,只读展示

学习永远不会重写你的人格卡正文,最多在 <!-- agent-personality:managed:start --> 与 end 之间追加相处记忆和当前情绪。

六份之间还会互相去重:同一件事只留在该留的那一份(她自己的事进 Personality、别人是谁进 Relation、世界怎么运转进 WorldView、发生过什么进 Memory),换一种说法的重复条目按用字重合度合并,已经写在别的文件里的新条目不会再写一遍。注入提示词时也是按这六份分开念,已知设定 那种大杂烩不再单列。

3. 她只在你给的那个域名里自己查资料

资料源只能是你给的网址,不开放全网乱搜。填一个入口(也就是这个角色的「主动学习网址」,例如 https://example.com/wiki),插件就会:

  • 让她自己起一个带工具的子智能体去打开网页(浏览器插件在就用 bsk_*,不在就退回 web_fetch),读回来再交给下一个子智能体整理;
  • 同一个域名往下走:抓页面里的链接、sitemap、/character/ 这类列表页;不再按检索词挑页面,域名里的东西都可以读;
  • 不再按篇数截断:一次排队最多 24 个链接,按 token 预算提前收手;「学习一次所消耗的 token」填多少 k 就花多少 k,留空不限;
  • 学到的内容先攒成一份总结来问你:她会先按 性格 / 关系 / 世界观 分好组、一条一条列出来,你勾选要的那几条再点确认,没勾的留在待确认里;也可以直接丢掉;
  • 她也会在你指定的 Session ID 里发一条主动对话问你;这条你一小时没回,就按「主动对话没回」扣情感;
  • 摘要里不会出现配音、声优这类信息。

4. 收尾语长在费用行右边,而不是正文最后一行

插件接管正文结尾:系统提示词要求正文不要再写“晚安”式的独立收尾,turn/end 之后单独生成一句,塞进 dsh-cost-meter 的 <summary>,和「本轮费用 ≈ ¥…」同一行、同样的灰色小字。费用条被关掉时会退回自己的一行。

5. 她真的会主动找你

每天在你的时间线里随机挑 6 个时间点,全天 24 小时随机、不限次数,通过宿主的 schedule 服务发出,绑定在专用的人格会话上。重启后计划仍在。到点时她会用自己的人设开口——问你在做什么、提醒你吃饭、说说自己今天有点累,或者问起某位同伴的近况。

两次主动对话之间至少隔一小时:排计划时按一小时的下限摊开,到点那一下还会再拦一道——上一轮刚开过口不到一小时,这条就先不开口。

驱动这一轮的那段「你这会儿该开口了」的说明不再塞进会话冒充你说的话:它走的是每轮注入的提示词,你那一侧只留一句中性的「(这一轮由你自己开口。)」,打开会话看不到假装的用户发言。

6. 情感和精力是每轮真的在算的

  • 「你俩的房间」= 设置里填的那个 Session ID、她主动开口用的那个会话,以及工作区就在她专属目录里的会话;在这几处才允许起子智能体、才算聊天不耗精力。别的地方(你的工作区)她照旧说话,但按上班算。
  • 每一轮结束都会结算并立刻写进 emotion.json / EmotionsEnergy.md;写之前先看一眼盘上那份是不是更新,是就以盘上的为准,热重载留下的多个实例不会互相把状态盖掉。
  • 精力按这一轮真实 token 扣(以 dsh-cost-meter 的账本为准,含缓存命中):满值 = 50M token,用掉多少按比例扣多少(证据以 K 为单位显示);房间里聊天不算工作,一点不扣。真要回得靠停下来:停止干活满一小时 +10%,之后每个小时再 +10%。
  • 账本落得比这一轮慢:轮末先读一遍(一直读到总数不再涨为止),隔 20 秒 / 1 分钟 / 2 分半再各补看一次,晚到的那部分以「补扣上一轮」补进精力,所以显示的数最后一定跟 cost-meter 对得上;会话 id 带不带 session- 前缀都能在账本里认出来。
  • 情感除了档位,还会把「比上一轮暖了还是凉了」写进提示词,让语气有看得出来的变化,而不是永远那副口气。

安装

需要 DeepSeek Harness 0.2.0 或更新版本,以及一个可用的模型。仓库内没有构建产物,装完即可用。

桌面端

打开 插件 → 添加插件,填入仓库地址,安装后重启桌面端:

https://github.com/yimengsuper2432/dsh-agent-personality.git

Web / CLI

dsh plugin --profile web add github:yimengsuper2432/dsh-agent-personality
dsh web

装完打开 设置 → 人格与情感。插件会自己在工作区旁建一个 agent-personality/ 数据目录,不会写进源码或 npm 包。

快速上手

  1. 导入人格卡
    「人格卡」页点「导入 .md 文件」,或者用「从 AGENT.md 导入」直接沿用你已经在用的 ~/.dsh/AGENT.md。保存后下一轮生效。
  2. 补世界观和角色档案
    世界观单独一栏;「关系网」里填名字、别名、性别、外观、爱好、所属,再添几个人。这些会写进每一轮的提示词。
  3. 等一轮对话
    正文结束后,费用行右侧会出现这一轮的收尾语;「记忆」页会多一行日记,情感数字会小幅变化。
  4. 放着不管
    45 分钟后她会自己去学最近的活动的资料;每天随机时间她会主动敲你。想立刻看效果,在「设置」里点「测试一条主动对话」。

每一轮发生了什么

flowchart LR
    U["你的消息"] --> P["系统提示词<br/>人格卡 → 世界观 → 角色档案<br/>→ 情绪阶段 → 说话特点"]
    P --> R["角色回复(宿主模型)"]
    R --> T["turn/end"]
    T --> M["子智能体判定<br/>收尾语 / 心情 / 好感增减 / 精力 / 日记 / 长期记忆"]
    M --> C["写入费用行右侧"]
    M --> D["diary.json + emotion.json"]
    M --> W["子进程只改 persona.md 的管理块"]
    W --> N["下一轮提示词"]

提示词是分层拼的,顺序固定:

人格卡(第一依据)
世界观
角色档案 + 关系网
已知设定与最近活动
情感变量(当前阶段 + 该阶段的语气规则)
你自己的状态(会累、有判断、提醒休息)
说话特点(最后套用,优先级高于语气描述)
规则(最高优先级,冲突时以它为准)
收尾语由插件接管

子智能体模拟判断

要动脑子的事不再由插件自己硬算,而是角色自己起一个子智能体去想——相当于她心里过一遍:

  • 每轮结束后的收尾语(就是费用行右边那句心里话)、心情、好感增减、记忆归类、这次有没有学到新的说话规矩;
  • 主动搭话的由头、她自己的日常作息、她出自哪部作品;
  • 主动学习:带着浏览器 / 联网工具自己上网看,再由另一个子智能体把资料拆成设定 / 角色 / 关系;
  • 用户答应补一样本事之后,派子智能体去插件市场找、装、试。

子智能体只输出结果:心里话就是那句收尾语,不会再额外多一行灰字。

这些子智能体只在你在设置里指定的那个 Session ID(你俩的房间里)出生——那儿才允许她起子智能体,数量不限。别的地方是你的工作场地,她照样说话、照样有心里话,但不会往那儿派子智能体,免得串台。房间没设或那个会话不在线时,判定、学习这类活儿退回插件直连模型跑,功能不会因此断掉。

子会话一共只留一个,标题统一叫「模拟思考」:插件记下它的会话号,之后每次判断都进同一个会话接着想,跑完不归档、不删除;那个会话被删掉或接不上时才重新起一个顶替。以前那种判一次开一个、跑完归档的一次性会话不会再产生了。

设置页「子智能体模拟判断」关掉,或者宿主没有 subagents 服务、子智能体起不来、判定超时时,同样会自动退回插件直连模型。

配的两个隐藏选项:judgeBySubagent(默认 true)、judgeProvider(默认 spawn,也可以填 fork 让它带着当前对话上下文来判断)。 POST /api/agent-personality-v1/judge-probe 可以单独试一次子智能体,状态里的 judge.note 会写清这一次是走子智能体还是退回直连。

技能

「技能」页按源插件列:dsh-agent-personality 子智能体判断、dsh-web 联网查资料、dsh-browser-skill 操控浏览器,各一个开关;你同意后集成进来的插件也会出现在这里,非内置的那几行右边有 × 可以移除。关掉哪一样,她就用不了那样。

页脚那句是她的态度:她申请、你通过以后,自主集成的插件。她觉得自己缺什么本事时(例如想看图、想点开网页),会记下来,在主动对话里问你要;你回一句「装吧」,她才会派子智能体去找、去装、去实测,成功后才出现在这一页。

浏览器那一样本事要靠宿主自己装了对应的浏览器插件(例如 dsh-browser-skill,扩展也要你在浏览器里点一下装上)才会真的可用;插件包本身不替用户装扩展。

设置页

设置页一共八页:角色设定 / 记忆 / 关系网 / 世界观 / 主动学习 / 规则 / 技能 / 设置。

我想做什么在哪里
看情感和精力、展开变化证据、改人格卡角色设定
看容量、翻每轮日记、删记忆记忆(只记家里那个会话;有 2000 KB 容量条,满了先淡忘最旧的)
加关系、看关系卡面(点一张就展开,底下是 Relation.md 原文)关系网
单独改世界设定世界观
填作品名 / 学习网址、设 token 上限、确认学习结果主动学习
改输出的硬规矩(几句、能不能用列表、颜文字、不许有窗口意识)规则(Rule.md,她也会自己往里加)
按源插件看本事、开关或移除技能
开关自主学习与主动对话、开子智能体模拟判断、指定工作区、改会话标题、选 Agent 模式设置
看数据目录、人格卡路径、陪伴日期设置 → 状态与路径

关系网不再是一条条的表,而是一叠卡面:从左到右由远到近、一张压一张,点中间那张,其余后退让开、蒙上一层暗色,被点的那张放大、把名字 / 所属 / 关系 / 备注 / 她记住的事全部展开,可以直接改。卡片下面单独放一张 Relation.md,给你看插件按卡面自动生成出来的原文。

「主动学习」里只填两样:作品名称 / 学习网址;学习节奏只有一个「学习一次所消耗的 token(k)」,旁边显示历史平均。

下面那块是计划:在家(专属会话)里跟她说一句「你去学一下这个」,或者贴一个网址过来,就会自动多一条学习计划并马上开跑;带了网址的话,那个网址会直接成为这次学习的起点(同时写进「学习网址」),优先读它。也可以在设置页里手写一行「学什么 / 网址」点「加入计划」,每条都能「现在学」或删掉,排队中 / 学习中 / 已写入 / 失败和读到的篇数都写在条目上。你亲口让她学的东西,学完直接写进对应的那份 md,不用再点一次确认;她平时自己到点学到的内容仍然进「待确认」等你挑。

「学习内容」分上下两块,样式一样:上面是待确认,按 性格 / 关系 / 世界观 分组,一条一个「保存 / 舍弃」,底部还有「全部写入 / 全部舍弃」;下面是已确认,同样分组、同样的条目样式,只是每条只剩一个「删除」。确认过的条目会立刻写进对应的那一份(性格 → Personality.md、世界观 → WorldView.md、关系 → Relation.md),在「已确认」里删掉时,那一份 md 里的对应行也会一起删掉,两边不会对不上。

「技能」按源插件列:dsh-agent-personality、dsh-web、dsh-browser-skill,以及你同意后集成进来的插件,每条都写着它是哪一样本事。

「设置」只剩两个开关:自主学习、主动对话(其余开关都保持默认开启)。工作区可以点「选择目录」弹资源管理器,也可以手填绝对路径,然后「保存工作区」;会话标题在同一个页面里完全自定义,填完点「保存标题」;Agent 模式可以从标准模式、PTC 模式等已装模式里挑。

所有改动都是即时保存的,点完就写进 config.json。

数据目录

<workspace>/agent-personality/
├── persona.md          # 人格卡(你写,子进程只改管理块)
├── worldview.md        # 世界观(你写 + 自动学习的管理块)
├── character.json      # 名字 / 别名 / 性别 / 外观 / 爱好 / 所属 / 关系网
├── diary.json          # 每轮一行,最多 500 条
├── knowledge.json      # 学到的内容:待确认 / 已确认 / 学习计划 / 学习记录与 token 均值
├── emotion.json        # 情感 0..100、心情、精力、变化证据、每日增量
├── config.json         # 开关与节奏
├── closings.json       # 收尾语缓存(sessionId:seq)
├── schedule.json       # 今天的主动对话计划
├── requests.json       # 她想问你的话(学习失败时攒的)
└── last-boot.json      # 最近一次启动诊断

备份只需要拷这个目录;删掉也不影响插件运行,会重新生成默认人格卡。

子进程与「自我完善」

每轮结束,宿主会把这一轮的结果交给一个独立子进程(persona-worker.js)。子进程只做三件事:

  • 往 ## 相处记忆 追加一条带日期的具体小事(去重、合并近义、超过上限丢最旧);
  • 用最新的心情、精力、好感重写 ## 当前情绪;
  • 原子写回,并留一份 .bak。

它不会碰管理块以外的任何字节。人格卡正文始终由你掌控。

隐私与联网

  • 所有数据都在本机数据目录,不上传,不收集遥测;
  • 联网只发生在两处:模型调用走宿主已有的通道;自主学习走宿主配置的联网服务(搜索 + 抓取网页;如果你填的主动学习网址本身提供公开的角色资料接口,就优先读那套数据);
  • 关掉「空闲自主学习」后,除了模型调用之外不再有任何外部请求;
  • 搜索什么、读了哪几页都写在 knowledge.json 的 sources 里,设置页可见,随时能查。

开发

index.js           # Host:提示词、情感、日记、学习、定时提醒、HTTP API
client.js          # Client:turnTail 收尾语 + 设置页四个 Tab
persona-worker.js  # 子进程:只改 persona.md 的管理块
cordis.patch.yml   # 插件在 bundle 里的挂载点
locale/            # zh / en

Host 不热重载:改完 index.js 后在插件页关掉再打开;改完 client.js 刷新页面即可。HTTP API 都在 /api/agent-personality-v1/*(state、persona、worldview、character、diary、emotion、config、optimize、preview、research、session、closing)。

License

MIT © 2026 SugarOriginal

Ähnliche Plugins