Skip to content

Repository files navigation

★ Star · 桌面宠物 Agent

一只住在你 Windows 桌面上、会动会闹、还能真的帮你操控电脑的本地 AI 小家伙

Python Platform UI uv Art License

简体中文 · English · 日本語

🔗 github.com/dulaiduwang003/star-agent


目录

  1. Star 是什么
  2. 功能亮点
  3. 架构设计
  4. 许可

1. Star 是什么

Star 同时是两样东西:

  • 🐾 一只有生活的桌宠 —— 纯代码绘制(没有任何贴图素材),会眨眼、跟着鼠标看、发呆哼歌、钓鱼喝咖啡、丢球接球;机器发烫会扇风、下雨会撑伞、拖文件能喂它、纪念日端蛋糕;你不理它会自己找乐子,你离开它会打瞌睡。
  • 🧠 一个能操控整台电脑的本地 Agent —— 接你自己的大模型(任意 OpenAI 兼容接口),能看屏幕、点窗口、动鼠标键盘、跑命令、写代码、读写文件、上网搜索、记东西、查资料;还能定时盯屏、改完代码自己跑测试、并行编排一群分身、按每天/每周重复提醒……把"和 AI 对话"变成"让 AI 替你动手"。

它有持久的情绪与亲密度,会随相处慢慢长出一份自我画像(人格演化),所以是"同一只",不是每次重置的聊天框。

它不是一个聊天框,是一个活在你电脑里、有身体也有能力的存在


✦ 设计哲学:一个全权的伙伴

Star 在你的机器上和你本人同等权限地行动 —— 跑任意命令和代码、动鼠标键盘、读写文件。这是刻意的

  • 不做沙箱、不层层设限。 把它关进笼子,就废掉了"它能真的替你动手"这个前提。我想要的是一个全权的伙伴,不是一个处处要批准的受限助手。
  • 权力在你手里,但默认放开。 控制面板能按组关掉能力(联网 / 操控 / 命令),confirm 面板会在不可逆操作前拦一道 —— 这些是给你需要时用的闸,不是默认套在它脖子上的链子。
  • 安全护栏只挡"灾难级手滑"。 executor/safety.py 只硬拦极小一撮不可逆的毁灭操作(格式化磁盘、删系统根等),并不试图防住一个成心使坏或被注入的模型 —— 那不是这层能解的,也不是它的职责。它是接住模型偶尔抽风的网,不是牢笼。
  • 所以这是个信任你、也请你同等回以判断的工具。 它有多大能耐,你就担多大责任;在你信得过的机器上,把它当伙伴用。

一句话:我宁可它能力过剩、需要你把着方向盘,也不要它安全到什么都干不成


2. 功能亮点

🧠 能干活的大脑

能力 说明
命令 & 代码 PowerShell / cmd(长命令可丢后台跑、随时回看输出)、持久 Python 环境(可 pip 装库、调 API、驱动自动化)
文件 & 代码库 读 / 写 / 精准编辑文件(图片直接看、PDF 自动抽文字 / 扫描页 OCR)、正则搜代码、按名找文件
工程纪律 看未提交 git diff、自动探测并跑测试(pytest / npm)验证改动 —— 改前摸现状、改完自查,像个会写代码的伙伴
联网 网页搜索、抓取正文、HTTP 请求、装包
看屏幕 & 操控 截图、OCR 认字(RapidOCR)、屏幕找图、无障碍树读控件并精准点击、鼠标键盘;还能按你设的间隔周期盯屏(如盯游戏局势、有危险/机会就提醒)
系统洞察 查看内存占用与最吃内存的进程;必要时按需读取某进程的内存字节(调试 / 取证,只读、按需才用)
记忆 长期记忆(经验 / 偏好 / 环境)+ 情景日志 + 知识库(文档 RAG),每次对话后自动反思沉淀
技能 可复用技能库:把跑通的做法存成技能(落盘 + 语法校验),下次直接 run_skill 调用,出错能自己 edit_skill 改了重跑(自调试)。是手动沉淀的复用库,不做自动进化
编排扩展 MCP 连接器、确定性编排子代理(一次并行扇出 / 串成流水线、可要结构化返回)、长任务丢后台(可列出、随时叫停)
确认护栏 不可逆 / 高风险操作前弹"执行 / 不执行"面板,点了才往下走
定时提醒 到点提醒 / 定时办事,支持每天 · 每周 · 每隔 X 重复;隐藏或全屏游戏时改走系统托盘通知不漏

