Skip to content

Repository files navigation

vpet 🤖

一只住在桌面上的聊天宠物 —— 默认形象是《明日方舟》的 Q 版基建小人 (焰影苇草·博物 / 浊心斯卡蒂 / 夕 / 年 等多套皮肤可随时切换,均带完整待机动画)。 它不只是个摆件:背后接入了 DeepSeek(或任何 OpenAI 兼容接口),带一套 完整的 agent loop,能聊天、能联网查询、能操作文档、还有长期记忆。

vpet 皮肤预览

✨ 功能

  • 桌面宠物:透明无边框、始终置顶的小窗,可随意拖动;戳它会播放完整的交互动画,双击打开聊天;超过一小时没理它,它就躺下睡觉,任何交互随时唤醒。
  • 完整 agent loop:流式回复 + 函数调用,模型自主决定调用工具、多步执行、再给出答案。
  • 联网查询web_search + fetch_webpage(Bing 优先、DuckDuckGo 兜底,免 key),查时事、资料、天气。
  • 文档操作:在工作目录读 / 写 / 追加 / 列出文件(记笔记、写草稿、整理文档)。
  • 操作电脑run_shell 执行 PowerShell 命令——查系统信息、跑脚本、管理文件/程序/进程, 带超时与输出截断;危险操作会先跟你确认(可用 shell.enabled 关闭)。
  • 长期记忆remember / recall / list_memories / forget,跨会话记住你的偏好和约定。
  • 定时激活set_reminder(几分钟后 / 某时刻 / 每天 / 每隔)本质是一次到点的 agent 激活,不只限于提醒——内容可以写得很宽泛(提醒用户、去看新闻、整理工作区…)。target=foreground 到点由vpet亲自开口(和用户相关的事),target=background 到点派一个后台 agent 独立去做;list_reminders 查看、cancel_reminder 取消,重启不丢。
  • 后台 agent:前台只有一个会话 agent,但可以同时有多个后台分身:start_background_agent 派遣耗时任务(联网调研、整理工作区等),list_background_agents / stop_background_agent / read_background_report 管理它们。后台 agent 能联网、能读写长期记忆、能在工作区写文件,但只能在工作区内活动、没有 shell,不会动你电脑上的其他东西;有进展时会主动给你捎消息(系统通知 + vpet亲口转达)。
  • 定期自主活动:默认每 12 小时一次(可配、可关),vpet 在后台自由探索——上网看新闻、整理工作区、写日记(workspace/journal/)、回顾记忆、安排后续激活,发现真正值得说的会捎话给你。像一个有自己的生活的个体。
  • 后台记忆管家:连续 5 小时没有新消息,一个后台记忆 agent 会自动接手这段对话——用专门的 记忆工具把值得留的内容整理进长期记忆(查重、更新、合并、删除过时项,而不是只追加一条摘要), 并开启新会话;每隔几段会话还会做一次深度反思,从全部记忆里归纳你的习惯与画像(阈值、频率可配、可关)。
  • 设置面板(右键 → ⚙️ 设置):配置 LLM 接入点 / API Key、测试连接并自动拉取 模型列表下拉选择;宠物名字、尺寸、皮肤开机自动启动;后台 agent 开关与自主活动间隔。保存后立即生效,无需重启。
  • 系统托盘:聊天、显隐宠物、设置、退出。

🚀 快速上手

方式一:安装程序(推荐给普通用户)

  1. 运行 installer_out/VPetSetup.exe(构建方式见下文「📦 打包」),按向导安装。
  2. 首次启动会自动弹出设置窗口:填入接入点和 API Key,点「测试连接」, 从下拉框选模型,保存即可。

方式二:从源码运行

pip install -r requirements.txt
python main.py

首次运行会在桌面右下角出现vpet,双击它开始聊天(或右键 → 💬 聊天)。

API key 也可以在 ~/.vpet/config.json 里改,或设环境变量 DEEPSEEK_API_KEY(环境变量优先于界面设置)。

📂 数据目录(都在 home 目录下)

程序本体(安装目录 / 项目目录)只放代码和立绘,所有运行数据都在 home 目录, 重装、换机不影响:

