FinPilot is an AI-powered zero-based budgeting copilot built as a WeChat Mini Program. Income is allocated 100% into budget buckets (with forced savings lock); spending is parsed from natural language, approved by a rule engine (LLM writes copy only), and tracked separately from payment accounts. Stack: Taro/React, FastAPI, SQLite, multi-LLM Provider Adapter, wx.login + Bearer auth.
FinPilot 是一款 AI 零基预算 Copilot 微信小程序。收入 100% 零基分仓(储蓄强制锁定),自然语言记消费,规则引擎审批额度(LLM 仅生成文案),预算仓与支付账户分离。技术栈:Taro/React、FastAPI、SQLite、多模型 LLM Adapter、微信静默登录。
AI 零基预算 Copilot — 微信小程序(Taro/React)+ FastAPI + SQLite。
收入先 100% 分入 Budget Bucket,储蓄仓强制锁定(可支配 = 收入 − 储蓄分仓);消费经 NL 解析后由规则引擎审批仓额度;LLM 只做结构化解析与文案。预算仓(能不能花)≠ 支付账户(从哪付)。领域规则与设计详见 docs/。
cd backend
python -m venv .venv
.\.venv\Scripts\Activate.ps1
pip install -r requirements.txt
copy .env.example .env
python -m uvicorn app.main:app --reload --host 0.0.0.0 --port 8000API 文档与健康检查:http://127.0.0.1:8000/docs
真机 / 微信登录测试:在 .env 填入 WECHAT_APP_SECRET(与 miniapp/project.config.json 的 AppID 一致)。配置后后端将拒绝 X-User-Id bypass,小程序启动时强制 wx.login。
cd miniapp
npm install
npm run dev:weapp用微信开发者工具打开 miniapp/(miniprogramRoot = dist/);本地开发勾选「不校验合法域名」。
| 场景 | miniapp/config/dev.ts |
|---|---|
| 本机模拟器 | TARO_APP_API_BASE: "http://127.0.0.1:8000" |
| 局域网真机 | 改为电脑 WLAN IP,如 "http://192.168.1.13:8000"(URL 勿含空格) |
| 跳过登录(仅模拟器) | TARO_APP_ALLOW_DEV_USER: "true" |
默认 TARO_APP_ALLOW_DEV_USER: "false",真机扫码会走微信登录。
编辑 backend/.env:
| Provider | 配置 |
|---|---|
| Ollama(默认本地) | LLM_PROVIDER=ollama,OLLAMA_MODEL=qwen3.5:2b |
| 通义 DashScope | LLM_PROVIDER=dashscope,填 DASHSCOPE_API_KEY |
| DeepSeek | LLM_PROVIDER=deepseek,填 DEEPSEEK_API_KEY |
无需域名,仅跑 API 容器:见 docs/deploy-local.md
90 秒演示脚本(含 seed 与口播):docs/demo-90s.md
curl.exe -X POST http://127.0.0.1:8000/v1/demo/seed -H "X-User-Id: 1"
# 需未配置 WECHAT_APP_SECRET,或带 Bearer tokenminiapp (Taro) --HTTP--> FastAPI /v1
├── auth (wx.login → Bearer)
├── incomes (零基校验)
├── transactions + approval rules
├── ai (parse / approve)
├── analysis (聚合 + 文案)
├── buckets (预算仓 CRUD)
└── llm/* Provider Adapter
- 收入到账后:可支配额度 = 收入 − 储蓄分仓金额;非储蓄仓消费不得超出可支配池。
- 当 收入 − 总支出 < 储蓄分仓金额 时,判定为已动用储蓄(含非储蓄超支与储蓄仓直接支出)。
- 审批时非储蓄仓的可用剩余 =
min(仓剩余, 可支配池剩余)。
cd backend
.\.venv\Scripts\Activate.ps1
pytest -q- 非银行级账务;账户无真实余额同步
- 微信登录需配置 AppSecret;开发可临时设
TARO_APP_ALLOW_DEV_USER=true跳过 - 支持自定义预算仓;系统储蓄仓不可删除
- 审批建议与月度结论中的定性描述非审计结论
- 体验版上云(域名 + HTTPS)见
docs/deploy-experience.md,当前可暂缓
© 2026 Bosx HUO(@SomeH-Bosx)。保留所有权利。
本项目为个人作品集,未经授权请勿用于商业用途或再分发。