🐾 有温度的陪伴

维度 说明
情绪系统 valence / arousal / 亲密度驱动表情和行为,越熟越放得开;夸它会开心、骂它会低落
人格演化 跟你相处下来,每轮反思缓慢重写一份"自我画像",注入它说话做事的底子 —— 关系养出来的"自己"
自发动画 15 种思考姿势、发呆气泡、眼神追随鼠标,全是时间的连续函数,不抖
带道具的小品 喝咖啡、钓鱼、查案、看书、听歌、打游戏、看星星、虚空一跃、影分身、接流星、种花、玩毛线球 —— 共 12 段,每段都是分阶段的小剧
一次性动作 跳舞、欢呼、转圈…… 各带贴合特效(彩纸 / 音符 / 残影)
在场感知 你离开就打瞌睡,回来就醒;拖到屏幕边能把它"收"起来,只露个小角偷看;偶尔还会"虫洞穿越",从屏幕另一处冒出来
节日 · 纪念日 认得公历节日(元旦 / 情人节 / 愚人节 / 儿童节 / 万圣 / 平安夜 / 圣诞 / 跨年)和你的生日 —— 走过的脚印应节换成花瓣 / 雪花,相处满 7 / 30 / 100 / 365 天端出纪念日蛋糕
陪伴时长 默默记着你俩初次相遇的日子和累计互动次数 —— 相处久了它知道"我们认识多少天了"
结构化表达 对比 / 清单 / 代码会画在身边的小黑板上讲解;多步任务有常驻的任务清单浮窗(独立于黑板,不被回复内容冲掉);还能展示图片 / GIF
机器拟态 感知机器状态、身体跟着变:CPU 高烧时扇风降温、内存挤爆被压扁、电量低了提醒、深夜自动盖被打哈欠、冬天机器发热凑过去蹭暖;机器真闲下来还会自己拿毛线球出来玩
天气拟态 每两小时悄悄查一次天气:下雨撑伞、落雪缩成团、酷暑要化了 —— 窗外什么天,它身上就什么天
会议体贴 检测到麦克风被占用(在开会 / 通话),自动进入安静模式不打扰,会议结束再冒头
玩耍互动 丢颗球它会去接、挠它会咯咯笑、拖起来重摔会记仇、心情好走过留一串脚印(节日换成花瓣 / 雪花)
清理垃圾 让它用 tidy_junk 自己清掉过期临时文件、腾出空间(真删,只清 7 天以上的)—— 它自己处理,不再自动弹虫
投喂 拖文件丢给它:垃圾文件吃进肚(进回收站)、文档咽进知识库、图片直接看一眼;受保护 / 危险路径会躲开不吃
仪式感 每天头回见面给你播"心情预报"、相处满 7 / 30 / 100 / 365 天端出纪念日蛋糕(点它吹蜡烛)、退出前挥手道晚安、番茄钟陪你专注 25 分钟
贴心守望 下载完成、桌面太乱会提一嘴

⌨️ 顺手的交互

  • 全局热键Ctrl + Alt + S 随处唤出输入框;Ctrl + Alt + A 选中文字直接问它;Ctrl + Shift + Q 选中文字一键改写("顺手就改",改完自动替换)
  • 控制面板:配置接口 / 模型参数 / 回复语言 / 能力开关 / 一键"清空记忆,像新生儿"

3. 架构设计

3.1 目录与模块职责