~/.vpet/
├── config.json        # 配置:API key、模型、宠物名字/尺寸、阈值…
├── data/
│   ├── memory/        # 长期记忆(JSON + 自动生成的 MEMORY.md)
│   ├── sessions/      # 当前会话
│   ├── reminders.json # 定时激活(前台/后台)
│   └── background/    # 后台 agent 的工作记录与收件箱
└── workspace/         # 宠物操作文档的默认目录(后台 agent 的活动范围也仅限这里)

从旧版本升级:首次启动会自动把项目目录下的 config.jsondata/workspace/ 迁移到 ~/.vpet/

⚙️ 配置(~/.vpet/config.json

说明 默认
deepseek.base_url OpenAI 兼容接口接入点 https://api.deepseek.com
deepseek.model 聊天模型 deepseek-chat
pet.name 宠物名字 vpet
pet.size 宠物尺寸(px) 100
pet.always_on_top 是否置顶 true
session.idle_timeout_hours 空闲多久触发后台记忆整理 5
session.max_history_messages 上下文保留的消息数 60
paths.workspace 文档操作的默认目录(相对 ~/.vpet workspace/
agent.max_iterations 单轮最多工具调用步数 10
shell.enabled 是否允许 run_shell 执行 PowerShell 命令 true
shell.timeout_seconds 命令超时秒数(超时强杀) 60
curator.enabled 是否启用后台记忆管家(false 则回退一次性摘要) true
curator.max_iterations 记忆管家单次整理最多工具步数 12
curator.reflect_every_sessions 每隔几段会话做一次深度反思(习惯/画像) 3
background.enabled 是否启用后台 agent(后台激活 / 前台派遣任务) true
background.max_iterations 后台 agent 单次任务最多工具步数 12
background.max_concurrent 同时运行的后台 agent 上限(超出的排队) 2
background.autonomous_enabled 是否开启定期自主活动 true
background.autonomous_interval_hours 定期自主活动间隔(小时) 12

带 ⚙️ 的常用项(接入点 / key / 模型 / 名字 / 尺寸 / 开机启动)建议直接在 设置面板里改,保存即生效。

📦 打包(构建安装程序)

pip install pyinstaller
winget install JRSoftware.InnoSetup   # 可选,只做绿色版可跳过
python build.py                        # 完整构建:dist/VPet/ + VPetSetup.exe
python build.py --app-only             # 只打包 dist/VPet/(绿色免安装)
  • dist/VPet/ 是绿色版,整目录拷走即可运行(数据仍在 ~/.vpet)。
  • installer_out/VPetSetup.exe 是安装程序:免管理员安装到 %LOCALAPPDATA%\Programs\VPet,可选桌面快捷方式 / 开机启动。
  • 卸载只删程序本体,~/.vpet 里的记忆和配置会保留。

🧠 它是怎么工作的

你说一句话
   └─> DeepSeek 流式生成
        ├─ 决定调工具 ─> 本地执行(联网/文件/记忆) ─> 结果喂回模型 ─> 继续生成(可多步)
        └─ 生成最终回复 ─> 流式显示在聊天窗 & 宠物头顶气泡
  • agent 核心vpet/agent.py(对话状态、工具调用循环、历史裁剪、会话重置)
  • 工具vpet/tools.py(文件/联网/记忆/提醒/命令等工具的 schema + 本地执行,文件操作沙箱在 ~/.vpet/workspace/run_shell 在 Windows 上走 PowerShell)
  • 记忆vpet/memory.py(JSON + 自动生成的 MEMORY.md,关键词检索,支持增删改)
  • 记忆管家vpet/curator.py(后台记忆 agent——空闲时用记忆工具整理对话、查重/更新/合并, 并定期纵观全部记忆做深度反思、归纳用户习惯与画像)
  • 后台 agentvpet/background.py(后台分身管理器——定时后台激活、前台派遣的耗时任务、 定期自主活动都是它跑的 agent loop;文件操作强制限制在工作区内、无 shell;工作记录与给用户的 捎话持久化在 data/background/,由 vpet/brain.py 中继到前台会话)
  • 会话vpet/session.py(5 小时空闲判定)+ vpet/brain.py(定时检查、触发后台记忆整理、 路由前/后台定时激活、中继后台消息、调度定期自主活动)
  • 界面vpet/ui/(PySide6:宠物窗 / 聊天窗 / 气泡 / 设置),vpet/brain.py 用 Qt 信号把 跑在工作线程上的 agent 安全接到界面。

🎨 形象 / 皮肤

默认形象是《明日方舟》的 Q 版基建小人皮肤(assets/skins/,© Hypergryph,仅个人 自用):焰影苇草·博物浊心斯卡蒂(原皮/升华)、(原皮/染尘烟)、 (原皮/乐逍遥)。动画只用基建动画三件套:待机 Relax、点击 Interact (完整播完一次,不被打断)、一小时无交互后睡觉 Sleep

  • 换皮肤:右键 → ⚙️ 设置 → 皮肤 下拉,即时生效。
  • 加皮肤:用渲染管线 tools/spine_render/render_skins.py(从 PRTS 拉取 Spine 模型 烘焙序列帧),或按 assets/ASSETS.md 的目录结构手工放图。
  • 一套皮肤都没有时,程序回退到内置的程序绘制占位形象。
  • (旧版默认形象 FF14「外勤机」已退役,历史素材仍保留在 assets/source/。)

📏 项目规范

AGENTS.mdCLAUDE.md 引用了同一份内容)。最重要的一条: 任何后台 LLM 任务都做成带工具的 agent loop,而不是一次性 llm.complete()—— vpet/curator.py(记忆管家)是模板。

🧪 测试

python tests/test_settings.py     # 设置面板/配置存取/开机启动/真实拉模型列表
python tests/test_backend.py      # 端到端打真实 DeepSeek:聊天/联网/记忆/文件/5h记忆整理
python tests/test_curator.py      # 后台记忆管家(脚本化假 LLM,无网络):增删改/反思节奏/会话交接
python tests/test_background.py   # 后台 agent(脚本化假 LLM,无网络):工具loop/沙箱/停止/收件箱/自主激活/路由
python tests/test_shell.py        # run_shell 命令执行(真实安全子进程 + 假 LLM 接线,无网络)
python tests/test_gui_render.py   # 离屏渲染宠物与聊天窗,输出到 tests/_render_out/
python tests/test_skins.py        # 皮肤系统:目录扫描/发现顺序/元数据/别名/按帧率播放
python tests/test_ui_fixes.py     # UI 回归(离屏无网络):气泡/滚动/位置记忆与持久化
python tests/test_app_smoke.py    # 整机装配冒烟测试

📁 目录结构

├── main.py               # 入口:装配后端 + 界面 + 托盘
├── config.py             # 配置加载/保存(~/.vpet 数据根、旧数据迁移)
├── config.example.json   # 配置模板(真实配置在 ~/.vpet/config.json)
├── build.py              # 打包脚本(PyInstaller + Inno Setup)
├── installer.iss         # Inno Setup 安装包脚本
├── tools/make_icon.py    # 生成应用图标 assets/icon.ico
├── tools/spine_render/   # 皮肤渲染管线:PRTS Spine 模型 → 序列帧皮肤(见 ASSETS.md)
├── vpet/
│   ├── llm.py            # DeepSeek 客户端(流式 + 工具调用 + 模型列表)
│   ├── agent.py          # agent loop 核心
│   ├── curator.py        # 后台记忆管家(空闲整理记忆 + 定期反思习惯/画像)
│   ├── background.py     # 后台 agent 管理器(后台激活/派遣任务/定期自主活动)
│   ├── tools.py          # 文件/联网/记忆/定时激活/后台管理/命令 工具
│   ├── memory.py         # 长期记忆存储(线程安全,前后台共享)
│   ├── reminders.py      # 定时激活调度存储(前台/后台 target)
│   ├── session.py        # 5 小时空闲会话管理
│   ├── brain.py          # Qt 信号桥 + 工作线程 + 定时检查
│   ├── autostart.py      # 开机启动(注册表 Run 键)
│   ├── prompts.py        # 人设 / 系统提示词
│   └── ui/               # pet_window / chat_window / bubble / settings_dialog
├── assets/
│   ├── ASSETS.md         # 皮肤目录规格 + 渲染管线用法 ★
│   ├── source/           # 设计基准图 / 预览图(含退役的外勤机素材)
│   ├── skins/            # 序列帧皮肤(render_skins.py pack 产物,打包进 exe)
│   └── sprites/          # 旧默认皮肤目录(外勤机已退役,通常为空)
└── ~/.vpet/              # 运行数据(见上文「数据目录」)

说明

  • 形象灵感来自 FF14「外勤机」,代码与素材均为原创实现,仅供学习交流。
  • API key 保存在 ~/.vpet/config.json,请妥善保管,别提交到公开仓库。

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages