Skip to content

CostFlow ​

面向 AI 应用的用量、成本与计费系统

CostFlow 会基于现有的开源项目进行二次开发。

我们不会重新搭一套用户、权限、管理后台和基础工程,而是直接进入一个已经具备完整业务结构的 Java 项目,在现有系统中逐步增加一套可以复用的用量、成本与计费能力。

我们基于什么项目开发 ​

CostFlow 的开发底座是 RuoYi Vue Pro 。

RuoYi Vue Pro 本身已经是一套比较完整的 Java 企业应用开发体系,拥有用户、权限、管理后台以及大量现成的业务和基础模块。

这意味着进入 CostFlow 以后,我们面对的不是一个只有几个 Controller 和 Service 的空项目。

系统已经有自己的模块划分、代码规范、权限体系、数据模型和前后端交互方式。

我们首先要做的是读懂它。

然后再去想:

一套新的计费能力,应该怎样合理地进入这样一个已有系统?

这和从零创建一个项目有很大的区别。

很多功能单独写并不困难,真正困难的是把它放进现有工程以后,仍然能够和原来的模块正常协作,并且给后续扩展留下空间。

为什么选择 RuoYi Vue Pro ​

选择 RuoYi Vue Pro,一个很重要的原因是它给 CostFlow 提供了足够完整的工程环境。

用户、权限、管理后台、数据库访问以及很多通用基础能力已经存在,我们不需要先花大量时间重新搭建这些内容。

这样就可以把更多注意力放在计费系统真正需要解决的问题上。

同时还有几个比较现实的考虑。

首先,它在 GitHub、Gitee 等平台都有较高的社区关注度,也已经被不少中小型企业项目采用。对学习者来说,这意味着它不是一个只停留在示例代码里的项目,而是有真实使用背景的开源工程。

其次,它的架构和模块划分相对清晰,整体并不复杂。对于第一次阅读一个企业级 Java 项目的人来说,既能接触到真实的工程结构,又不至于一开始就被过度复杂的架构挡在门外。

另外,RuoYi Vue Pro 已经提供了 CRM、MES 等不少现成能力。CostFlow 可以直接建立在这些已有模块和基础设施之上,把重点放到计费能力如何接入现有系统,而不是重复实现一套完整的企业管理平台。

这也更贴近大多数实际工作中的开发方式。很多项目并不是从一个空文件夹开始,而是在已有系统上继续开发、修复问题和扩展模块。

需求从哪里来 ​

RuoYi Vue Pro 已经自带一个 AI 模块,主要有 AI 对话、AI 写作、AI 思维导图以及 RAG 等功能。

这是面向企业应用的一个模块,但是作为一个企业级应用模块,却缺少了商业化最重要的功能,统计计费功能。

一个用户用了哪些模型?调用了多少次?消耗了多少Token?费用是多少?

这些都是真实的需求。

所以 CostFlow 就来解决这些需求。

我们准备开发什么 ​

目前可以先把它理解成:

Usage → Metering → Pricing → Billing

Usage:到底用了什么 ​

Usage 负责记录一次真实发生的资源消耗。

例如:

谁在什么时候使用了什么资源,使用了多少。

后面的所有计算,首先都建立在 Usage 可靠的前提下。

因此这里很快就会遇到数据模型、唯一标识、重复上报以及扩展不同资源类型等问题。

Metering:到底用了多少 ​

原始 Usage 不一定能够直接拿来计费。

有的资源按照调用次数计算,有的按照数量,有的可能需要聚合以后再参与计费。

Metering 负责把原始用量转换成真正可以参与后续计算的数据。

Pricing:这些用量值多少钱 ​

知道用了多少之后,还要知道怎么算钱。

不同资源可能有不同单价,不同规格可能使用不同规则,未来价格还可能发生变化。

Pricing 负责管理这些计价规则。

Billing:最终产生多少费用 ​

最后再把用量和价格真正连接起来。

系统需要能够得到最终费用,并支持后续查询、统计和核对。

做到这里,才算真正打通:

资源使用 → 用量记录 → 计量 → 定价 → 费用

这一整条链路。

和 Agent 怎么连接 ​

CostFlow 第一阶段不会把所有设计都限定在 Agent 上。

我们会先把通用的 Usage、Metering、Pricing 和 Billing 做清楚。

之后再逐渐加入 AI 应用特有的资源。

例如一次模型请求可以产生:

text
Model Usage
├── Input Token
├── Output Token
└── Model

一次 Agent 执行可能进一步包含:

text
Agent Run
├── LLM Call
├── LLM Call
├── Tool Call
├── Third-party API
└── Other Usage

最终我们希望能够进一步回答:

一次 Agent 任务到底花了多少钱?

成本主要来自哪里?

某个用户、应用或者 Agent 一段时间内消耗了多少资源?

这些会成为 CostFlow 后续向 AI 应用方向继续演进的重要内容。

会用到哪些技术 ​

CostFlow 会尽量沿用 RuoYi Vue Pro 现有的技术体系进行开发,而不是为了某个功能随意更换整套工程技术。

主要会接触到:

  • Java
  • Spring Boot
  • Spring AI
  • MyBatis Plus
  • MySQL
  • Redis
  • 权限与认证体系
  • REST API
  • Vue 管理端
  • 数据库设计
  • 事务与数据一致性
  • 幂等与并发
  • 单元测试与集成测试
  • 日志与可观测性

如果后面确实出现异步处理、消息驱动或者更加复杂的计费需求,再根据实际问题继续引入新的技术。

技术栈会跟着需求走,而不是反过来为了使用某项技术制造需求。

项目难度 ​

CostFlow 整体属于:

中等起步,后期逐渐提高。

前期主要是理解现有项目、需求拆解、数据建模以及基础业务实现。

如果已经能够独立完成一个普通 Spring Boot CRUD 项目,前面的内容应该可以比较顺利地跟下来。

真正开始增加难度的部分会出现在:

  • 模块边界
  • 事务
  • 幂等
  • 并发
  • 数据一致性
  • Pricing 规则演进
  • 历史数据处理
  • 可扩展设计

从哪里开始 ​

正式开始 CostFlow 之前,我们首先要解决的不是数据库表应该怎么建。

第一步应该先认识我们真正要修改的系统。

接下来,我们会先进入 RuoYi Vue Pro 现有工程,看看它现在有哪些模块、项目是怎样组织的、哪些基础能力可以直接复用,以及 CostFlow 第一版计费模块应该从哪里开始。