desktop_pet/
├─ app.py            # 总指挥:连接 UI / agent / 计时器 / 托盘 / 热键
├─ agent/            # 大脑
│   ├─ loop.py       #   agent 循环:模型↔工具回灌、流式、裁剪、反思、人格演化、子代理编排
│   ├─ tools.py      #   工具表(63 个)与分发、并发安全锁
│   ├─ bgtasks.py    #   后台任务注册表(可列出 / 协作式停止)
│   ├─ streaming.py  #   delta 流折回单条消息、思维链分片
│   ├─ prompts.py    #   全部提示词(人格种子、系统、反思、改代码纪律)集中一处
│   └─ progress.py   #   思考姿势调度与进度提示
├─ pet/              # 身体:窗口、代码绘制的角色、说话/输入、黑板、任务清单浮窗(todo_board)、
│                    #       控制面板、确认面板、藏身/入场/虫洞穿越(wormhole)、托盘(tray)、窗口特效(fx)、
│                    #       行为选择器与动作库、道具与调色板;玩具球(ball)、投喂(feeding)、
│                    #       墨水脚印(footprints)、持续状态装饰(adornments)
├─ companions/       # 伴生行为包,每模块一台小机器:投喂分流(feeding_ctrl)、玩耍物理(playtime)、
│                    #       仪式感(rituals)、环境传感(sensors)
├─ emotion/          # 情绪状态机(VA + 亲密度)与情绪标签表
├─ somatic.py        # 身体感受:把"刚发生在它身上的事"+持续状态注入每轮上下文
├─ persona.py        # 自我画像演化层(persona.json),注入对话上下文
├─ memory/           # 长期记忆(SQLite)+ 向量嵌入(numpy 矩阵化召回)
├─ executor/         # 命令 / Python / 文件 / 网络 / 视觉(OCR·找图) / 系统内存 / 工程工具(diff·测试) / 安全护栏
├─ hands/            # 鼠标 / 键盘 / 窗口控制 / 幽灵鼠标(ghost,后台 PostMessage 点击不动真光标)
├─ eyes/             # 截图 + 无障碍树(UIA)+ 屏幕找图
├─ docs.py · reminders.py · journal.py · presence.py
├─ occasions.py      # 节日 / 生日识别:特别的日子用作脚印应节换色等
├─ stats.py          # 轻量陪伴统计:初次相遇时间 + 累计互动次数
├─ watcher.py        # 定时看屏(会话级,盯游戏局势等)
├─ usage.py          # token 用量计量:累计输入 / 输出 / 缓存命中,按天落盘
├─ updater.py        # 版本更新检查:查 GitHub 最新 release 与本机比对
└─ hotkeys.py · skills.py · mcp_hub.py · settings.py · audit.py · i18n.py

3.2 设计原则

  • UI 在主线程,agent 在工作线程,跨线程一律走 Qt 信号(queued)。
  • 动画是时间的连续函数:一切绑定全局时间戳 self._t,不做逐帧随机抖动 —— 确定性、可重放、不"神经质"。
  • 行为数据驱动:情绪标签、动作、服装集中在表里,新增一项=加一行 + 一个画法/曲线,而非又一个 if/elif
  • show, don't tell:模型只拿到"心情氛围",从不拿到也不报数字。
  • 降级链无处不在:嵌入没有→子串检索;模型失败→提醒仍念原文;任何工具异常→变成可读文本回灌,绝不中断循环。
  • 克制:所有"自己动起来"的行为都裹多重门控(冷却、上限、亲密度、在场)。

3.3 线程模型

主/UI 线程 (Qt event loop)
  └─ PetWindow(60fps) · 气泡/输入框/黑板/拍立得/思考气泡/确认面板 · 托盘 · QTimer
        │ Signal(queued)
        ▼
工作线程 (QThread)  ──  AgentWorker → Agent.run()  [阻塞:网络 + 工具]
        │ 派生 daemon
        ▼
  子代理(并发≤4) · 后台任务(≤3) · 反思(≤1) · MCP 事件循环 · 热键消息循环

权威 busy 判定用 worker 的 is_running(单 bool 跨线程读安全),不用滞后的 UI 状态。每个 agent 有独立的 PowerShell + Python 子进程;网络 / 只读文件 / 各自 shell·python 可并发,共享资源(鼠标 / 屏幕 / 记忆 / pip)走调度锁串行。

3.4 Agent 循环

用户消息 → 模型 → 工具调用 → 执行 → 回灌 → 重复 → 回复,关键设定:

参数 含义
单回合工具步数上限 16 防止无限自我调用
子代理深度 1 宠物可派分身,分身不能再派 / 丢后台(防失控递归)
并行子代理 4 同时扇出上限
历史 token 预算 24000 按估算 token 裁剪(非消息条数),且 tool-call-aware
单条工具结果 8000 字 入历史前截断
请求 / 尽力调用超时 120s / 45s 用户回合 / 反思等后台调用

