Skip to content

Latest commit

 

History

History
434 lines (297 loc) · 28.3 KB

File metadata and controls

434 lines (297 loc) · 28.3 KB

飞账用户手册

Documentation is Chinese-first. For an English project overview, see the English README. 飞书内的 help / 帮助 回复是本手册的简要入口,完整行为与限制以本手册为准。

飞账是运行在飞书 / Lark 中的 AI 记账机器人。你可以用日常语言记录收支,也可以修改或撤销最近一笔、查询汇总、管理分类月预算和生成消费报告。

Client API(v1)

机器客户端使用通道无关的稳定契约 /api/v1/*(v0.9.0 起正式;/api/client/v1/* 为兼容别名,同一组 handler)。响应是稳定的结构化 JSON,不以 AI 展示文本作为业务结果。Bearer 个人令牌(llv1_)在 Web Dashboard 的「系统 → API 令牌」页或 POST /api/web/v1/client-credentials 创建;该请求仍受 Cookie + CSRF 保护。明文只在创建响应中出现一次,服务端仅保存 SHA-256 摘要;令牌可设过期、可随时撤销。浏览器 Session Cookie 不能代替 Bearer,Bearer 也不能绕过 Web CSRF。完整说明见 Client API 文档

curl -H "Authorization: Bearer llv1_..." \
  https://ledger.example/api/v1/me

curl -X POST https://ledger.example/api/v1/transactions \
  -H "Authorization: Bearer llv1_..." \
  -H "Idempotency-Key: device-20260809-0001" \
  -H "Content-Type: application/json" \
  -d '{"type":"expense","amount":"32.00","currency":"CNY","category":"餐饮","note":"午饭","occurred_at":"2026-08-09T12:00:00+08:00"}'

/api/v1/transactions/api/v1/entries 等价。)

  • 写请求必须带 1–128 字符的 Idempotency-Key。同一用户、操作和账本中的相同键 + 相同负载返回原业务快照;负载不同返回 conflict。不同用户或账本可安全复用相同键。
  • 当前账本保存在具体凭证上。POST /ledgers/{ledger_id}/select 会重新认证并授权;家庭成员退出或被移除后,下次请求立即回退默认个人账本。
  • 列表端点使用 page / page_size;账目时间使用左闭右开 start / end,分析使用本地日期 start_date / end_date,服务端维持最大范围和导出大小限制。
  • 高风险写入仍进入既有 Pending。具有 pending:write scope 的凭证才能确认或取消;确认时重新检查冻结的 actor_user_id + ledger_id,重复确认只执行一次。
  • 稳定错误码为 authentication_requiredpermission_deniedresource_not_foundvalidation_errorconflictexpiredrate_limitedtemporary_failure。未授权资源统一使用不可枚举的 not-found 响应。

/api/v1 自 v0.9.0 起是稳定契约:新增字段优先为可选字段,破坏性变更通过新的版本路径发布。完整 OpenAPI(含 Bearer security scheme)可从运行实例的 /openapi.json 获取;错误 envelope 带 request_id,日志中只记录令牌前缀。

群聊中请先 @飞账;与机器人单聊时可以直接发送。只有收到“已记录”“已修改”“已撤销”或查询结果,才表示操作成功。

快速上手

你想做什么 示例
记录支出 晚饭猪脚饭花了20元
记录收入 工资到账10000元
批量记录并设置预算 早餐12,午饭32,打车45,餐饮预算1000
补记过去的账 昨天打车38.5元
查看最近账目 最近10笔最近20笔
查看单笔 查看 #A83F2
按短 ID 修改 把 #A83F2 改成35元修改 #A83F2 分类为交通
按短 ID 删除 / 恢复 删除 #A83F2恢复 #A83F2
修改最近一笔 上一笔改成25元
撤销最近一笔 撤销刚才那笔
查询支出 这个月餐饮花了多少
查询收入 这个月收入多少
设置分类预算 每月餐饮预算1500元
查看或取消预算 查看预算取消餐饮预算
生成消费报告 生成这个月的消费图表
查看简要帮助 help帮助你会做什么

记录账目

管理个人账本

飞账支持一个用户维护多个相互隔离的个人账本。账本命令由程序在 AI 之前确定性解析:

命令 作用
账本列表(或 查看账本 / 我的账本 列出自己的账本,并标记当前与默认账本
创建账本 旅行(或 新建账本 旅行 / 创建新账本 旅行 创建个人账本;不会自动切换
切换账本 旅行(或 切换到账本 旅行 只切换当前飞书入口账本
当前账本 查看当前账本
设为默认账本 旅行(或 设置默认账本 旅行 设置新会话的回退账本;不会切换当前账本
重命名账本 旅行 旅游 重命名自己的账本

新建账本切换到账本 等常用说法与命令表中的动词等价。若输入明显是想管理账本但语法未匹配(例如 新建账本 后没写名称),机器人会回复账本命令用法提示,而不是通用帮助。

Web Dashboard 侧栏也提供账本选择器和创建入口。每个 Dashboard Session 单独保存当前账本;新 Session 回退到用户默认账本。切换后,记账、查询、预算、统计、报告、CSV 导出和新建 Pending 都使用所选账本。已经创建的确认单始终写入创建时冻结的账本,即使之后切换了当前账本。

家庭空间与公共账本

家庭空间只邀请已经使用过飞账、因而已有内部身份的用户。创建家庭时会自动创建一个家庭公共账本;成员的原有个人账本和账目不会复制、迁移或自动共享。家庭公共账本也不能设为个人默认账本,新飞书入口或新 Web Session 仍回退到默认个人账本。

命令 作用
创建家庭 小家 创建家庭及“小家公共账本”
家庭列表 / 当前家庭 查看已加入家庭或当前家庭
家庭成员 查看当前家庭成员
邀请家庭成员 ou_xxx 所有者按完整飞书 open_id 邀请已有用户
家庭邀请列表 查看自己的待处理邀请
接受家庭邀请 <邀请编号> 接受并成为普通成员
拒绝家庭邀请 <邀请编号> 拒绝邀请
切换家庭账本 小家 切换到家庭公共账本
退出家庭 小家 普通成员退出;所有者不能直接退出
概览 / 家庭概览 / 家庭开销 查看当前账本的本月概览(支出 / 收入 / 结余 / 预算 / 成员支出 / 未来周期)

家庭命令在 AI 之前确定性解析;无法唯一解析的邀请目标会被拒绝。成员退出或被移除后立即失去公共账本访问权,历史账目保持原样。如果此前选择了该公共账本,服务端会清除失效选择并回退默认个人账本。Pending 始终冻结创建时的账本,确认时重新验权;成员权限已失效就拒绝执行,不会改写到当前个人账本。

付款人与账户隐私(v0.7.0)

家庭账本区分谁记账(创建者)与谁付钱(付款人)。一条消息可显式指定付款人,按成员别名 > 显示名 > open_id 顺序确定性解析:

  • B 买菜120 — 创建者是 A,付款人是 B;回复会显示 · 付款:B
  • 不指定时付款人默认是记账人自己;付款人无法唯一解析时会列出成员供选择
  • 成员别名由户主在 Web「家庭成员」页设置(例如把 B 设为 老婆,之后 老婆买菜120 同样有效)

账户在家庭账本中可以是共享(默认,所有成员可见)或私人(仅本人可见)。私人账户的余额、账目、周期规则、待确认、预算消耗与成员统计对其他人完全不可见;个人账本不受影响。在 Web「账户」页可查看 共享 / 私人 徽标并切换可见性(仅户主或账户本人)。

一条消息可以记录一笔或多笔支出、收入,并可同时设置分类预算。建议同时说明每笔用途或来源、金额和必要的日期:

  • 早餐12元
  • 昨天买日用品花了86.5
  • 房租支出2500元
  • 奖金到账2000元
  • 旅行午饭1300日元
  • 早餐12,午饭32,打车45,餐饮预算1000

复杂文字消息最多处理 30 笔账目和 10 项预算。机器人会逐项校验并统一回复成功、失败、收支合计和预算结果;某一项无效或保存失败时,其他有效项仍会保存。超出上限时只处理前 30 笔账目或前 10 项预算并明确提示。

同一条消息出现更正时以最后的明确说法为准,例如“午饭36,不对,是38”只记录 38;优惠券或满减只记录实际支付额。垫付、朋友还款、AA 收款和公司报销按真实资金流水分别记录,例如“聚餐426我先付,另外三人每人转我106.5”会记录一笔支出和三笔收入,不合并为净支出。

修改上一笔、撤销、查询和报告不能混在批量记账消息中,请分别发送,避免操作顺序或查询范围产生歧义。

机器人会判断收支方向并生成简短分类。金额必须大于 0,最多保留两位小数;单笔金额不能超过数据库字段允许的 14 位有效数字。新账目统一使用管理员配置的币种,默认是 CNY

每笔账目都有一个当前用户账本内唯一的五位短 ID,成功回复会以 #XXXXX 展示(例如 #A83F2)。短 ID 用于在聊天中引用具体账目;内部仍使用 UUID 主键,普通用户无需关心。已撤销(软删除)记录的短 ID 不会重新分配给新账。你可以用短 ID 查看详情、修改、删除或恢复任意一笔(见下文);也可以继续用「上一笔」快捷方式操作最近一笔。

新增账目、修改上一笔和设置预算时,可以明确写出人民币、美元、欧元、日元、英镑、港币、韩元、澳元、加元或新加坡元。外币会按最新参考汇率约算成管理员配置的默认币种后保存,例如 上一笔改成1300日元。回复会同时展示换算结果和原始外币金额:

已修改 #A83F2:¥62.15(由 1300.00 JPY 约算)· 餐饮

汇率来自管理员配置的在线服务,并在当前进程内缓存。刷新失败时会沿用已有缓存;服务重启后首次获取汇率失败则不会修改账本。参考汇率不等同于银行卡、支付平台或现金兑换的实际成交价。汇总、预算进度和报告始终使用账本默认币种,不能临时切换展示币种。

回复示例:

已记录支出 ¥50.00 · 餐饮(晚饭)

日期与时区

可以使用明确日期或相对时间,例如 昨天午饭32元上周五打车45元。机器人按照管理员配置的 IANA 时区解释“昨天”“这个月”等表达,默认时区为 Asia/Shanghai

如果日期很重要,请写得明确。AI 无法可靠判断时会返回帮助或处理失败,不会以未经 Schema 校验的数据写入账本。

语音记账

可以发送飞书语音消息或包含可转写音频的文件。机器人下载媒体、调用转写模型得到文字,再按与文本消息相同的流程处理。

背景噪声较大、金额含小数或日期容易混淆时,建议改用文字。飞账不会保存音频到账本,但媒体会在处理过程中发送给配置的 AI 服务。

图片记账

可以发送小票照片、支付截图或含有清晰金额和消费信息的账单图片。机器人把图片交给支持视觉输入的模型,并尝试记录账目。

也可以在一条飞书富文本消息中同时发送说明文字和图片,例如写明“这笔按交通分类”后附上支付截图。正文中的明确补充或纠正会与图片一起交给视觉模型;群聊中的 @飞账 只用于触发机器人,不会作为记账说明。一条富文本最多包含 5 张不同图片,超过时整条消息不会处理,请拆分后重新发送。

单笔支付详情和小票会生成一笔待确认项,小票中的多个商品不会拆成多笔。支付宝、微信支付或银行流水列表可以按图片顺序识别并处理最多 30 笔独立交易。每一笔都会单独校验:有效项进入冻结预览,无效项跳过;确认后才保存有效项,并回复成功/失败数量、收支合计和逐笔结果。图片超过 30 笔时只处理前 30 笔并明确提示。

多张图片会作为同一次请求处理,可能是连续页面或有重叠的截图;机器人会尝试避免重复记录相同交易,所有图片合计仍最多处理 30 笔流水。任一图片下载或格式校验失败时,整条消息都不会入账。批量图片也可能因遮挡、分辨率或日期缺失而只成功一部分。

图片 / 语音 / 批量识别结果不会直接入账(v0.3.0 高风险确认)。识别完成后机器人会先发送一张确认卡片和确认单编号(#C-XXXXX),只有你确认后才会真正写入账本。

高风险记账确认

图片识别、语音识别、批量记账以及疑似重复的记录,会先进入待确认状态,不会直接写入账本。简单明确的单笔文字记账仍直接入账。

发送图片、语音或批量消息后,机器人返回一张预览卡片,包含总笔数、收支笔数、分方向总额、逐笔摘要(金额 / 分类 / 时间 / 备注)和异常项,以及确认单编号 #C-A83F2C 前缀用于与账目短 ID #XXXXX 区分)。你可以:

你说 效果
确认 #C-A83F2 执行该确认单中的冻结记账,写入账本
取消 #C-A83F2 / 撤销 #C-A83F2 取消该确认单,不写入账本
查看待确认 / 确认列表 列出当前待确认的确认单

也可以直接点击预览卡片上的确认 / 取消按钮,效果与文本命令一致;文本命令始终可用,是卡片不可用时的兜底。

要点:

  • 确认时使用冻结的解析结果,不会重新调用 AI,也不会重新识别图片或语音。
  • 同一用户重复投递完全相同的图片时,活跃的待确认项只保留一个,不会重复识别或重复发卡。
  • 确认单有有效期(默认 24 小时,管理员可配置);过期后无法确认或取消,需要重新发送原记账内容。
  • 疑似重复:当一条记录与已有账目方向、金额、币种、时间接近且分类或来源相同、备注相似时,预览会提示「疑似与 #XXXXX 重复」。不直接拒绝——你确认后仍会写入。
  • 已确认并入账的确认单重复确认不会重复记账;重复点击卡片按钮也只会执行一次。
  • 确认单只属于当前用户,其他用户无法确认或取消你的确认单。
  • #C-XXXXX 是确认单编号;普通 #XXXXX 才是账目编号。因此 撤销 #C-A83F2 取消待确认,撤销 #A83F2 则撤销已有账目。

修改和撤销

修改最近一笔

飞账只能修改当前用户最近一笔未撤销记录。可修改金额、收支方向、分类、备注或发生时间:

  • 上一笔改成25元
  • 刚才那笔分类改成交通
  • 上一笔其实是收入
  • 上一笔是昨天发生的

未明确要求修改的字段保持不变。这里的“最近一笔”先按发生时间、再按创建时间排序,不一定是刚刚发送的消息;补记历史账目后尤其需要留意。成功后回复会包含该笔账的短 ID,例如 已修改 #A83F2:¥25.00 · 交通

撤销最近一笔

发送 撤销刚才那笔删除上一笔,可以软删除当前用户最近一笔未撤销记录。撤销后的记录不再计入汇总、预算和报告。成功回复示例:已撤销 #A83F2:¥25.00 · 交通

也可用短 ID 删除或恢复任意一笔,见下文。

查询汇总

可以按时间范围、收支方向和分类汇总:

  • 今天花了多少钱
  • 这周交通支出多少
  • 这个月餐饮花了多少
  • 这个月收入多少
  • 上个月工资收入多少

没有明确说“收入”时,汇总默认查询支出。结果只包含当前用户、指定时间范围内且未撤销的记录,并按分类列出合计:

合计支出 ¥75.00
• 餐饮:¥45.00
• 交通:¥30.00

查看账目明细

可以按最近条数、时间范围或分类查看逐笔账目(纯文本,默认 10 笔,单次最多 20 笔):

  • 最近10笔
  • 最近20笔
  • 查看本月账单
  • 查看餐饮账单 / 查看本月餐饮支出
  • 查看 #A83F2(单笔详情;已删除记录会标明状态与删除时间)
  • 查看 #A83F2 之前的10笔(无状态 Keyset 分页;短 ID 使用上一页最后一笔)

列表默认不含已删除记录。单笔查看可以识别已删除状态。分页不要只发「下一页」——需要带上边界短 ID。

汇总查询(例如「这个月花了多少」「本月餐饮总共多少」)仍只返回分类合计,不进明细列表。

按短 ID 修改、删除与恢复

每笔账有用户内唯一的五位短 ID(如 #A83F2)。可以指定操作某一笔:

  • 把 #A83F2 改成35元
  • 修改 #A83F2 分类为交通
  • 把 #A83F2 的备注改成和客户吃饭 / 清空 #A83F2 的备注(按机器人理解)
  • 删除 #A83F2
  • 恢复 #A83F2

仍可使用「上一笔」快捷方式:上一笔改成25元撤销刚才那笔

规则:

  • 一次只允许操作一个短 ID;
  • 删除是软删除,列表默认不再显示;可用短 ID 查看详情并恢复;
  • 已删除的账目需先恢复再修改;
  • 修改、删除、恢复会保留内部 revision 审计记录(用户无需操作 revision);
  • 当前不支持批量修改。

导出账目(CSV)

可以把当前飞书用户本人的账目导出为 CSV Schema v1 文件,并通过飞书文件消息发回当前会话。

怎么说

你说 效果
导出账单 / 导出最近90天账单 默认最近 90 天、CSV、不含已删除
导出本月账单 本月(应用时区自然月,左闭右开)
导出今年的账单 当年范围
导出 2026-01-01 到 2026-06-30 的账单 自定义时间范围
导出全部账单 仅当明确说「全部 / 所有 / 完整历史」时导出全部历史
导出本月账单,包含已删除记录 在范围内纳入软删除记录

「查看本月账单」仍是列表;「本月花了多少钱」仍是汇总;只有带「导出」语义才会生成文件。

规则与限制

  • 用户隔离:只导出当前会话用户的账目;文件中不含其他用户数据,也不含 open_id / 数据库 UUID / 消息 ID。
  • 默认不含已删除;需显式要求才包含;deleted_at 列在未删除行为空。
  • 最多 5000 行;超出时不会截断发送,会提示缩小时间范围。
  • 最大约 5MB;超限不上传,提示缩小范围。
  • UTF-8 with BOM,逗号分隔,便于 Windows Excel 打开中文。
  • CSV 公式注入防护:对用户可控文本(分类、备注等)在导出副本中做前缀转义,不改数据库原文。
  • 排序:按发生时间、创建时间、内部 ID 升序,时间线稳定。
  • 文件名形如 larkledger-export-v1-20260805-223000.csv(含 Schema v1),不含用户输入或 open_id。
  • 只读:导出不修改账目、不写 revision。
  • 投递:生成后上传到飞书并以文件消息回复;发送失败会由 Reply Worker 按指数退避自动重试直至 dead(v0.2.1)。文件上传成功后发送失败会复用已持久化的 file_key,不重复上传;报告图片上传失败时降级为文字卡片。
  • CSV 导出不等于 PostgreSQL 完整备份或灾备。
  • JSON 导出当前不是正式能力;本版本只支持 CSV。

CSV Schema v1 列

short_id, occurred_at, direction, amount, currency, category, note,
source_type, created_at, updated_at, deleted_at
  • short_id:展示形式 #A83F2
  • direction:稳定枚举 expense / income

P27 转账与余额

  • 飞书文字转账使用明确账户名,例如:招商银行 → 支付宝 1000。账户名不能唯一匹配时会要求确认,不会猜测账户。
  • Client / Web API:POST /transfersGET /transfers/{transfer_id}POST /transfers/{transfer_id}/reverseGET /accounts/{account_id}/balanceGET /assets(分别位于 /api/v1/api/client/v1/api/web/v1)。
  • Transfer 是独立账务事实,不是 income/expense LedgerEntry,因此不进入收支、分类消费与预算统计。
  • 资产/现金账户的正余额表示持有资产:opening + income - expense + inbound transfer - outbound transfer
  • 负债账户的正余额表示当前负债,资金流方向取反:收入/转入降低负债,支出/转出增加负债。净资产始终为总资产减总负债。
  • 余额不存储为可修改字段;归档账户仍可查询历史余额,已删除账目和已撤销转账不计入当前余额。
  • 时间为带时区偏移的 ISO 8601;金额为十进制字符串

分类月预算

每位用户可为每个分类设置一个长期沿用的月预算:

  • 每月餐饮预算1500元
  • 交通预算500,人情往来预算1000
  • 查看预算
  • 查看餐饮预算
  • 取消餐饮预算

一条消息可以设置最多 10 个分类预算,也可以在批量记账消息中同时设置;每项可使用不同币种。批量处理中有效项目会保存,无效项目不会影响其他项目,回复会逐项列出成功或失败原因。同一条消息重复出现相同分类时以最后一项为准。

重复设置同一分类会更新额度。查看预算会显示当前自然月的已用金额、预算金额和剩余额度;预算按管理员配置的时区统计,只计算分类名称完全相同、未撤销的支出。

新增或修改本月支出后:

  • 首次达到 80% 时提醒一次。
  • 首次达到或超过 100% 时提醒一次;如果一笔消费直接越过 100%,只显示超额提醒,同时记下两个阈值。
  • 每个分类的每个阈值在同一自然月只提醒一次。

设置预算本身不会触发阈值提醒。撤销支出也不会重新开放本月已经发送过的提醒。

消费报告

可以生成最长 366 天的消费报告:

  • 生成这个月的消费图表
  • 分析最近30天消费
  • 生成上个月的消费报告

报告包含收入、支出、结余、支出分类、支出趋势和 2~3 条建议。92 天及以内按日展示趋势,更长范围按月展示。没有记录时只返回提示;图片渲染或上传失败时会降级为文字卡片。

用于生成建议的 AI 请求只包含币种、收支合计、分类合计、趋势和记录数量,不包含用户标识或逐笔备注。

P33 财务目标(Goals)

把“想存到多少钱”变成可跟踪的目标:

  • 我的目标 / 目标 / 查看目标 —— 列出当前账本的目标与确定性进度。
  • 创建 / 编辑目标在 Web「目标」页完成(第一版聊天只做查看,不为命令引入复杂 DSL)。

进度来自真实账本:目标绑定 1 个或多个现金 / 资产账户,current_amount 始终等于绑定账户的实时余额之和,目标本身不保存、不手工维护余额。账户余额因记账 / 删账 / 恢复 / 转账变化时,目标进度自动重算。

  • 支持目标金额、币种、目标日期与 forecast(按过去 90 天净储蓄速度估算剩余月数与可能缺口);历史不足或速度为负时不做预测。
  • 目标可见性继承其绑定账户:只要目标引用任何私人账户,其他成员就完全看不到该目标(列表过滤 + 直接访问 404),不会通过目标显示泄漏私人余额。
  • 目标不是虚拟账户 / 钱包 / 资金池:创建、修改、删除目标从不创建或修改账户、账目或转账。

P33 确定性洞察(Insights)

  • 洞察 / 财务洞察 / 本月洞察 —— 自动发现值得注意的确定性事实。

第一版四类洞察(全部由确定性规则计算,AI 不参与计算):

  • 支出变化:本月某分类支出 vs 近 3 个月平均,超过阈值时提醒。
  • 预算风险:本月预算使用率明显快于时间进度(超出容差)时提醒“存在超支风险”,不做“一定会超支”的预测。
  • 未来周期支出:未来 30 天内的 active 周期支出笔数与合计,不同币种分组展示、绝不直接相加。
  • 目标进度:目标已达成 / 临近目标日期 / 按当前速度预计到目标日期还有缺口。

隐私与数据不足:私人账户数据不会进入任何洞察(包括分类合计、预算消耗等侧信道);新用户或历史不足时返回“没有需要特别关注的变化”,不制造噪音。AI 解释层(可选)只改写结构化洞察文本,AI 不可用时自动回退为确定性摘要,洞察功能不依赖 AI 可用性。

数据与安全边界

  • 每位内部用户可拥有多个个人账本;授权以服务端验证的 actor_user_id + ledger_id 为边界,客户端不能提交任意 UUID 覆盖当前账本。
  • 同一个飞书 event_id 会自动去重,避免重复投递造成重复操作。
  • AI 只能生成预定义并通过严格 Schema 校验的业务动作,不能访问数据库或执行 SQL。
  • 账本保存在部署者自己的 PostgreSQL 中;备份、保留和删除策略由部署管理员负责。
  • 文字、图片和音频会发送到部署者配置的 AI 服务,请按该服务的隐私和数据保留政策使用。
  • 处理失败时,机器人回复不会暴露内部异常或上游响应;请把错误编号提供给管理员,由管理员在服务日志中查询完整异常。

管理员故障恢复:人工事件重放

这不是普通用户的飞书命令。管理员在服务器终端处理 dead / failed 事件时,可先运行:

python -m lark_ledger.admin replay-event \
  --event-id <event_id> \
  --operator <operator> \
  --reason "temporary upstream outage"

默认只做 dry-run;输出状态、lease、Outbox / 来源账目计数和安全原因码,不输出消息 payload、 财务正文、operator 或 reason。确认预检为 eligible 后,追加 --execute 才会重新排队并写审计。

事件重放会重新执行业务,与只重发已持久化回复的“结果回放”严格不同。存在任何 Outbox 时 必须拒绝事件重放并改用结果回放;存在来源账目、有效 lease、无 payload、版本不支持、状态不 安全或历史原子性无法证明时也默认拒绝。模糊事件应先人工取证,不能用重放命令替代数据库备份。

当前不支持 / 已知限制

  • 把一张小票拆成多个商品
  • 在批量记账消息中混入修改、撤销、查询、导出或报告动作
  • 飞书对话中按关键词全文搜索账目(Dashboard 支持关键词、分类、时间与短 ID 筛选)
  • 批量按短 ID 修改/删除
  • JSON / Excel / PDF 导出(当前仅 CSV;JSON 不是正式能力)
  • 用户自定义分类、个人币种或个人时区
  • 按指定外币展示汇总或报告
  • 共享账本、账户余额和单月例外预算
  • 自定义预算提醒比例
  • 导出任务队列、公网下载链接、管理员全库导出
  • 企业多租户、组织树、复杂 RBAC 或共享账本
  • 多级审批、多人共享确认(确认只属于当前用户)
  • 普通用户的结果/事件重放命令(仅 Dashboard 管理员可使用受控运维入口)
  • 视频、表情等非文字、非图片、非音频消息

v0.3.0 高风险确认与 v0.4.0 Web Dashboard 已实现;Dashboard 配置见环境与部署指南

常见问题

机器人没有回复

群聊中先确认已经 @飞账。仍无回复时,请管理员检查机器人是否在群内、应用版本是否已发布、消息事件与权限是否配置完成,以及服务和长连接是否在线。

提示“处理失败了”

稍后重试,或换成更明确的表达:时间 + 用途/来源 + 金额 + 收入或支出(需要时)。如果持续失败,请管理员检查应用日志、AI 服务和数据库,但不要在工单或聊天中粘贴真实凭据或完整财务消息。

金额或分类识别错误

立即发送 上一笔改成…… 修正,例如 上一笔改成25元,分类改成交通。图片和语音记账后尤其应核对确认回复。

汇总结果为空

检查时间范围、收支方向和分类是否正确。可以先扩大范围,例如把 今天餐饮花了多少 改成 这个月花了多少

长连接一直未连接

请管理员确认事件模式为 websocket、App ID 与 App Secret 正确、容器能出站访问飞书,并查看 GET /healthz 和应用日志。Verification Token 与 Encrypt Key 不参与长连接认证。