桌宠总览

?
桌宠
动作接口的 ?surface=(必填):宿主拿它跟宠物的 display 对一下,对不上就回 pet-not-displayed + 该宠物实际的 display
还没有说过话

工作状态

随 DSH 会话变化
空闲
—

余额钱包

还没有数据

系统通知

回合结束 / 权限 / 提问
还没有通知

占用锁

POST /lock · /lock/release
占用期间这只宠物完全静止,动作接口只有持锁者能调
模拟联动演出的第一步(issue #122 第 4 项):POST /lock 拿一个 lockId,这段时间这只宠物归你独占——它自己不动、也不弹气泡 (随机动画、自主走位、碎碎念、余额、工作状态一概让路)。
占用期间,本页其他卡片里的接口(投喂、点播动画、位置、抛掷、清空气泡) 必须带上这个编号,否则回 lock-required;带错编号回 lock-lost(附 cause:过期 / 已释放 / 被用户抢走)。本页会自动带上,不用手填。
取锁和续期是同一个接口:给 lockId 就是续期。续期是持锁者 每隔几秒要做一次的心跳——不续期的话,到点锁自己就没了。
用户优先:用户拖一下宠物、或把它隐藏/关闭,锁会立刻被撤掉,所以别把它当成能长期占着的东西。 没锁的时候那些接口连 lock 参数都不看,行为跟以前一模一样。
ms · 1000–1800000(1 秒–30 分钟)· 缺省 120000(2 分钟)· 续期时沿用上次
(没有)

第三方投喂

POST /broadcast
不生成内容,只把给定文本搬进气泡;配图给池内名或自带地址
模拟宿主侧其他插件(如巡检类插件)调用 POST /broadcast: 不生成内容,只搬运。 配图两种形态二选一(issue #122 第 1 条):给名称时只接受该桌宠条目表情包池内的名字 (pet/<素材根>-memes/ 独占 → 用户 memes/ → 包内 assets/memes/), 下拉框只列磁盘上真实存在的图;给地址时是完整 URL、不查池。 两个都给会被判 bad-request。
时长可调、可关掉动画联动、可提前撤回——这三件事是 issue #122 第 5 条要的。 内容与频率由调用方自己负责:不设长度限制,也不限频;「清空气泡」只收起说话气泡, 正在播的动画、余额气泡、工作状态气泡都不动,没有气泡时也回 ok。
ms · 缺省 10000 · 0 = 不显示

点播动画

POST /anim
播池内名字(同右键「动作」菜单)或第三方自带的地址
两种形态二选一(issue #122 第 1 条):给名字时必须是该宠物动画池里真实存在的 (下拉框列的就是池子),效果与右键菜单点「动作」完全一致——文字类先强制朝左的镜像修正、 移动类走真实位移;给地址时是第三方自带的素材,完整 URL、不查池, 消费端直接换源播一次、不走菜单语义(裸地址没有"是不是文字类 / 是不是移动类"这些属性)。 两个都给或都不给都会被判 bad-request。
点播是"插播一段":播完回到正常动画链;display: both 时两端都会播。 要看回执请用下面那张「播放回执」卡片。
可选。不指定就不动朝向(保持宠物当前朝向,不是回落 left); 指定了就设成它,并优先于"文字类动画点播前强制朝左"那条镜像修正。

播放回执

GET /playback/<id>
受理 ≠ 播完:勾选要等的状态,命中即停,没命中就继续挂起
POST /anim 只代表"受理了",accepted ≠ 播完。 响应里的 playbackId 可以查 GET /playback/<id>:勾选要等的状态,命中即停; 没命中就按「轮询时间」反复挂起等待(长轮询)。
ms · 每次最多挂这么久,回来立刻再发一次(限 100–10000)
先在上面「点播动画」里点一次「播放」拿到 playbackId
轮次 等了 状态 命中 reason
原始响应文本(逐轮,要查再展开)

位置与抛掷

POST /position · POST /throw
两条运动指令:位置走三条既有路径,抛掷复用已有物理
模拟第三方调用 POST /position 与 POST /throw。 两条都是运动指令:写进状态后由渲染端执行,不引入任何新物理——位置按 mode 走三条既有路径(直接 / 弹簧 / 直线),抛掷复用已有的 重力 / 反弹 / 地面摩擦 / 落地 Q 弹。
手指正按在宠物身上时会被静默丢弃:接口仍回 ok, 但宠物不动,而且轮询也看不出来(这是设计上的已知缺口)。
位置 x / y = 宠物中心的归一化坐标(0~1,越界会被夹取)
点或拖这里设定宠物中心
x y ms
抛掷 angle 单位度(0 = 正右,逆时针为正)· power 是力度倍率
0 = 正右,逆时针为正
抛掷不设死区:力度再小也照抛(死区是拖拽语义,表示"手停住了 = 温柔放下")。 角度是数学惯例而非屏幕惯例,所以"往上抛"写 90 而不是 270。宠物从当前位置起飞,不需要先被"抓住"。

显示在哪端

POST /pet-display
只传宠物 id 与目标 display,层归属由宿主按 id 反查
模拟第三方调用 POST /pet-display:只传宠物 id 与目标 display,不用回传整段 pets——层归属(写 main-config.jsonc 还是 pet/<前缀>-config.json)由宿主按 id 反查。 桌面端与浏览器端的右键菜单「显示位置」走的就是它。
这管的是"哪个端",不是屏幕坐标——屏幕坐标见同页的「位置与抛掷」。 这是持久配置写入,不是临时隐藏:选「都不」后这只宠物两端都不可见, 恢复入口是设置页的「显示在哪端」下拉框。返回体是改动后的成品聚合,本页据此刷新宠物清单。

实时状态

每秒轮询一次,只有内容变了才刷新
等待第一次轮询…
查看原始 JSON
—

与桌宠对话

桌宠

改完点下面的保存
加载中…

全局开关

AI 模型

与 DSH 自己的模型选择器同源
碎碎念与对话各自用哪个模型(whisperModel / chatModel)。要么都留空(= 跟随当前对话的模型)、要么都选 ——只选一半是非法组合(宿主直接回 400)。清单来自 GET /models。
加载中…

物理(拖拽抛掷手感)

全局:写用户级配置的 physics 段
重力 / 弹性 / 地面摩擦 / 总力度 + 两个开关。浏览器保存后即时生效;桌面端由保存触发的 Helper 重启重新读取——physics 在 sprite 构造时只读一次。

保存与生效

会真的写盘

可用模型

与 DSH 自己的模型选择器同源

存储位置

配置文件与数据落在哪