2026-05-21 11:20:19 +08:00

1051 lines
57 KiB
JSON
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

[
{
"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": [
"设计投保审核流程节点编排",
"实现TYCM→GPU Guard的API对接接口",
"接收投保订单数据",
"OCR识别证件/材料",
"规则校验",
"AI推理判断",
"返回审核结果给TYCM",
"审核日志记录"
],
"passes": false
},
{
"id": "BE-016",
"category": "integration",
"priority": 4,
"description": "TYCM审核对接 - 理赔订单AI审核流程",
"steps": [
"设计理赔审核流程节点编排",
"实现TYCM→GPU Guard的API对接接口",
"接收理赔申请数据",
"图片/视频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
}
]