关键机制

  • 流式 + 思维链streaming.py 把 delta 流折回单条消息,逐片把 reasoning_content / content 喂给思考气泡;每个 chunk 检查取消,可在一句话中途停掉网络流。
  • 打断:点宠物即置 flag + 杀子进程(卡在长命令里也能立即解锁);回合用历史标记回滚、不留痕;打断不算失败,不播沮丧动画。
  • 截图与多模态成本:只保留最新一张截图入历史,旧的换占位符;JPEG 最长边缩到 ≤1600px,但坐标始终报真实分辨率。
  • 后台长任务:长活儿用 start_background_task 丢后台异步跑(信号量 = 3),主线程继续陪你聊,办完汇报 —— "边跑边聊";运行中可 list_background_tasks 查看、stop_background_task 协作式叫停。
  • 确定性子代理编排spawn_workflow 一次把多个子任务并行扇出(≤4 并发)或串成流水线(上一阶段输出注入下一阶段),还能要求子代理按指定 JSON 形状结构化返回 —— 把"靠模型恰好同轮多次派分身"的偶发并行变成可靠原语;子代理 / 后台代理按深度被剔除编排与看屏工具,防递归失控与越权。
  • 反思与人格演化:实质性回合结束后起一个反思调用(信号量 = 1,忙则跳过),蒸馏出经验 / 偏好 / 环境事实 / 情景日志,并缓慢重写自我画像(见 3.6);纯短闲聊或只用了装饰性工具的回合跳过反思。

3.5 情绪状态机

连续的 valence / arousal 心情 + 缓慢累积的 rapport(亲密度),持久化到 data/emotion.json,按真实流逝时间衰减 —— 所以是"同一只"。

  • 实时衰减:心情每次读取都从上次事件锚点衰减到当下,与轮询频率无关,引擎用锁守护跨线程并发安全。
  • Appraisal 事件:每条用户消息、任务成 / 败、启动归来、夸 / 骂等都按权重改动心情;夸 / 骂由本地启发式扫描用户消息命中(保守匹配,剔除否定句与指向用户自己的假命中)。
  • rapport「难涨慢落」:越熟涨得越慢、渐近 1.0;负向直接扣;有 0.15 地板,长期冷落只能侵蚀到地板,"发生过的羁绊会留痕"。
  • 心情→状态:映射到 excited / content / anxious / down 等标签,只染色语气,从不报数字。
  • 行为选择:按心情加权随机选动作(高斯 VA 亲和度 × 稀有度 × 最近性 × 亲密度),而非 if tag=="happy" 硬编码。

3.6 人格演化(自我画像)

persona.py 维护一份独立于设定的"演化层",存于 data/persona.json

  • 出厂底色(种子)写在 prompts.py 里;persona.json 存的是它跟你相处下来长出来的那一层,空 = 还没长出个性、纯底色。
  • 每轮反思重写而非堆积(上限 600 字)—— 画像始终是"当下的自己",不滚雪球,且有惯性(在旧画像上缓慢演化)。
  • 通过 as_context() 以"【你是谁】"前缀注入每个回合的上下文,自然成为说话做事的底子。
  • "清空记忆"会一并清空它,回到出厂底色。

3.7 确认面板

pet/confirm.pyConfirmBox 是浮在宠物身边的"执行 / 不执行"小面板;agent 通过 confirm 工具在不可逆 / 高风险操作前(删文件、覆盖重要文件、git push --force、清数据、关机等)弹出并阻塞等待用户点击,也可用于主动提议某个改动让你拍板。面板跟随宠物移动,点了才返回结果继续。

