- 新增计费模块:执行开始建单、终态结算/取消/失败处理,支持按条/按秒/按token计费 - 新增执行生命周期跟踪:优雅关停时取消运行中执行并等待落库 - 新增异步任务等待/通知机制(Wait/Notify) - 重构执行记录落库与进度上报,统一失败分类与重试语义 - 重命名文件:async_task.go→async.go、flow_checkpoint_store.go→exec_checkpoint.go、flow_graph_util.go→exec_record.go - 更新 .gitignore 与数据库密码配置
69 lines
2.5 KiB
Go
69 lines
2.5 KiB
Go
package flow
|
||
|
||
import (
|
||
"ai-agent/workflow/consts/node"
|
||
flowDto "ai-agent/workflow/model/dto/flow"
|
||
"ai-agent/workflow/model/entity"
|
||
"context"
|
||
"encoding/json"
|
||
"time"
|
||
|
||
flowDao "ai-agent/workflow/dao/flow"
|
||
|
||
"github.com/cloudwego/eino/compose"
|
||
"github.com/cloudwego/eino/schema"
|
||
)
|
||
|
||
// 注册 checkpoint 序列化类型
|
||
func init() {
|
||
// ========== 1. Eino 断点核心状态(根类型) ==========
|
||
schema.RegisterName[*flowDto.NodeExecutionState]("flow.NodeExecutionState")
|
||
schema.RegisterName[*flowDto.NodeExecutionInput]("flow.NodeExecutionInput")
|
||
schema.RegisterName[*flowDto.FlowExecutionInput]("flow.FlowExecutionInput")
|
||
|
||
// ========== 2. 原有第三方类型 ==========
|
||
schema.RegisterName[json.Number]("json.Number")
|
||
schema.RegisterName[time.Time]("time.Time")
|
||
schema.RegisterName[time.Duration]("time.Duration")
|
||
|
||
// ========== 3. flowDto 内部嵌套类型 ==========
|
||
schema.RegisterName[flowDto.ExecutedNode]("flow.ExecutedNode")
|
||
|
||
// ========== 4. entity 核心链路类型(递归自 *entity.FlowNode) ==========
|
||
schema.RegisterName[*entity.FlowNode]("entity.FlowNode")
|
||
schema.RegisterName[node.NodeType]("node.NodeType")
|
||
schema.RegisterName[*entity.SubFlowConfig]("entity.SubFlowConfig")
|
||
//schema.RegisterName[node.NodeFormField]("node.NodeFormField")
|
||
schema.RegisterName[entity.ModelItem]("node.ModelItem")
|
||
|
||
// ========== 5. FlowInfo 相关(流程拓扑结构) ==========
|
||
schema.RegisterName[entity.FlowInfo]("entity.FlowInfo")
|
||
schema.RegisterName[entity.FlowEdge]("entity.FlowEdge")
|
||
}
|
||
|
||
// DbCheckPointStore 数据库存储实现
|
||
type DbCheckPointStore struct{}
|
||
|
||
func NewDbCheckPointStore() compose.CheckPointStore {
|
||
return &DbCheckPointStore{}
|
||
}
|
||
|
||
func (d *DbCheckPointStore) Get(ctx context.Context, id string) ([]byte, bool, error) {
|
||
// 去掉取消信号:断连/取消场景下 graph ctx 已取消,仅保留值,避免恢复时被阻断
|
||
record, err := flowDao.FlowCheckpointDao.Get(context.WithoutCancel(ctx), id)
|
||
if err != nil {
|
||
return nil, false, err
|
||
}
|
||
if record == nil || record.Data == "" {
|
||
return nil, false, nil
|
||
}
|
||
return []byte(record.Data), true, nil
|
||
}
|
||
|
||
func (d *DbCheckPointStore) Set(ctx context.Context, id string, val []byte) error {
|
||
// 关键:Eino 在节点失败(Interrupt)时用 graph ctx 写 checkpoint。WS 断连/用户终止会使
|
||
// 该 ctx 已取消,直接透传会因 "context canceled" 落库失败,断点丢失、续跑失效。
|
||
// 去掉取消信号只保留 ctx 值,保证中断时断点必达。
|
||
return flowDao.FlowCheckpointDao.SaveOrUpdate(context.WithoutCancel(ctx), id, string(val))
|
||
}
|