📡 ChatGPT Actions × CAU Accounting

ChatGPT 接入向导

让你在 ChatGPT 里直接「把这张发票发给 CAU 记账」。 ChatGPT 把上传的文件通过 Actions 推到 CAU,写入 financial_inbox, 自动跑 ReceiptAgent 生成草稿仕訳,最终再由你在 CAU 系统里 approve。

← 回系统首页
登录状态
检测中…
当前 Origin
检测中…
ChatGPT 可达性
检测中…
OAuth 凭证
检测中…

🔗 它怎么工作?

整条链路 5 个角色:

┌──────────┐    上传发票     ┌──────────┐   Action POST    ┌──────────┐
│   你     │ ─────────────▶ │ ChatGPT  │ ─────────────▶ │   CAU    │
│ (浏览器) │ "请把这张发票  │ Custom   │ openaiFileIdRefs│ /gpt-    │
│          │  发给 CAU"     │   GPT    │ (含临时下载链接)│ actions  │
└──────────┘                └──────────┘                 └────┬─────┘
                                                              │ 下载文件
                                                              ▼
                                                       financial_inbox
                                                              │ 自动跑
                                                              ▼
                                                       ReceiptAgent
                                                              │ 生成
                                                              ▼
                                                       仕訳草稿 (pending)
                                                              │ 你在 CAU
                                                              ▼
                                                       审核 / 入账

⚠️ ChatGPT 只能"提交草稿",不能直接入账。这是设计上的边界—— AI 错了你能回滚,最终 posting 一定要走 CAU 的 approval 流程。

1
让 CAU 有一个 HTTPS 公网地址 必需

ChatGPT 在 OpenAI 云端跑,不能访问你 127.0.0.1。 你需要把 CAU 暴露到一个 HTTPS 公网域名。3 种方式从快到慢:

方式 A: ngrok(最快、5 分钟)

免费版重启会换域名,调试合适;正式用买固定域名。

# 1. 装一次
choco install ngrok          # 或去 https://ngrok.com/download

# 2. 注册账号、贴 authtoken(一次性)
ngrok config add-authtoken YOUR_TOKEN

# 3. 启动隧道(CAU 后端跑在 8000)
ngrok http 8000

# 输出会给你: https://xxxx-xxx.ngrok-free.app  ← 这就是公网域名
方式 B: Cloudflare Tunnel(免费、域名固定、性能好)
# 装 cloudflared,登录绑你自己的域名
cloudflared tunnel login

# 创建一个 tunnel
cloudflared tunnel create cau

# 把 cau.yourdomain.com 路由到本地 8000
cloudflared tunnel route dns cau cau.yourdomain.com
cloudflared tunnel run --url http://localhost:8000 cau
方式 C: 部署到 Railway / Render / Cloud Run(生产环境)

项目已含 railway.tomlDockerfile。Railway 一键部署最简单。

# Railway
railway up

# 或 Render: 在 dashboard 选 "New Web Service" 指向你的 GitHub repo
# Cloud Run: gcloud run deploy cau --source .
📍 写下你拿到的 HTTPS 公网域名 (后续会自动填进 OpenAPI yaml)
2
设置 OAuth Client ID / Secret 可选但推荐

在 CAU 后端环境变量里设两个值,避免任何人都能用你的 Actions 端点:

# .env(项目根目录)添加两行,随便生成两个长字符串
GPT_ACTION_CLIENT_ID=cau_action_REPLACE_ME
GPT_ACTION_CLIENT_SECRET=用 openssl rand -hex 32 生成的随机串
Client ID(你自己定)
Client Secret(一键随机生成)

⚠️ 改完 .env 后必须重启 server,环境变量才生效。 如果不设置这两个值,oauth/authorize 端点会跳过校验——本地测试可以,公网慎用。

3
复制 OpenAPI Schema(已自动替换你的域名)

ChatGPT Custom GPT 需要一个 OpenAPI YAML。下面这份是项目自带的 docs/CHATGPT_ACTION_OPENAPI.yaml,已把 servers.url 自动替换成你 Step 1 填的域名。

📄 预览 YAML 内容
加载中…
4
在 ChatGPT 创建 Custom GPT + 配置 Action

打开 chatgpt.com/gpts/editor → 新建 GPT → 切到 Configure tab → 拉到底 → 点 Create new action

① Schema

把 Step 3 复制的 YAML 整段粘贴到 Schema 文本框。

② Authentication → OAuth

Client ID
Client Secret
Authorization URL
Token URL
Scope(空格分隔)
Token Exchange Method

③ Instructions(Custom GPT 系统提示,建议加上)

④ 保存后

ChatGPT 会自动加一个 redirect URI(形如 https://chatgpt.com/aip/g-xxx/oauth/callback)。 我们后端对 chatgpt.com/aip/chat.openai.com/aip/ 都已 whitelist,不需要额外配置。

5
测试 + 排错

在你的 Custom GPT 对话框里输入下面任一句,验证整条链路:

把这张发票上传到 CAU 系统记账
5月福山運送費的請求書,請幫我提交給 CAU 生成草稿仕訳

预期:

本地直连测试(不经过 ChatGPT)

用下面这个按钮直接 ping /health,确认本地后端正常:

❓ FAQ

Q: ChatGPT 提示 "invalid redirect_uri"?
说明 ChatGPT 给的 redirect URI 不在白名单里。看 backend/modules/oauth/__init__.py_allowed_redirect_uri,目前只接受 https://chatgpt.com/aip/https://chat.openai.com/aip/ 开头。要扩白名单就在这函数里加。
Q: ChatGPT 提示 "未连接/401"?
你 CAU 的浏览器会话已过期。先到 CAU 登录页 登录,然后回 ChatGPT 重新触发 OAuth flow(清掉 Custom GPT 里之前的认证再连一次)。
Q: ChatGPT 上传文件,CAU 收到 0 字节?
说明 download_link 已过期(OpenAI 临时链接 TTL 很短)。让用户在 ChatGPT 里重新上传触发新链接即可。代码里已经做了空文件 400 拒绝。
Q: 怎么撤回一笔 AI 生成的草稿仕訳?
所有从 ChatGPT 进来的都是 status=pending。回 CAU → AI 自治记账页 → 找到那条 → ✗ 拒绝;同时收件箱里也会保留原文件,可重传。
Q: 一次能传几张?
单次最多 10 个文件,单文件 20 MB。超过会返回 400/413。
Q: 怎么不让 ChatGPT 自动跑 ReceiptAgent,只入收件箱?
在 ChatGPT 端发起调用时把 auto_process 设为 false(或在 Custom GPT Instructions 里告诉它)。文件还是会进 financial_inbox,但不会立即生成仕訳草稿,等你在 CAU 里手动选 "🤖 让 AI 起票"。