1051 lines
57 KiB
JSON
Raw Permalink Normal View History

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但它们本质依赖LLMskillType应设为'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.ts15种文档类型的DesignTokens设计系统",
"实现 templates/templates.ts封面EJS渲染器",
"实现 13个封面HTML模板(covers/*.ejs)",
"实现 cover_renderer.tspuppeteer-core渲染封面HTML为PDF",
"实现 body_renderer.tspdfkit渲染正文内容块",
"实现 merge.tspdf-lib合并封面和正文",
"实现 content_parser.tsMarkdown/Text/PDF解析",
"实现 tool.tspdf_create/pdf_fill/pdf_reformat三个工具",
"实现 index.tsPdfGeneratorSkill入口类",
"实现 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
}
]