2026-05-20 21:39:12 +08:00
[
{
"id" : "BE-100" ,
"category" : "agent-swarm" ,
"priority" : 0 ,
"description" : "Agent Swarm 基础架构 - Skill基类/注册表/数据库表" ,
"steps" : [
"创建 agent 模块目录结构" ,
"创建 agent_skill / agent_session / agent_message 三张表的 Entity" ,
"实现 BaseSkill 基类" ,
"实现 SkillRegistryService 注册表服务" ,
"验证 pnpm dev 启动正常,新表自动创建"
] ,
"passes" : true
} ,
{
"id" : "BE-101" ,
"category" : "agent-swarm" ,
"priority" : 0 ,
"description" : "Supervisor Agent 核心 - 对话服务和SSE流式API" ,
"steps" : [
"实现 SupervisorService (createAgent + streamEvents)" ,
"实现 AgentSessionService 会话管理" ,
"实现 AgentMessageService 消息持久化" ,
"实现 OpenAgentChatController (/open/agent/chat SSE)" ,
"验证空 Skill 列表下 Supervisor 能正常对话" ,
"验证 SSE 流式输出到前端"
] ,
"passes" : true
} ,
{
"id" : "BE-102" ,
"category" : "agent-swarm" ,
"priority" : 0 ,
"description" : "Skill CRUD 管理 API" ,
"steps" : [
"实现 AdminAgentSkillController (Skill 列表/详情/启停)" ,
"实现 Skill 自动注册 (启动时扫描 skills/ 目录)" ,
"实现 Skill 状态同步到数据库" ,
"验证 POST /open/agent/skill/list 返回 Skill 列表" ,
"验证启停 Skill 功能"
] ,
"passes" : true
} ,
{
"id" : "BE-103" ,
"category" : "agent-swarm" ,
"priority" : 0 ,
"description" : "[已废弃] 原视频划痕检测单一Skill, 已拆分为 BE-110~BE-116" ,
"steps" : [ ] ,
"passes" : false
} ,
{
"id" : "BE-104" ,
"category" : "agent-swarm" ,
"priority" : 0 ,
"description" : "[已废弃] 原视频划痕检测单一Skill, 已拆分为 BE-110~BE-116" ,
"steps" : [ ] ,
"passes" : false
} ,
{
"id" : "BE-105" ,
"category" : "agent-swarm" ,
"priority" : 0 ,
"description" : "Skill 提示词自定义 - 后端API支持提示词查看/编辑/持久化" ,
"steps" : [
"BaseSkill 增加 getPrompts/customPrompts/setCustomPrompts 方法" ,
"各 Skill 实现 getPrompts 返回各自提示词" ,
"SkillRegistryService 增加 getSkillPrompts/updateSkillPrompts 方法" ,
"AdminAgentSkillController 增加 GET /prompts 和 POST /updatePrompts 接口" ,
"syncFromDB 时从 config.prompts 加载自定义提示词" ,
"getSystemPrompt 优先使用自定义提示词" ,
"验证 API 端到端: 获取→修改→持久化→重启后恢复"
] ,
"passes" : true
} ,
{
"id" : "BE-110" ,
"category" : "video-scratch" ,
"priority" : 0 ,
"description" : "Workspace 共享存储服务 - Skill间数据传递机制" ,
"steps" : [
"创建 WorkspaceService 管理临时目录生命周期" ,
"workspace/{taskId}/ 目录结构: frames/ marked_frames/ *.json report.html" ,
"提供 create/get/cleanup 方法" ,
"提供静态文件访问接口 /open/agent/workspace/{taskId}/report.html" ,
"验证目录创建、文件读写、清理正常"
] ,
"passes" : true
} ,
{
"id" : "BE-111" ,
"category" : "video-scratch" ,
"priority" : 0 ,
"description" : "视频抽帧 Skill (video_frame_extractor) - 纯计算, 不需LLM" ,
"steps" : [
"创建 skills/video_frame_extractor/index.ts 继承 BaseSkill" ,
"实现 extract_frames tool: ffmpeg 按指定fps抽帧" ,
"可配置参数: fps(默认5), quality(默认90)" ,
"输出: workspacePath + frames/frame_XXXX.jpg + video_info.json" ,
"注册到 SkillRegistry, 验证启动正常" ,
"验证 ffmpeg 抽帧输出正确"
] ,
"passes" : true
} ,
{
"id" : "BE-112" ,
"category" : "video-scratch" ,
"priority" : 0 ,
"description" : "旧伤检测 Skill (damage_detector) - 多模态LLM批量检测" ,
"steps" : [
"创建 skills/damage_detector/index.ts 继承 BaseSkill" ,
"实现 detect_damages tool: 分批读取frames/, base64编码发给LLM" ,
"可配置: 模型(默认豆包)、检测提示词、batchSize(默认50)、batchDelay(默认2s)" ,
"输出: workspace/damages.json (damages[] + batchResults[])" ,
"验证分批检测返回损伤列表JSON"
] ,
"passes" : true
} ,
{
"id" : "BE-113" ,
"category" : "video-scratch" ,
"priority" : 0 ,
"description" : "损伤定位标注 Skill (damage_grounding) - 豆包grounding+sharp画框" ,
"steps" : [
"创建 skills/damage_grounding/index.ts 继承 BaseSkill" ,
"实现 ground_damages tool: 读取damages.json, 找时间窗口帧, 逐帧调豆包grounding API" ,
"解析 <bbox>x1 y1 x2 y2</bbox> 坐标, 用sharp在图片上画红色矩形" ,
"模型固定为豆包(仅豆包支持grounding),可配置: 定位提示词、groundingWindow(默认2s)" ,
"输出: workspace/grounding.json + marked_frames/*.jpg" ,
"验证bbox定位和画框正确"
] ,
"passes" : true
} ,
{
"id" : "BE-114" ,
"category" : "video-scratch" ,
"priority" : 0 ,
"description" : "最佳帧筛选 Skill (best_frame_selector) - LLM选帧+启发式备选" ,
"steps" : [
"创建 skills/best_frame_selector/index.ts 继承 BaseSkill" ,
"实现 select_best_frames tool: 读取grounding.json, 帧数>3调LLM选择, ≤3启发式评分" ,
"可配置: 模型(默认豆包)、筛选提示词、topN(默认1)" ,
"输出: 更新 workspace/grounding.json 中 isBest 标记 + reasons" ,
"验证最佳帧筛选逻辑正确"
] ,
"passes" : true
} ,
{
"id" : "BE-115" ,
"category" : "video-scratch" ,
"priority" : 0 ,
"description" : "检测报告生成 Skill (scratch_report_generator) - LLM汇总+HTML报告" ,
"steps" : [
"创建 skills/scratch_report/index.ts 继承 BaseSkill" ,
"实现 generate_report tool: 读取所有前序JSON, 调LLM生成智能汇总" ,
"生成HTML报告: 统计卡片+损伤表格+最佳帧展示+处理建议" ,
"可配置: 模型(默认豆包)、汇总提示词" ,
"输出: workspace/summary.json + report.html" ,
"验证报告生成完整且可访问"
] ,
"passes" : true
} ,
{
"id" : "BE-116" ,
"category" : "video-scratch" ,
"priority" : 0 ,
"description" : "清理旧 VideoScratchSkill + 端到端集成测试" ,
"steps" : [
"删除旧的 skills/video_scratch/ 目录" ,
"更新 AgentEvent 注册5个新Skill替代旧的1个" ,
"更新 Supervisor 系统提示词, 描述5个Skill的协作流程" ,
"端到端测试: 通过对话触发完整检测流程 视频→抽帧→检测→定位→选帧→报告" ,
"验证 Skill 管理页面显示5个独立Skill"
] ,
"passes" : true
} ,
{
"category" : "infrastructure" ,
"priority" : 1 ,
"description" : "项目基础框架搭建( Cool Admin + Midway.js) " ,
"steps" : [
"安装依赖 pnpm i" ,
"启动开发服务器 pnpm dev" ,
"验证 http://localhost:8001 可访问" ,
"验证数据库连接正常" ,
"验证自动建表正常"
] ,
"passes" : true
} ,
{
"id" : "BE-002" ,
"category" : "infrastructure" ,
"priority" : 1 ,
"description" : "权限系统基础功能(用户/角色/菜单/部门CRUD) " ,
"steps" : [
"POST /admin/login 登录成功返回Token" ,
"GET /admin/info 获取当前用户信息" ,
"POST /admin/sys/user/page 分页查询用户" ,
"POST /admin/sys/role/page 分页查询角色" ,
"POST /admin/sys/menu/list 获取菜单列表" ,
"验证JWT权限校验中间件工作正常"
] ,
"passes" : true
} ,
{
"id" : "BE-003" ,
"category" : "infrastructure" ,
"priority" : 1 ,
"description" : "流程引擎框架( flow模块CRUD + 执行引擎)" ,
"steps" : [
"POST /admin/flow/info/add 创建流程" ,
"POST /admin/flow/info/update 更新流程(draft JSON)" ,
"POST /admin/flow/info/release 发布流程" ,
"验证 LangGraph StateGraph 执行引擎初始化" ,
"验证13种节点类型注册正常"
] ,
"passes" : true
} ,
{
"id" : "BE-004" ,
"category" : "infrastructure" ,
"priority" : 1 ,
"description" : "知识库框架( know模块基础功能) " ,
"steps" : [
"创建知识库类型" ,
"添加数据源" ,
"添加知识条目" ,
"验证向量存储配置"
] ,
"passes" : true
} ,
{
"id" : "BE-005" ,
"category" : "functional" ,
"priority" : 2 ,
"description" : "流程调试功能 - 通过API调试编排好的流程" ,
"steps" : [
"POST /admin/flow/run/debug 发送调试请求" ,
"验证开始节点接收输入参数" ,
"验证LLM节点调用大模型成功" ,
"验证结束节点返回输出" ,
"验证执行日志写入 flow_log 表"
] ,
"passes" : false
} ,
{
"id" : "BE-006" ,
"category" : "functional" ,
"priority" : 2 ,
"description" : "流程调用接口 - 外部系统通过API调用已发布流程" ,
"steps" : [
"POST /open/flow/run/invoke 调用已发布流程" ,
"验证流式输出(SSE)正常工作" ,
"验证非流式输出正常返回JSON" ,
"验证执行结果写入 flow_result 表" ,
"验证未发布流程返回错误"
] ,
"passes" : false
} ,
{
"id" : "BE-007" ,
"category" : "functional" ,
"priority" : 2 ,
"description" : "MCP协议服务 - 将流程暴露为MCP Tool供客户端调用" ,
"steps" : [
"GET /open/mcp/sse/{label} SSE连接建立" ,
"验证已发布流程转换为MCP Tool" ,
"验证客户端能拉取Tool列表" ,
"验证客户端能调用Tool并获得结果" ,
"验证未发布流程不暴露"
] ,
"passes" : false
} ,
{
"id" : "BE-008" ,
"category" : "functional" ,
"priority" : 2 ,
"description" : "LLM节点 - 支持多模型提供商的大模型调用" ,
"steps" : [
"配置智谱AI模型并调用成功" ,
"配置通义千问模型并调用成功" ,
"配置DeepSeek模型并调用成功" ,
"验证流式输出正常" ,
"验证Prompt模板变量替换正常"
] ,
"passes" : false
} ,
{
"id" : "BE-009" ,
"category" : "functional" ,
"priority" : 2 ,
"description" : "代码执行节点 - 在流程中执行自定义JavaScript代码" ,
"steps" : [
"编写简单代码节点并执行" ,
"验证代码节点可访问上下文数据" ,
"验证代码节点可访问数据库" ,
"验证代码执行错误被正确捕获" ,
"验证代码模板功能"
] ,
"passes" : false
} ,
{
"id" : "BE-010" ,
"category" : "functional" ,
"priority" : 2 ,
"description" : "条件判断节点 - 根据条件分支执行不同路径" ,
"steps" : [
"创建包含判断节点的流程" ,
"验证条件为true时走正确分支" ,
"验证条件为false时走正确分支" ,
"验证多分支判断" ,
"验证表达式求值正常"
] ,
"passes" : false
} ,
{
"id" : "BE-011" ,
"category" : "functional" ,
"priority" : 2 ,
"description" : "知识库检索节点 - 在流程中检索知识库内容" ,
"steps" : [
"创建知识库并导入测试数据" ,
"创建包含知识库节点的流程" ,
"验证向量检索返回相关内容" ,
"验证检索结果作为上下文传递给后续节点" ,
"验证重排序功能"
] ,
"passes" : false
} ,
{
"id" : "BE-012" ,
"category" : "functional" ,
"priority" : 3 ,
"description" : "子流程调用节点 - 在流程中调用其他已发布流程" ,
"steps" : [
"创建两个流程A和B" ,
"在流程A中添加子流程节点调用B" ,
"验证参数传递正常" ,
"验证返回值正常" ,
"验证循环调用检测"
] ,
"passes" : false
} ,
{
"id" : "BE-013" ,
"category" : "functional" ,
"priority" : 3 ,
"description" : "插件系统 - 动态加载和执行插件" ,
"steps" : [
"上传插件文件" ,
"验证插件加载成功" ,
"验证插件在流程中可被调用" ,
"验证插件卸载功能"
] ,
"passes" : false
} ,
{
"id" : "BE-014" ,
"category" : "functional" ,
"priority" : 3 ,
"description" : "定时任务 - 任务调度和执行" ,
"steps" : [
"创建Cron定时任务" ,
"验证任务按计划执行" ,
"验证任务日志记录" ,
"验证任务暂停/恢复"
] ,
"passes" : false
} ,
{
"id" : "BE-015" ,
"category" : "integration" ,
"priority" : 4 ,
"description" : "TYCM审核对接 - 投保订单AI审核流程" ,
"steps" : [
"设计投保审核流程节点编排" ,
2026-05-21 11:20:19 +08:00
"实现TYCM→GPU Guard的API对接接口" ,
2026-05-20 21:39:12 +08:00
"接收投保订单数据" ,
"OCR识别证件/材料" ,
"规则校验" ,
"AI推理判断" ,
"返回审核结果给TYCM" ,
"审核日志记录"
] ,
"passes" : false
} ,
{
"id" : "BE-016" ,
"category" : "integration" ,
"priority" : 4 ,
"description" : "TYCM审核对接 - 理赔订单AI审核流程" ,
"steps" : [
"设计理赔审核流程节点编排" ,
2026-05-21 11:20:19 +08:00
"实现TYCM→GPU Guard的API对接接口" ,
2026-05-20 21:39:12 +08:00
"接收理赔申请数据" ,
"图片/视频OCR分析" ,
"损伤评估" ,
"理赔规则校验" ,
"AI综合判断" ,
"返回审核结果给TYCM" ,
"审核日志记录"
] ,
"passes" : false
} ,
{
"id" : "BE-017" ,
"category" : "integration" ,
"priority" : 4 ,
"description" : "TYCM审核对接 - 审核结果回调机制" ,
"steps" : [
"实现异步审核结果回调" ,
"回调TYCM系统更新订单状态" ,
"回调失败重试机制" ,
"回调日志记录"
] ,
"passes" : false
} ,
{
"id" : "BE-018" ,
"category" : "infrastructure" ,
"priority" : 5 ,
"description" : "生产环境部署 - MySQL 8+ 配置" ,
"steps" : [
"配置 config.prod.ts MySQL连接" ,
"验证数据库迁移" ,
"Docker镜像构建和部署" ,
"验证生产环境功能正常"
] ,
"passes" : false
} ,
{
"id" : "BE-019" ,
"category" : "functional" ,
"priority" : 3 ,
"description" : "流程执行日志和结果查询" ,
"steps" : [
"GET /admin/flow/log/page 分页查询执行日志" ,
"GET /admin/flow/result/page 分页查询执行结果" ,
"验证按flowId/requestId/sessionId筛选" ,
"验证定时清理任务( 2天结果/10天日志) "
] ,
"passes" : false
} ,
{
"id" : "BE-020" ,
"category" : "functional" ,
"priority" : 3 ,
"description" : "知识图谱 - 实体关系建模和检索" ,
"steps" : [
"创建知识图谱节点" ,
"创建实体关系" ,
"验证图谱检索" ,
"验证图谱可视化数据接口"
] ,
"passes" : false
} ,
{
"id" : "BE-130" ,
"category" : "agent-evolution" ,
"priority" : 0 ,
"description" : "Skill规范化 - agent_skill表增加skillType字段 + BaseSkill增加skillType属性 + 5个现有Skill设置类型" ,
"steps" : [
"【Entity】修改 src/modules/agent/entity/skill.ts: 在 category 字段后新增 skillType 字段: @Column({ comment: 'Skill类型 compute=纯计算 llm=需要LLM', length: 20, nullable: true }) skillType: string; — 因为 TypeORM synchronize=true 开发环境会自动加列" ,
"【BaseSkill】修改 src/modules/agent/skills/base_skill.ts: 在 abstract category 后新增 abstract skillType: 'compute' | 'llm'; 替代 isComputeOnly() 的硬编码方式,但保留 isComputeOnly() 方法改为 return this.skillType === 'compute'; 保持向下兼容" ,
"【getMeta】修改 base_skill.ts 的 getMeta() 方法: 返回值中新增 skillType: this.skillType" ,
"【types】修改 src/modules/agent/types/index.ts 的 SkillMeta 接口: 增加 skillType?: 'compute' | 'llm' 字段" ,
"【Skill-1】修改 skills/video_frame_extractor/index.ts: 添加 skillType: 'compute' as const = 'compute' (纯计算, 不依赖LLM)" ,
"【Skill-2】修改 skills/damage_detector/index.ts: 添加 skillType: 'llm' as const = 'llm' (多模态LLM检测, 虽然isComputeOnly=true是因为直接调工具, 但本质需要LLM)" ,
"【Skill-3】修改 skills/damage_grounding/index.ts: 添加 skillType: 'llm' as const = 'llm' (豆包grounding API)" ,
"【Skill-4】修改 skills/best_frame_selector/index.ts: 添加 skillType: 'llm' as const = 'llm' (LLM选帧)" ,
"【Skill-5】修改 skills/scratch_report/index.ts: 添加 skillType: 'llm' as const = 'llm' (LLM生成报告)" ,
"【syncToDB】修改 service/skill_registry.ts 的 syncToDB(): save和update时包含 skillType 字段" ,
"【验证】pnpm dev 启动正常,数据库 agent_skill 表自动新增 skillType 列, 5个Skill的skillType值正确写入" ,
"【难度评估】低难度。改动集中在属性声明,不涉及业务逻辑变更。注意 damage_detector 等4个LLM型Skill虽然当前 isComputeOnly()=true( 因为直接调tool不走内部Agent) , 但它们本质依赖LLM, skillType应设为'llm'"
] ,
"passes" : true
} ,
{
"id" : "BE-131" ,
"category" : "agent-evolution" ,
"priority" : 0 ,
"description" : "Skill规范化 - 5个Skill创建SKILL.md指令文件 + description增强(何时使用/前置条件)" ,
"steps" : [
"【规范参考】遵循 Agent Skills 开放规范(https://agentskills.io): SKILL.md = YAML frontmatter(name/description/metadata) + Markdown指令正文" ,
"【SKILL.md-1】创建 skills/video_frame_extractor/SKILL.md: frontmatter含 name:video-frame-extractor, skillType:compute, category:视频处理; 正文含 何时使用/输入要求(videoUrl)/执行流程(ffmpeg抽帧)/输出(taskId+frames/+video_info.json)/可配参数(fps/quality)" ,
"【SKILL.md-2】创建 skills/damage_detector/SKILL.md: frontmatter含 name:damage-detector, skillType:llm, category:视觉检测; 正文含 何时使用/前置条件(需先抽帧获得taskId)/输入要求(taskId)/执行流程(分批base64→多模态LLM)/输出(damages.json)/可配参数(batchSize/batchDelay/模型)" ,
"【SKILL.md-3】创建 skills/damage_grounding/SKILL.md: frontmatter含 name:damage-grounding, skillType:llm, category:视觉检测; 正文含 何时使用/前置条件(需先检测获得damages.json)/输入要求(taskId)/执行流程(豆包grounding→bbox→sharp画框)/输出(grounding.json+marked_frames/)/可配参数(groundingWindow)" ,
"【SKILL.md-4】创建 skills/best_frame_selector/SKILL.md: frontmatter含 name:best-frame-selector, skillType:llm, category:视觉检测; 正文含 何时使用/前置条件(需先定位标注获得grounding.json和marked_frames/)/输入要求(taskId)/执行流程(帧数>3走LLM,≤3启发式)/输出(更新grounding.json的isBest标记)/可配参数(topN/模型)" ,
"【SKILL.md-5】创建 skills/scratch_report/SKILL.md: frontmatter含 name:scratch-report, skillType:llm, category:视觉检测; 正文含 何时使用/前置条件(需先完成抽帧→检测→定位→选帧全流程)/输入要求(taskId)/执行流程(读取所有JSON→LLM汇总→生成HTML)/输出(summary.json+report.html)/可配参数(模型)" ,
"【description增强】修改5个Skill的index.ts中的description字段, 在原描述末尾追加前置条件说明: video_frame_extractor不变(无前置); damage_detector追加'前置条件: 需先使用video_frame_extractor抽帧获得taskId。'; damage_grounding追加'前置条件: 需先使用damage_detector检测获得damages.json。'; best_frame_selector追加'前置条件: 需先使用damage_grounding定位标注获得grounding.json。'; scratch_report追加'前置条件:需先完成抽帧→检测→定位→选帧全流程。'" ,
"【验证】5个SKILL.md文件存在且YAML frontmatter格式正确; description增强后pnpm dev启动正常" ,
"【难度评估】低难度。纯新增文件+字符串修改, 不影响运行时逻辑。SKILL.md当前仅作为文档存在, 后续BE-132会读取并注入到prompt"
] ,
"passes" : true
} ,
{
"id" : "BE-132" ,
"category" : "agent-evolution" ,
"priority" : 0 ,
"description" : "Skill规范化 - Supervisor注入<available_skills>XML格式替代字符串拼接" ,
"steps" : [
"【现状分析】当前 service/supervisor.ts 第85-94行: systemPrompt通过字符串拼接 '- ${skill.name}: ${skill.description}' 注入Skill列表, 格式简陋, 不符合Agent Skills规范" ,
"【改造目标】将Skill列表注入改为XML格式: <available_skills><skill><name>xxx</name><type>compute|llm</type><description>xxx</description></skill>...</available_skills>" ,
"【修改supervisor.ts】改造chat()方法第85-94行的systemPrompt拼接逻辑: 遍历enabledSkills, 生成XML格式字符串: 每个skill包含<name>、<type>(skillType)、<description>三个子元素" ,
"【保留兼容】systemPrompt基础部分(SUPERVISOR_SYSTEM_PROMPT常量)保持不变, 只改Skill列表注入格式" ,
"【可选增强】当Skill被激活(模型决定调用某Skill)时, 读取对应SKILL.md的正文内容注入为指令(渐进式加载,第二层)——此步为可选优化,首次实现可跳过" ,
"【验证】pnpm dev启动, 通过对话触发Skill调用, 查看日志中systemPrompt包含正确的XML格式; Supervisor仍能正确识别和调用Skill" ,
"【难度评估】低难度。只改字符串拼接格式, 不影响LangGraph createAgent的工作方式。XML注入是给模型看的上下文, 模型对XML和纯文本列表都能理解"
] ,
"passes" : true
} ,
{
"id" : "BE-133" ,
"category" : "agent-evolution" ,
"priority" : 0 ,
"description" : "Agent管理 - 新建agent_info Entity + AgentInfoService + Admin CRUD API" ,
"steps" : [
"【Entity】创建 src/modules/agent/entity/info.ts: @Entity('agent_info') class AgentInfoEntity extends BaseEntity, 字段: name(varchar100,unique), label(varchar200), description(text,nullable), icon(varchar100,nullable), systemPrompt(text,nullable), skills(json,nullable—存储string[]如['video_frame_extractor','damage_detector']), modelConfig(json,nullable—存储{apiKey,apiUrl,modelId}), config(json,nullable—存储{welcomeMessage,quickActions,timeout等}), status(int,default:0—0=草稿1=已发布)" ,
"【Service】创建 src/modules/agent/service/info.ts: @Provide() class AgentInfoService extends BaseService, 注入 @InjectEntityModel(AgentInfoEntity) agentInfoEntity; 实现方法: getPublishedAgents()返回status=1的列表; getAgentById(id)按ID查询; getAgentSkillNames(id)返回agent的skills数组" ,
"【Admin Controller】创建 src/modules/agent/controller/admin/info.ts: @CoolController({api:['add','delete','update','info','list','page'],entity:AgentInfoEntity}) class AdminAgentInfoController extends BaseController — 利用Cool Admin框架自动生成CRUD, 无需手写add/delete/update/info/list/page方法" ,
"【验证】pnpm dev启动, 数据库自动创建agent_info表; POST /admin/agent/info/add 创建Agent成功; POST /admin/agent/info/page 分页查询正常; POST /admin/agent/info/update 修改Agent配置正常; POST /admin/agent/info/delete 删除正常" ,
"【难度评估】低难度。Cool Admin的@CoolController自动生成标准CRUD, 只需定义Entity和装饰器。参考现有 entity/skill.ts 和 controller/admin/skill.ts 的写法即可"
] ,
"passes" : true
} ,
{
"id" : "BE-134" ,
"category" : "agent-evolution" ,
"priority" : 0 ,
"description" : "Agent管理 - Open API (已发布Agent列表 + Agent详情)" ,
"steps" : [
"【Controller】创建 src/modules/agent/controller/open/info.ts: @CoolController() class OpenAgentInfoController extends BaseController; 使用 @CoolTag(TagTypes.IGNORE_TOKEN) 标记为开放接口" ,
"【list接口】POST /open/agent/info/list: 调用 agentInfoService.getPublishedAgents() 返回status=1的Agent列表(id/name/label/description/icon/skills/status); 供前端对话页面展示Agent选择器、外部系统查询可用Agent" ,
"【detail接口】POST /open/agent/info/detail: 入参agentId, 返回Agent完整信息(含systemPrompt/modelConfig/skills列表对应的SkillMeta); 用于前端Agent选择后展示详情" ,
"【验证】POST /open/agent/info/list 返回已发布Agent列表; POST /open/agent/info/detail 返回Agent完整信息; 无Token也能访问(IGNORE_TOKEN)" ,
"【难度评估】低难度。标准Controller开发, 参考 controller/open/chat.ts 的写法"
] ,
"passes" : true
} ,
{
"id" : "BE-135" ,
"category" : "agent-evolution" ,
"priority" : 0 ,
"description" : "Agent执行引擎改造 - Supervisor支持agentId, 按Agent配置加载Skill子集和prompt" ,
"steps" : [
"【SkillRegistry扩展】修改 service/skill_registry.ts: 新增 getSkillsByNames(names: string[]): BaseSkill[] 方法, 从已注册skills Map中按名称列表筛选返回; 新增 toSupervisorToolsByNames(names: string[]): DynamicStructuredTool[] 方法, 将指定名称的Skill转为tools" ,
"【Supervisor改造】修改 service/supervisor.ts chat()方法签名: 新增可选参数 agentId?: number" ,
"【Agent配置加载】在chat()方法中(步骤4获取tools之前): if(agentId) { 从AgentInfoService获取agent_info配置; 用agent.skills数组调用skillRegistry.getSkillsByNames()获取Skill子集; 用agent.systemPrompt替换SUPERVISOR_SYSTEM_PROMPT; 如果agent.modelConfig有值则用它创建LLM(而非getDefaultLLM) } else { 保持现有逻辑(通用Agent, 加载所有启用Skill) }" ,
"【LLM切换】当Agent配置了modelConfig时, 需要用agentModelConfig创建LLM实例: 新增私有方法 getAgentLLM(modelConfig): 从modelConfig中取apiKey/apiUrl/modelId, 调用nodeLLMModel.getModel()创建; fallback到getDefaultLLM()" ,
"【XML注入适配】当使用Agent子集Skill时, <available_skills>XML只包含该Agent的Skill子集, 而非全部启用的Skill" ,
"【AgentInfoService注入】在SupervisorService中 @Inject() agentInfoService: AgentInfoService" ,
"【验证】不传agentId时行为不变(兼容旧逻辑); 传agentId时: 只加载该Agent配置的Skill子集; 使用该Agent的systemPrompt; 使用该Agent的模型配置" ,
"【难度评估】中等难度。核心改动在supervisor.ts的chat()方法,需要注意: 1)agentId可选保持兼容; 2)Agent模型配置需要适配现有的nodeLLMModel工厂; 3)Skill子集过滤需确保禁用的Skill不被包含"
] ,
"passes" : true
} ,
{
"id" : "BE-136" ,
"category" : "agent-evolution" ,
"priority" : 0 ,
"description" : "对话API改造 - chat接口支持agentId + session表关联Agent" ,
"steps" : [
"【session Entity】修改 src/modules/agent/entity/session.ts: 新增 @Column({ comment: '关联的Agent ID', nullable: true }) agentId: number; — nullable确保旧会话兼容(agentId=null表示通用Agent)" ,
"【session Service】修改 service/session.ts: getOrCreate()方法新增可选参数agentId; 创建新session时保存agentId; getUserSessions()返回结果包含agentId字段" ,
"【chat Controller】修改 controller/open/chat.ts: chat()方法新增 @Body('agentId') agentId: number 参数(可选); 将agentId传递给 supervisorService.chat(sessionId, message, stream, callbacks, userId, agentId)" ,
"【Supervisor透传】修改 supervisor.ts chat()方法: 将agentId传递给 sessionService.getOrCreate(sessionId, userId, agentId); 同时用agentId加载Agent配置(已在BE-135中实现)" ,
"【sessions接口增强】修改chat controller的sessions()方法: 可选参数 @Body('agentId') agentId, 当传入时只返回该Agent的会话" ,
"【验证】不传agentId时一切行为不变; 传agentId创建的session在数据库中agentId字段正确; 查询会话列表可按agentId过滤; 数据库agent_session表自动新增agentId列" ,
"【难度评估】低-中难度。改动分散但每处都小: Entity加字段、Service加参数、Controller加Body参数。关键是所有新参数都是可选的, 确保向下兼容"
] ,
"passes" : true
} ,
{
"id" : "BE-137" ,
"category" : "agent-evolution" ,
"priority" : 0 ,
"description" : "接口模式 - /open/agent/run/invoke API (外部系统调用Agent)" ,
"steps" : [
"【Controller】创建 src/modules/agent/controller/open/run.ts: @CoolController() class OpenAgentRunController extends BaseController; @CoolTag(TagTypes.IGNORE_TOKEN)" ,
"【invoke接口】POST /open/agent/run/invoke: 入参 { agentId:number(必须), input:object(必须,业务数据), stream?:boolean(默认false), callbackUrl?:string(异步回调地址), timeout?:number(超时毫秒,默认300000) }" ,
"【同步模式】stream=false且无callbackUrl时: 生成requestId(uuid); 从agent_info获取Agent配置; 将input序列化为用户消息(JSON.stringify(input)); 调用supervisorService.chat(newSessionId, message, false, null, null, agentId); 返回 { requestId, agentId, status:'completed', result:{content,skillsCalled,tokenUsage}, duration }" ,
"【异步回调模式】callbackUrl不为空时: 立即返回 { requestId, agentId, status:'processing' }; 后台异步执行Agent; 执行完成后POST callbackUrl推送结果 { requestId, agentId, status:'completed'|'failed', result, error }; 回调失败记录日志但不重试(首版简化)" ,
"【流式模式】stream=true时: 与chat接口类似返回SSE流; 事件类型复用: token/skill_start/skill_end/progress/error/done" ,
"【超时处理】使用Promise.race实现timeout, 超时返回status='timeout'" ,
"【错误处理】agentId不存在返回'Agent不存在'; Agent未发布(status!=1)返回'Agent未发布'; 执行异常返回status='failed'+error信息" ,
"【验证】同步调用返回完整结果; 异步回调正确POST到callbackUrl; 超时处理正常; 未发布Agent调用报错; 与BE-135的agentId执行引擎衔接正常" ,
"【难度评估】中等难度。核心逻辑复用SupervisorService.chat(), 新增的是Controller层的请求/响应格式转换和异步回调机制。callbackUrl回调使用axios/node-fetch POST即可"
] ,
"passes" : false
} ,
{
"id" : "BE-138" ,
"category" : "agent-evolution" ,
"priority" : 1 ,
"description" : "预置Agent - 在启动时自动创建'视频划痕检测'Agent种子数据" ,
"steps" : [
"【修改event/app.ts】在onServerReady()中, syncToDB()之后: 检查agent_info表是否已有name='video_scratch_detect'的记录; 如果没有则插入预置Agent: { name:'video_scratch_detect', label:'视频划痕检测助手', description:'分析车辆环视视频,自动检测车身旧伤、划痕、凹陷等损伤,生成完整检测报告', icon:'video-camera', systemPrompt:'你是视频划痕检测助手...推荐工作流程:先抽帧→检测→定位→选帧→报告...', skills:JSON.stringify(['video_frame_extractor','damage_detector','damage_grounding','best_frame_selector','scratch_report_generator']), modelConfig:null(使用默认LLM), config:JSON.stringify({welcomeMessage:'我可以帮你分析车辆环视视频...', timeout:300000}), status:1 }" ,
"【systemPrompt内容】包含: 角色定义(视频划痕检测专家) + 推荐工作流程(5步) + 每步Skill用途说明 + 输出要求(最终给出报告链接)" ,
"【验证】首次启动自动创建预置Agent; 重复启动不重复创建; 通过/open/agent/info/list能看到该Agent; 通过agentId对话能正确加载5个Skill" ,
"【难度评估】低难度。纯种子数据插入, 参考syncToDB()的写法, 用agentInfoEntity.save()即可"
] ,
"passes" : true
} ,
{
"id" : "BE-200" ,
"category" : "agent-langchain-upgrade" ,
"priority" : 0 ,
"description" : "Supervisor引入middleware支持 - toolRetry/toolCallLimit/modelRetry三个中间件" ,
"steps" : [
"【导入】supervisor.ts顶部导入: import { toolRetryMiddleware, toolCallLimitMiddleware, modelRetryMiddleware } from 'langchain'" ,
"【Supervisor Agent】修改supervisor.ts chat()中createAgent()调用: 新增middleware参数, 包含toolRetryMiddleware({maxRetries:2}), toolCallLimitMiddleware({runLimit:20}), modelRetryMiddleware({maxRetries:2})" ,
"【Agent级别配置】agent_info.config支持存储middleware配置(maxRetries/maxToolCalls等), Supervisor读取后覆盖默认值" ,
"【日志】middleware触发时通过logger记录重试/限制事件" ,
"【验证】pnpm dev启动正常; 对话触发Skill调用正常; 日志中可观察到middleware加载; 模拟失败场景观察重试" ,
"【难度评估】低难度。createAgent()已原生支持middleware参数, 只需传入配置即可"
] ,
"passes" : true
} ,
{
"id" : "BE-201" ,
"category" : "agent-langchain-upgrade" ,
"priority" : 0 ,
"description" : "接口模式引入responseFormat结构化输出 - Agent最终输出强制符合Zod Schema" ,
"steps" : [
"【agent_info扩展】config字段新增responseSchema JSON描述(如{damagesFound:'number',score:'number',summary:'string'})" ,
"【Schema构建】supervisor.ts新增buildResponseSchema()方法: 从JSON描述动态构建z.object()" ,
"【createAgent改造】接口模式调用时: 如果agent_info.config.responseSchema存在, createAgent()加入responseFormat参数" ,
"【结果提取】invoke()返回的state中提取structuredResponse字段" ,
"【run controller】/open/agent/run/invoke 返回值中增加structuredResponse字段" ,
"【兼容】对话模式不使用responseFormat(保持自由文本); responseSchema为空时不传responseFormat" ,
"【验证】配置了responseSchema的Agent接口模式返回structuredResponse; 未配置时行为不变" ,
"【难度评估】中等难度。核心是JSON→Zod Schema的动态构建"
] ,
"passes" : false
} ,
{
"id" : "BE-202" ,
"category" : "agent-langchain-upgrade" ,
"priority" : 0 ,
"description" : "Skill内部Agent引入middleware - base_skill.ts的createAgent()加入重试和限制中间件" ,
"steps" : [
"【导入】base_skill.ts顶部导入: import { toolRetryMiddleware, toolCallLimitMiddleware } from 'langchain'" ,
"【createAgent改造】base_skill.ts createAgent()方法: 新增middleware参数, 包含toolRetryMiddleware({maxRetries:2}), toolCallLimitMiddleware({maxToolCalls:10})" ,
"【可配置】Skill的paramConfig支持middleware配置覆盖(maxRetries/maxToolCalls)" ,
"【验证】pnpm dev启动正常; Skill内部tool调用失败时触发重试; toolCallLimit防止无限循环" ,
"【难度评估】低难度。与BE-200类似, 改动集中在createAgent()调用"
] ,
"passes" : true
} ,
{
"id" : "BE-203" ,
"category" : "agent-langchain-upgrade" ,
"priority" : 0 ,
"description" : "实现MySQL Checkpointer - 自定义BaseCheckpointSaver的MySQL实现" ,
"steps" : [
"【Entity-1】新建src/modules/agent/entity/checkpoint.ts: @Entity('agent_checkpoint'), 字段: threadId(varchar36), checkpointNs(varchar255,default:''), checkpointId(varchar36), parentCheckpointId(varchar36,nullable), checkpointData(longblob), metadataData(longblob), createdAt(timestamp); 联合主键(threadId,checkpointNs,checkpointId)" ,
"【Entity-2】新建src/modules/agent/entity/checkpoint_writes.ts: @Entity('agent_checkpoint_writes'), 字段: threadId(varchar36), checkpointNs(varchar255,default:''), checkpointId(varchar36), taskId(varchar36), idx(int), channelName(varchar255), typeStr(varchar255,nullable), valueData(longblob), createdAt(timestamp); 联合主键(threadId,checkpointNs,checkpointId,taskId,idx)" ,
"【MySQLSaver】新建src/modules/agent/checkpointer/mysql_saver.ts: 继承BaseCheckpointSaver" ,
"【getTuple()】从agent_checkpoint表按threadId+checkpointNs+checkpointId查询最新检查点; 关联查询agent_checkpoint_writes; 反序列化checkpoint和metadata; 返回CheckpointTuple" ,
"【list()】AsyncGenerator: 按threadId+checkpointNs查询所有检查点, 支持limit/before/filter; 按createdAt倒序" ,
"【put()】序列化checkpoint+metadata后INSERT INTO agent_checkpoint; 使用ON DUPLICATE KEY UPDATE处理upsert" ,
"【putWrites()】批量INSERT INTO agent_checkpoint_writes; 使用ON DUPLICATE KEY UPDATE处理重复" ,
"【deleteThread()】DELETE FROM agent_checkpoint和agent_checkpoint_writes WHERE threadId=?" ,
"【序列化】使用@langchain/langgraph-checkpoint的JsonPlusSerializer进行序列化/反序列化" ,
"【连接池】通过TypeORMDataSourceManager获取MySQL连接池, 复用现有连接" ,
"【验证】编写简单测试: put→getTuple验证数据一致; list验证排序; deleteThread验证清理" ,
"【难度评估】高难度。需要理解BaseCheckpointSaver的完整协议, 参考PostgresSaver实现改为MySQL语法"
] ,
"passes" : true
} ,
{
"id" : "BE-204" ,
"category" : "agent-langchain-upgrade" ,
"priority" : 0 ,
"description" : "Supervisor集成MySQL Checkpointer - createAgent()加入checkpointer实现对话持久化" ,
"steps" : [
"【MySQLSaver实例化】supervisor.ts: 注入TypeORMDataSourceManager, 创建MySQLSaver单例" ,
"【createAgent改造】createAgent()调用加入checkpointer: this.mysqlSaver" ,
"【thread_id配置】invoke/streamEvents时传入configurable:{thread_id:sessionId}" ,
"【简化消息管理】有了checkpointer后: invoke时不再手动构建messages列表传入; 改为只传当前用户消息; checkpointer自动加载历史状态" ,
"【保留message表】agent_message表作为可查询的消息摘要记录(前端展示用), checkpointer存完整Agent状态(tool_calls等)" ,
"【渐进迁移】增加配置开关useCheckpointer(默认true); false时fallback到原有手动消息管理逻辑" ,
"【验证】多轮对话Agent记住上下文; 重启服务后对话可恢复; 新会话是干净的; 对话模式和接口模式都正常" ,
"【难度评估】中等难度。核心是改变消息传递方式: 从手动构建到依赖checkpointer自动管理"
] ,
"passes" : true
} ,
{
"id" : "BE-205" ,
"category" : "agent-langchain-upgrade" ,
"priority" : 1 ,
"description" : "Agent级别stateSchema支持 - Skill执行结果可写入自定义状态" ,
"steps" : [
"【agent_info扩展】config字段新增stateSchema JSON定义(如{taskId:'string',damagesFound:'number'})" ,
"【Schema构建】supervisor.ts新增buildStateSchema()方法: 从JSON动态构建Zod schema" ,
"【createAgent改造】createAgent()加入stateSchema参数" ,
"【状态写入】Skill tool的返回值可包含stateUpdate字段, 自动merge到Agent state" ,
"【验证】多轮对话中自定义状态正确持久化(需BE-204 checkpointer配合)" ,
"【难度评估】中等难度。依赖BE-204完成"
] ,
"passes" : false
} ,
{
"id" : "BE-206" ,
"category" : "agent-langchain-upgrade" ,
"priority" : 1 ,
"description" : "summarizationMiddleware长对话上下文压缩 - 超长对话自动摘要旧消息" ,
"steps" : [
"【导入】supervisor.ts导入: import { summarizationMiddleware } from 'langchain'" ,
"【配置】对话模式createAgent()加入summarizationMiddleware: maxMessages(默认20), 使用当前LLM做摘要" ,
"【Agent级别配置】agent_info.config可配置maxMessages阈值" ,
"【验证】超过maxMessages条消息后自动压缩; 压缩后Agent仍能正确回答之前的问题" ,
"【难度评估】低难度。summarizationMiddleware是内置中间件, 传入配置即可"
] ,
"passes" : false
} ,
{
"id" : "BE-207" ,
"category" : "agent-langchain-upgrade" ,
"priority" : 1 ,
"description" : "contextSchema + 动态systemPrompt - 接口模式业务数据通过context注入Agent" ,
"steps" : [
"【agent_info扩展】config字段新增contextSchema JSON定义(接口模式input字段映射)" ,
"【Schema构建】supervisor.ts新增buildContextSchema()方法" ,
"【createAgent改造】createAgent()加入contextSchema参数; systemPrompt改为函数式prompt:(state,config)=>[...]" ,
"【动态prompt】根据context中的业务数据动态调整systemPrompt内容" ,
"【验证】接口模式传入不同input时systemPrompt内容不同; context数据可在prompt中引用" ,
"【难度评估】中等难度。需要将静态systemPrompt改为函数式"
] ,
"passes" : false
} ,
{
"id" : "BE-300" ,
"category" : "ocr-skills" ,
"priority" : 0 ,
"description" : "身份证OCR识别 Skill (id_card_ocr) - 封装百度云身份证识别API, 支持base64和URL两种图片传入, 7个检测开关可配置" ,
"steps" : [
"创建 shared/baidu_ocr_api.ts 百度OCR API封装( Token缓存+身份证OCR调用) " ,
"创建 id_card_ocr/index.ts Skill类( 继承BaseSkill, paramConfig含apiKey/secretKey/7个detect开关) " ,
"创建 id_card_ocr/tool.ts Tool实现( 校验输入→获取Token→调用百度API→解析返回结果) " ,
"修改 event/app.ts 注册 IdCardOcrSkill" ,
"TypeScript编译零错误" ,
"验证 pnpm dev 启动后 id_card_ocr Skill 注册成功"
] ,
"passes" : false
} ,
{
"id" : "BE-400" ,
"category" : "audit-order" ,
"priority" : 0 ,
"description" : "审核订单模块 - audit_order + audit_order_detail Entity定义 + TypeORM自动建表" ,
"steps" : [
"创建 src/modules/audit/ 模块目录结构(entity/service/controller)" ,
"创建 entity/order.ts: AuditOrderEntity 继承BaseEntity, 字段: orderNo(varchar64,唯一索引)/orderType(varchar20,insure|claim)/oemId(int)/agentId(int,nullable)/sessionId(varchar64,nullable)/requestId(varchar64,唯一索引)/status(varchar20,default:pending)/inputData(json)/auditResult(json,nullable)/skillResults(json,nullable)/callbackUrl(varchar500,nullable)/callbackStatus(varchar20,nullable)/callbackRetryCount(int,default:0)/duration(int,nullable)/remark(text,nullable)" ,
"创建 entity/order_detail.ts: AuditOrderDetailEntity 继承BaseEntity, 字段: orderId(int,索引)/stepType(varchar30)/stepName(varchar100)/skillName(varchar50,nullable)/inputData(json,nullable)/outputData(json,nullable)/score(decimal5_2,nullable)/passed(tinyint,nullable,0=否1=是2=警告)/remark(text,nullable)/duration(int,nullable)" ,
"验证 pnpm dev 启动后两张表自动创建"
] ,
"passes" : false
} ,
{
"id" : "BE-401" ,
"category" : "audit-order" ,
"priority" : 0 ,
"description" : "审核订单模块 - AuditOrderService核心服务(submitAudit/onAgentComplete/saveStepDetail)" ,
"steps" : [
"创建 service/order.ts: AuditOrderService, 注入SupervisorService/AgentInfoService" ,
"实现 submitAudit(dto): 创建audit_order记录→构建Agent输入→调用supervisorService.chat()→返回requestId" ,
"实现 buildAgentInput(dto): 将TYCM业务数据转换为Agent能理解的自然语言指令+结构化数据" ,
"实现 onAgentComplete(orderId, result): Agent完成→提取审核结论→更新audit_order状态→触发回调" ,
"实现 saveStepDetail(orderId, skillName, output): 将Skill执行结果写入audit_order_detail" ,
"实现 getDefaultAgent(orderType): 根据订单类型返回默认的审核Agent ID" ,
"验证: 调用submitAudit能正确创建记录并触发Agent执行"
] ,
"passes" : false
} ,
{
"id" : "BE-402" ,
"category" : "audit-order" ,
"priority" : 0 ,
"description" : "审核订单模块 - CallbackService(回调TYCM + 失败重试)" ,
"steps" : [
"创建 service/callback.ts: CallbackService" ,
"实现 callbackTycm(orderId): 读取audit_order的callbackUrl→POST审核结果→更新callbackStatus" ,
"实现重试机制: 失败时指数退避重试(最多3次,间隔5s/15s/45s)" ,
"回调请求体: {requestId, orderNo, status, auditResult, skillResults, duration}" ,
"记录回调日志(callbackRetryCount字段)" ,
"验证: 模拟callbackUrl测试回调成功和失败重试"
] ,
"passes" : false
} ,
{
"id" : "BE-403" ,
"category" : "audit-order" ,
"priority" : 0 ,
"description" : "审核订单模块 - Open API(TYCM调用: submit/query/batch)" ,
"steps" : [
"创建 controller/open/audit.ts: OpenAuditController, @CoolTag(IGNORE_TOKEN)" ,
"POST /open/audit/submit: 参数{orderNo,orderType,oemId,data,agentId?,callbackUrl?} → 调用auditOrderService.submitAudit()" ,
"POST /open/audit/query: 参数{orderNo或requestId} → 查询审核结果(status+auditResult+skillResults)" ,
"POST /open/audit/batch: 参数{orders:[]} → 批量提交审核" ,
"参数校验: orderNo必填、orderType必须为insure|claim、data必填" ,
"验证: 通过HTTP调用完整提交→查询流程"
] ,
"passes" : false
} ,
{
"id" : "BE-404" ,
"category" : "audit-order" ,
"priority" : 0 ,
"description" : "审核订单模块 - Admin API(后台管理: 列表/详情/重审/人工复审/统计)" ,
"steps" : [
"创建 controller/admin/audit.ts: AdminAuditController, @CoolController自动CRUD" ,
"POST /admin/audit/order/page: 分页列表+筛选(orderType/status/oemId/时间范围/orderNo搜索)" ,
"POST /admin/audit/order/info: 审核详情(含audit_order_detail明细列表)" ,
"POST /admin/audit/order/retry: 重新审核(重新创建Agent会话执行)" ,
"POST /admin/audit/order/manual: 人工复审(手动修改状态+备注+回调TYCM)" ,
"POST /admin/audit/stats: 审核统计(今日/本周/本月审核量/通过率/平均耗时)" ,
"验证: 后台管理界面能正常使用所有API"
] ,
"passes" : false
} ,
{
"id" : "BE-405" ,
"category" : "audit-order" ,
"priority" : 0 ,
"description" : "审核订单模块 - Agent执行钩子(监听Skill完成事件→写入audit_order_detail)" ,
"steps" : [
"修改 supervisor.ts: 新增审核模式标识(auditOrderId), skill_end时调用saveStepDetail" ,
"在submitAudit()调用chat()时传入auditOrderId标识" ,
"Skill结果自动映射到stepType: id_card_ocr/invoice_ocr/data_compare/rule_check等" ,
"Agent最终回复时提取审核结论(通过/驳回/转人工+原因)写入auditResult" ,
"验证: Agent执行完毕后audit_order_detail有完整步骤记录"
] ,
"passes" : false
} ,
{
"id" : "BE-406" ,
"category" : "audit-skill" ,
"priority" : 1 ,
"description" : "购车发票OCR Skill (invoice_ocr) - 基于baidu_ocr_api.ts扩展" ,
"steps" : [
"创建 skills/invoice_ocr/index.ts: InvoiceOcrSkill继承BaseSkill, skillType=compute" ,
"创建 skills/invoice_ocr/tool.ts: 调用百度增值税发票识别API" ,
"识别字段: 开票日期/购买方名称/车架号/价税合计/不含税价/发票代码/发票号码" ,
"在baidu_ocr_api.ts中新增baiduInvoiceOCR()快捷方法" ,
"修改event/app.ts注册新Skill" ,
"验证: 传入发票图片URL能正确返回识别结果"
] ,
"passes" : false
} ,
{
"id" : "BE-407" ,
"category" : "audit-skill" ,
"priority" : 1 ,
"description" : "行驶证OCR Skill (driving_license_ocr) - 基于baidu_ocr_api.ts扩展" ,
"steps" : [
"创建 skills/driving_license_ocr/index.ts: DrivingLicenseOcrSkill继承BaseSkill, skillType=compute" ,
"创建 skills/driving_license_ocr/tool.ts: 调用百度行驶证识别API" ,
"识别字段: 号牌号码/所有人/使用性质/车辆类型/品牌型号/车架号VIN/发动机号/注册日期/发证日期" ,
"修改event/app.ts注册新Skill" ,
"验证: 传入行驶证图片URL能正确返回识别结果"
] ,
"passes" : false
} ,
{
"id" : "BE-408" ,
"category" : "audit-skill" ,
"priority" : 1 ,
"description" : "数据比对 Skill (data_compare) - 纯计算, 比对OCR结果与录入数据一致性" ,
"steps" : [
"创建 skills/data_compare/index.ts: DataCompareSkill继承BaseSkill, skillType=compute" ,
"创建 skills/data_compare/tool.ts: 输入{ocrData, orderData}→逐字段比对" ,
"比对字段: 姓名/身份证号/车架号/购买日期/金额/车牌号等" ,
"支持模糊匹配(相似度算法): 日期格式容错/金额千分位容错/中英文标点容错" ,
"输出: {matched:boolean, score:number, details:[{field,ocrValue,orderValue,matched,similarity}]}" ,
"修改event/app.ts注册新Skill" ,
"验证: 传入OCR数据和订单数据能正确比对并返回评分"
] ,
"passes" : false
} ,
{
"id" : "BE-409" ,
"category" : "audit-skill" ,
"priority" : 1 ,
"description" : "规则校验 Skill (rule_check) - 纯计算,驳回规则引擎" ,
"steps" : [
"创建 skills/rule_check/index.ts: RuleCheckSkill继承BaseSkill, skillType=compute" ,
"创建 skills/rule_check/tool.ts: 输入{orderType, orderData, ocrData}→执行规则列表" ,
"投保规则: 购买方是否公司(检查有限公司等)/购车是否超180天/身份证是否过期" ,
"理赔规则: 是否在等待期内/保单是否有效/是否超出保障范围" ,
"规则可通过paramConfig配置(启用/禁用某些规则、修改阈值)" ,
"输出: {passed:boolean, failedRules:[{ruleId,ruleName,reason}], passedRules:[...]}" ,
"修改event/app.ts注册新Skill" ,
"验证: 传入各种场景数据能正确触发驳回规则"
] ,
"passes" : false
} ,
{
"id" : "BE-410" ,
"category" : "audit-order" ,
"priority" : 1 ,
"description" : "预置审核Agent - 创建投保审核Agent和理赔审核Agent种子数据" ,
"steps" : [
"投保审核Agent: name=insure_audit_agent, skills=[id_card_ocr,invoice_ocr,data_compare,rule_check], systemPrompt=投保审核工作流指引" ,
"理赔审核Agent: name=claim_audit_agent, skills=[driving_license_ocr,video_frame_extractor,damage_detector,damage_grounding,best_frame_selector,scratch_report,rule_check], systemPrompt=理赔审核工作流指引" ,
"systemPrompt包含: 角色定义+推荐审核步骤+判断标准+输出格式要求" ,
"Agent的config包含: 结构化输出格式(auditResult/reason/score)" ,
"通过event/app.ts启动时自动检查/创建预置Agent" ,
"验证: 启动后两个审核Agent可在Agent列表中看到"
] ,
"passes" : false
} ,
{
"id" : "BE-500" ,
"category" : "agent-skill" ,
"priority" : 0 ,
"description" : "实时语音交互 Skill (realtime_voice) - 基于豆包端到端实时语音大模型Realtime API的全双工语音交互能力" ,
"steps" : [
"创建 skills/shared/realtime_voice_api.ts: 二进制协议编解码(encodeFrame/decodeFrame) + WebSocket连接管理(DoubaoRealtimeConnection) + 全局会话管理器(realtimeVoiceManager单例)" ,
"创建 skills/realtime_voice/index.ts: RealtimeVoiceSkill(compute类型, isComputeOnly=true)" ,
"创建 skills/realtime_voice/tool.ts: start_realtime_voice_session + stop_realtime_voice_session" ,
"创建 plugin/voice/socket/realtime_io.ts: Socket.io /realtime-voice namespace控制器, 注入SkillRegistryService从DB读取配置" ,
"修改 event/app.ts 注册RealtimeVoiceSkill" ,
"验证: 前端Socket.io连接→发送PCM音频→收到ASR文本+Chat回复+TTS音频"
] ,
"passes" : false
} ,
{
"id" : "BE-501" ,
"category" : "agent-skill" ,
"priority" : 0 ,
"description" : "文生图 Skill (image_generator) - 基于豆包Seedream 5.0的文本生成图片能力" ,
"steps" : [
"创建 skills/image_generator/index.ts: ImageGeneratorSkill(compute类型, isComputeOnly=true)" ,
"创建 skills/image_generator/tool.ts: image_generate Tool调用豆包Seedream 5.0 API" ,
"支持: 2K/3K/4K分辨率、多种宽高比(smart/1:1/3:4/4:3/16:9等)、批量生成(1-4张)、漫画风格" ,
"修改 event/app.ts 注册ImageGeneratorSkill" ,
"验证: 通过Agent对话发送文生图指令能正确生成图片并返回URL"
] ,
"passes" : false
} ,
{
"id" : "BE-502" ,
"category" : "agent-skill" ,
"priority" : 0 ,
"description" : "PPT生成 Skill (pptx_generator) - 基于PptxGenJS生成PowerPoint演示文稿, 支持5种幻灯片类型+主题配色+页码徽章" ,
"steps" : [
"创建 skills/pptx_generator/index.ts: PptxGeneratorSkill(compute类型, isComputeOnly=true)" ,
"创建 skills/pptx_generator/tool.ts: pptx_generate Tool调用PptxGenJS" ,
"创建 skills/pptx_generator/SKILL.md: 完整文档" ,
"添加 pptxgenjs@3.12.0 依赖到 package.json" ,
"修改 event/app.ts 注册 PptxGeneratorSkill" ,
"验证: 通过Agent对话发送PPT生成指令能正确生成.pptx文件"
] ,
"passes" : false
} ,
{
"id" : "BE-600" ,
"category" : "functional" ,
"priority" : 2 ,
"description" : "数据服务 - 商业健康保险创新药管理 (drug模块)" ,
"steps" : [
"创建 src/modules/data/ 目录结构(entity/service/controller/menu.json)" ,
"创建 entity/catalog.ts: DataDrugCatalogEntity(目录主表: name/year/source/description/status)" ,
"创建 entity/category.ts: DataDrugCategoryEntity(ATC分类树形: catalogId/parentId/categoryCode/level)" ,
"创建 entity/drugitem.ts: DataDrugItemEntity(药品条目: drugName/brandName/manufacturer/authorizedCompany/indication/validFrom/validTo)" ,
"创建 controller/admin/catalog.ts + service/catalog.ts: 目录CRUD" ,
"创建 controller/admin/category.ts + service/category.ts: 分类CRUD" ,
"创建 controller/admin/drugitem.ts + service/drugitem.ts: 药品条目CRUD" ,
"创建 menu.json: 药品目录路由 /data/drug, 权限前缀 data:drug:*" ,
"前端 views/drug.vue: 目录筛选+关键词搜索+新增/编辑/删除药品" ,
"验证: /admin/data/drugitem/page 分页查询正常; 新增/编辑/删除功能正常"
] ,
"passes" : true
} ,
{
"id" : "BE-601" ,
"category" : "functional" ,
"priority" : 2 ,
"description" : "数据服务 - 医保药品管理 (medical模块)" ,
"steps" : [
"创建 entity/medical_catalog.ts: DataMedicalCatalogEntity(医保目录主表: name/version/source/description/status)" ,
"创建 entity/medical_category.ts: DataMedicalCategoryEntity(ATC分类树形: catalogId/parentId/categoryCode/level)" ,
"创建 entity/medical_item.ts: DataMedicalItemEntity(医保药品条目: drugName/dosageForm/paymentStandard/drugClass/approvalNo/manufacturer/indication)" ,
"创建 controller/admin/medical_catalog.ts + service/medical_catalog.ts: 医保目录CRUD" ,
"创建 controller/admin/medical_category.ts + service/medical_category.ts: 医保分类CRUD" ,
"创建 controller/admin/medicalitem.ts + service/medical_item.ts: 医保药品条目CRUD" ,
"前端 views/medical.vue: 目录+医保分类(甲乙丙)筛选+关键词搜索+新增/编辑/删除药品" ,
"验证: /admin/data/medicalitem/page 分页查询正常; 新增/编辑/删除功能正常; drugClass甲乙丙分类显示正确"
] ,
"passes" : true
} ,
{
"id" : "BE-503" ,
"category" : "agent-skill" ,
"priority" : 0 ,
"description" : "DOCX生成 Skill (docx_generator) - 基于docx npm包, 支持三条流水线: (A)从零创建新文档,(B)编辑/填充现有文档,(C)应用模板格式。支持段落、标题、表格、列表、图片、分页符等元素, corporate/academic/minimal/government四种样式预设。" ,
"steps" : [
"添加 docx@8.5.0 和 jszip@3.10.1 依赖到 package.json" ,
"创建 skills/docx_generator/ 目录结构(index.ts + tool.ts + SKILL.md)" ,
"实现 docx_create 工具: 从零创建DOCX, 支持段落/标题/表格/列表/图片/分页符" ,
"实现 docx_edit 工具: 编辑现有DOCX, 执行文本替换和表格数据修改" ,
"实现 docx_apply_template 工具:将模板样式应用到文档内容" ,
"在 event/app.ts 中注册 DocxGeneratorSkill" ,
"TypeScript 编译零错误"
] ,
"passes" : true
} ,
{
"id" : "BE-505" ,
"category" : "agent-skill" ,
"priority" : 0 ,
"description" : "PDF生成 Skill (pdf_generator) - pdfkit(正文)+puppeteer-core(封面)+pdf-lib(合并)+ejs(模板), 15种封面风格(报告/提案/简历/作品集/学术/通用/极简/条纹/对角线/画框/社论/杂志/暗房/终端/海报),支持三种模式:(A)CREATE从零生成, (B)FILL填写表单字段, (C)REFORMAT重排现有文档。中文排版(微软雅黑),集成测试通过。" ,
"steps" : [
"添加 pdfkit/puppeteer-core/pdf-lib/ejs 依赖" ,
"创建 skills/pdf_generator/ 目录结构" ,
"实现 design_system.ts: 15种文档类型的DesignTokens设计系统" ,
"实现 templates/templates.ts: 封面EJS渲染器" ,
"实现 13个封面HTML模板(covers/*.ejs)" ,
"实现 cover_renderer.ts: puppeteer-core渲染封面HTML为PDF" ,
"实现 body_renderer.ts: pdfkit渲染正文内容块" ,
"实现 merge.ts: pdf-lib合并封面和正文" ,
"实现 content_parser.ts: Markdown/Text/PDF解析" ,
"实现 tool.ts: pdf_create/pdf_fill/pdf_reformat三个工具" ,
"实现 index.ts: PdfGeneratorSkill入口类" ,
"实现 SKILL.md: 完整技能文档" ,
"在 event/app.ts 中注册 PdfGeneratorSkill" ,
"TypeScript编译零错误" ,
"集成测试: 生成2页完整PDF(封面+正文)"
] ,
"passes" : true
} ,
{
"id" : "BE-504" ,
"category" : "agent-skill" ,
"priority" : 0 ,
"description" : "XLSX生成 Skill (xlsx_generator) - 基于 xlsx/adm-zip npm包, 支持4个工具: (A)xlsx_create从零创建, (B)xlsx_read读取分析, (C)xlsx_edit零格式损失编辑( XML直接编辑) , (D)xlsx_validate公式校验。参考 minimax-xlsx Python实现。" ,
"steps" : [
"创建 src/modules/agent/skills/xlsx_generator/ 目录结构" ,
"实现 xlsx_create 工具( xlsx库) " ,
"实现 xlsx_read 工具( xlsx库 + 数据分析)" ,
"实现 xlsx_edit 工具( adm-zip XML直接编辑) " ,
"实现 xlsx_validate 工具(公式错误检测)" ,
"在 event/app.ts 中注册 XlsxGeneratorSkill" ,
"TypeScript编译零错误"
] ,
"passes" : false
}
]