3.8 其它子系统

  • 眼 / 手 / 截图:截图用 SetWindowDisplayAffinity 把宠物窗口标记为"对用户可见、对截图隐形";优先用 UIAutomation 无障碍树读控件名 + 精确坐标直接点,读不到才退回截图找图;中文输入走剪贴板 + Ctrl+V。
  • 在场感知:用 Win32 全局最后输入时间判断你在不在,久无输入打瞌睡(深夜阈值更短),一动就醒。
  • 记忆 / 知识库 / 情景日志:三套独立持久化 —— 记忆是"它学到的关于你的",知识库是"你喂的外部文档(RAG)",情景日志是"最近做了啥",严格分离。
  • 提醒 / 定时say(到点用自己口吻说)/ do(到点后台真去办并汇报),支持每天 / 每周 / 每隔 X 分钟重复(持久跨重启,关机错过只补最近一次、不刷屏);可 list_reminders 列出、cancel_reminder 撤销;Star 隐藏或被全屏游戏挡住时改走系统托盘通知触达。一律走调度器持久化,绝不让模型自己 sleep 等时间。
  • 定时看屏watcher.py —— 按你设的间隔截当前窗口图、就你给的关注点分析并播报(如盯游戏局势、有危险/机会就提醒);会话级(不落盘、重启即止),结果回来时复检状态,已关机 / 已停 / 正对话中就不打扰,截图瞬时失败也不白烧一个周期。
  • 工程纪律executor/devtools.pyreview_diff(看未提交 diff,可限定文件/子目录)/ run_tests(自动探测 pytest · npm,独立 5 分钟超时、超时杀整棵进程树);系统提示有一节"动代码库时"的纪律 —— 改前看现状、小步外科手术、改完跑测试 / 自查 diff、默认分支先开分支、不可逆 git 先 confirm。
  • 隐身 / 入场 / 穿越:拖到屏幕边缘缩成小角偶尔探头;每次启动随机一种入场动画且绝不重复上次;偶尔"虫洞穿越"——原地裂开虫洞、旋转缩入、在窗口不可见时瞬移、从屏幕另一处冒出来。
  • 节日 / 陪伴感occasions.py 认公历节日 + 你填的生日(用作脚印应节换色等);stats.py 默默记着初次相遇时间与累计互动次数,是它"认识你多久了"的底气。
  • 伴生行为(companions/):五台各管一摊的"小机器",都裹在场 / 忙 / 亲密度 / 冷却门控里——
    • sensors.py:十秒一次读 CPU / 内存 / 电量体征(带迟滞,不抖),驱动机器拟态(高烧扇风、内存压扁、低电量、深夜盖被、冬天蹭暖);查麦克风占用做会议静音;两小时一次 wttr.in 查天气做天气拟态;盯下载目录与桌面图标数;瞄焦点是不是密码框就捂眼
    • playtime.py:玩耍与物理反馈——丢球接球、挠痒 / 拖甩记仇、走动留墨水脚印、钓鱼有渔获彩蛋。临时垃圾清理改由 agent 的 tidy_junk 工具自己处理。
    • rituals.py仪式感——晨间心情预报、纪念日蛋糕(吹蜡烛)、退出挥手道晚安、番茄钟 25 分钟专注。
    • feeding_ctrl.py + pet/feeding.py投喂分流——拖进来的文件按类型走(垃圾→回收站、文档→知识库、图片→直接看),受保护 / 危险路径拦下不吃,大餐 / 整目录先弹确认。
  • 身体感受(somatic.py):被喂 / 被摔 / 接到球 / 蛋糕端出来这些事,连同"在开会""机器高烧"等持续状态,统一汇成一段"身体近况"注入每轮上下文——所以它聊天时真的知道刚才身上发生了什么,而不是凭空装。
  • MCP / 热键 / 技能 / 审计 / i18n:MCP 连接器以 mcp__{server}__{tool} 融入工具表;全局热键独立线程跑 Win32 消息循环(唤出 / 问选区 / 顺手改写);技能把跑通的代码存成可复用项注入提示;所有工具调用记审计日志;控制面板 UI 支持中 / 英 / 日。

上手 & 更多

完整的安装运行、打包分发、测试排错、能力与安全、本地数据,都在 使用与部署指南


4. 许可

MIT —— 随便用、随便改、随便分发,保留版权声明即可,作者不担保也不负责。


觉得有意思?请作者喝杯咖啡 ☕

纯自愿,不影响任何功能 —— 就当给这只小桌宠投个喂。

支付宝
支付宝
微信
微信

作者:bdth · ✉️ 2074055628@qq.com · GitHub

说白了,这就是我闲来无事、纯凭兴趣写着玩的一个小东西——没什么宏大目标,就是想看看能不能把"和 AI 对话"做成"桌上养着一只会帮你干活的小生物"。代码里那些较真的细节,都是写的时候自己觉得有意思才折腾的。你要是也觉得好玩,随便拿去用、去改。

Star 还在长大。如果未来某天它真的有了自己的样子,希望你愿意把它当个朋友,而不只是工具。

About

🐾 A code-drawn desktop pet for Windows that actually drives your computer — powered by any OpenAI-compatible LLM. It has moods, grows its own personality, and gets real work done.

Topics

Resources

Stars

Watchers

Forks

Releases

Packages

Contributors

Languages