diff --git a/frontend/src/api/index.ts b/frontend/src/api/index.ts index 53fd795..c7034e4 100644 --- a/frontend/src/api/index.ts +++ b/frontend/src/api/index.ts @@ -1,5 +1,14 @@ import request from '@/utils/request' -import type { Agent, IRawPlanResponse } from '@/stores' +import type { Agent, IApiStepTask, IRawPlanResponse } from '@/stores' +import { + mockBackendAgentSelectModifyInit, + mockBackendAgentSelectModifyAddAspect, + type BackendAgentScoreResponse, +} from '@/layout/components/Main/TaskTemplate/TaskSyllabus/components/mock/AgentAssignmentBackendMock' +import { + mockBackendFillAgentTaskProcess, + type RawAgentTaskProcessResponse, +} from '@/layout/components/Main/TaskTemplate/TaskProcess/components/mock/AgentTaskProcessBackendMock' export interface ActionHistory { ID: string @@ -19,8 +28,13 @@ export type IExecuteRawResponse = { ActionHistory: ActionHistory[] } +export interface IFillAgentSelectionRequest { + goal: string + stepTask: IApiStepTask + agents: string[] +} + class Api { - // 智能体信息 setAgents = (data: Pick[]) => { return request({ url: '/setAgents', @@ -65,7 +79,7 @@ class Api { InputObject_List: step.InputObject_List, OutputObject: step.OutputObject, AgentSelection: step.AgentSelection, - Collaboration_Brief_frontEnd: step.Collaboration_Brief_FrontEnd, + Collaboration_Brief_frontEnd: step.Collaboration_Brief_frontEnd, TaskProcess: step.TaskProcess.map((action) => ({ ActionType: action.ActionType, AgentName: action.AgentName, @@ -78,6 +92,378 @@ class Api { }, }) } + + // 分支任务大纲(根节点级别) + branchPlanOutline = (data: { + branch_Number: number + Modification_Requirement: string + Existing_Steps: string[] + Baseline_Completion: number + initialInputs: string[] + goal: string + }) => { + return request({ + url: '/branch_PlanOutline', + method: 'POST', + data: { + branch_Number: data.branch_Number, + Modification_Requirement: data.Modification_Requirement, + Existing_Steps: data.Existing_Steps, + Baseline_Completion: data.Baseline_Completion, + 'Initial Input Object': data.initialInputs, + 'General Goal': data.goal, + }, + }) + } + + // 分支任务流程(任务节点级别) + branchTaskProcess = (data: { + branch_Number: number + Modification_Requirement: string + Existing_Steps: string[] + Baseline_Completion: number + stepTaskExisting: any + goal: string + }) => { + return request({ + url: '/branch_TaskProcess', + method: 'POST', + data: { + branch_Number: data.branch_Number, + Modification_Requirement: data.Modification_Requirement, + Existing_Steps: data.Existing_Steps, + Baseline_Completion: data.Baseline_Completion, + stepTaskExisting: data.stepTaskExisting, + 'General Goal': data.goal, + }, + }) + } + + fillStepTask = (data: { goal: string; stepTask: any }) => { + return request({ + url: '/fill_stepTask', + method: 'POST', + data: { + 'General Goal': data.goal, + stepTask: data.stepTask, + }, + }) + } + + fillStepTaskTaskProcess = async (data: { + goal: string + stepTask: IApiStepTask + agents: string[] + }): Promise => { + // 后端返回格式: IRawStepTask + const response = await request< + { + 'General Goal': string + stepTask_lackTaskProcess: { + StepName: string + TaskContent: string + InputObject_List: string[] + OutputObject: string + AgentSelection: string[] + } + }, + { + StepName?: string + TaskContent?: string + InputObject_List?: string[] + OutputObject?: string + AgentSelection?: string[] + TaskProcess?: Array<{ + ID: string + ActionType: string + AgentName: string + Description: string + ImportantInput: string[] + }> + Collaboration_Brief_FrontEnd?: { + template: string + data: Record + } + } + >({ + url: '/fill_stepTask_TaskProcess', + method: 'POST', + data: { + 'General Goal': data.goal, + stepTask_lackTaskProcess: { + StepName: data.stepTask.name, + TaskContent: data.stepTask.content, + InputObject_List: data.stepTask.inputs, + OutputObject: data.stepTask.output, + AgentSelection: data.agents, + }, + }, + }) + + // 数据转换:后端格式 (IRawStepTask) → 前端格式 (IApiStepTask) + // 注意:此转换逻辑与Mock API完全一致 + + // 1. 转换颜色格式:[h, s, l] → "hsl(h, s%, l%)" + const vec2Hsl = (color: number[]): string => { + const [h, s, l] = color + return `hsl(${h}, ${s}%, ${l}%)` + } + + // 2. 转换 brief.data: { "0": { text, color: [h,s,l] } } → { "0": { text, style: { background } } } + const briefData: Record = {} + if (response.Collaboration_Brief_FrontEnd?.data) { + for (const [key, value] of Object.entries(response.Collaboration_Brief_FrontEnd.data)) { + briefData[key] = { + text: value.text, + style: { + background: vec2Hsl(value.color), + }, + } + } + } + + // 3. 转换 process: { ID, ActionType, AgentName, Description, ImportantInput } → { id, type, agent, description, inputs } + const process = (response.TaskProcess || []).map((action) => ({ + id: action.ID, + type: action.ActionType, + agent: action.AgentName, + description: action.Description, + inputs: action.ImportantInput, + })) + + // 4. 构建前端格式的 IApiStepTask + return { + name: response.StepName || '', + content: response.TaskContent || '', + inputs: response.InputObject_List || [], + output: response.OutputObject || '', + agents: response.AgentSelection || [], + brief: { + template: response.Collaboration_Brief_FrontEnd?.template || '', + data: briefData, + }, + process, + } + } + + // 为每个智能体评分 + agentSelectModifyInit = async (data: { + goal: string + stepTask: any + }): Promise>> => { + // 后端返回:维度 -> agent -> { Reason, Score } + const response = await request< + { + 'General Goal': string + stepTask: any + }, + Record> + >({ + url: '/agentSelectModify_init', + method: 'POST', + data: { + 'General Goal': data.goal, + stepTask: { + StepName: data.stepTask.StepName || data.stepTask.name, + TaskContent: data.stepTask.TaskContent || data.stepTask.content, + InputObject_List: data.stepTask.InputObject_List || data.stepTask.inputs, + OutputObject: data.stepTask.OutputObject || data.stepTask.output, + }, + }, + }) + + // 数据转换:后端格式 (维度->agent) → 前端格式 (agent->维度) + const transformedData: Record> = {} + + for (const [aspect, agents] of Object.entries(response)) { + // aspect: 维度名称, agents: { agentName: { Reason, Score } } + for (const [agentName, scoreInfo] of Object.entries(agents)) { + if (!transformedData[agentName]) { + transformedData[agentName] = {} + } + transformedData[agentName][aspect] = { + reason: scoreInfo.Reason, + score: scoreInfo.Score, + } + } + } + + return transformedData + } + + // 添加新的评估维度 + // 定义返回类型(与 Mock 数据格式一致) + agentSelectModifyAddAspect = async (data: { + aspectList: string[] + }): Promise<{ + aspectName: string + agentScores: Record + }> => { + // 后端返回:维度 -> agent -> { Reason, Score } + const response = await request< + { + aspectList: string[] + }, + Record> + >({ + url: '/agentSelectModify_addAspect', + method: 'POST', + data: { + aspectList: data.aspectList, + }, + }) + + // 获取新添加的维度(最后一个) + const newAspect = data.aspectList[data.aspectList.length - 1] + if (!newAspect) { + throw new Error('aspectList is empty') + } + + // 提取该维度的数据:维度 -> agent -> { Reason, Score } → agent -> { score, reason } + const newAspectAgents = response[newAspect] + const agentScores: Record = {} + + if (newAspectAgents) { + for (const [agentName, scoreInfo] of Object.entries(newAspectAgents)) { + agentScores[agentName] = { + score: scoreInfo.Score, + reason: scoreInfo.Reason, + } + } + } + + return { + aspectName: newAspect, + agentScores, + } + } + + // ==================== Mock API(开发阶段使用)==================== + // Mock API 使用与真实 API 相同的数据转换逻辑,确保将来切换无缝 + + // Mock: 为每个智能体评分 + mockAgentSelectModifyInit = async (): Promise< + Record> + > => { + // 调用Mock后端数据(维度 -> agent -> { Reason, Score }) + const response: BackendAgentScoreResponse = await mockBackendAgentSelectModifyInit() + + // 数据转换:后端格式 (维度->agent) → 前端格式 (agent->维度) + // 注意:此转换逻辑与真实API完全一致 + const transformedData: Record> = {} + + for (const [aspect, agents] of Object.entries(response)) { + // aspect: 维度名称, agents: { agentName: { Reason, Score } } + for (const [agentName, scoreInfo] of Object.entries(agents)) { + if (!transformedData[agentName]) { + transformedData[agentName] = {} + } + transformedData[agentName][aspect] = { + reason: scoreInfo.Reason, + score: scoreInfo.Score, + } + } + } + + return transformedData + } + + // Mock: 添加新的评估维度 + mockAgentSelectModifyAddAspect = async (data: { + aspectList: string[] + }): Promise<{ + aspectName: string + agentScores: Record + }> => { + // 调用Mock后端数据(维度 -> agent -> { Reason, Score }) + const response: BackendAgentScoreResponse = await mockBackendAgentSelectModifyAddAspect( + data.aspectList, + ) + + // 获取新添加的维度(最后一个) + const newAspect = data.aspectList[data.aspectList.length - 1] + if (!newAspect) { + throw new Error('aspectList is empty') + } + + // 提取该维度的数据:维度 -> agent -> { Reason, Score } → agent -> { score, reason } + // 注意:此转换逻辑与真实API完全一致 + const newAspectAgents = response[newAspect] + const agentScores: Record = {} + + if (newAspectAgents) { + for (const [agentName, scoreInfo] of Object.entries(newAspectAgents)) { + agentScores[agentName] = { + score: scoreInfo.Score, + reason: scoreInfo.Reason, + } + } + } + + return { + aspectName: newAspect, + agentScores, + } + } + + // Mock: 填充智能体任务流程 + mockFillStepTaskTaskProcess = async (data: { + goal: string + stepTask: IApiStepTask + agents: string[] + }): Promise => { + // 调用Mock后端数据(后端原始格式) + const response: RawAgentTaskProcessResponse = await mockBackendFillAgentTaskProcess( + data.goal, + data.stepTask, + data.agents, + ) + + // 数据转换:后端格式 → 前端格式 + // 注意:此转换逻辑与真实API完全一致 + + // 1. 转换颜色格式:[h, s, l] → "hsl(h, s%, l%)" + const vec2Hsl = (color: number[]): string => { + const [h, s, l] = color + return `hsl(${h}, ${s}%, ${l}%)` + } + + // 2. 转换 brief.data: { "0": { text, color: [h,s,l] } } → { "0": { text, style: { background } } } + const briefData: Record = {} + if (response.Collaboration_Brief_frontEnd?.data) { + for (const [key, value] of Object.entries(response.Collaboration_Brief_frontEnd.data)) { + briefData[key] = { + text: value.text, + style: { + background: vec2Hsl(value.color), + }, + } + } + } + + // 3. 转换 process: { ID, ActionType, AgentName, Description, ImportantInput } → { id, type, agent, description, inputs } + const process = (response.TaskProcess || []).map((action) => ({ + id: action.ID, + type: action.ActionType, + agent: action.AgentName, + description: action.Description, + inputs: action.ImportantInput, + })) + + // 4. 构建前端格式的 IApiStepTask + return { + name: response.StepName || '', + content: response.TaskContent || '', + inputs: response.InputObject_List || [], + output: response.OutputObject || '', + agents: response.AgentSelection || [], + brief: { + template: response.Collaboration_Brief_frontEnd?.template || '', + data: briefData, + }, + process, + } + } } export default new Api() diff --git a/frontend/src/assets/icons/Check.svg b/frontend/src/assets/icons/Check.svg index 13d2d2f..d1101cb 100644 --- a/frontend/src/assets/icons/Check.svg +++ b/frontend/src/assets/icons/Check.svg @@ -1 +1,7 @@ - \ No newline at end of file + + + + + + \ No newline at end of file diff --git a/frontend/src/assets/icons/agent-change.svg b/frontend/src/assets/icons/agent-change.svg index 416d7f9..ad7e9c8 100644 --- a/frontend/src/assets/icons/agent-change.svg +++ b/frontend/src/assets/icons/agent-change.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/frontend/src/assets/icons/branch.svg b/frontend/src/assets/icons/branch.svg new file mode 100644 index 0000000..01d5635 --- /dev/null +++ b/frontend/src/assets/icons/branch.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend/src/layout/components/Main/Task.vue b/frontend/src/layout/components/Main/Task.vue index f88324c..1056384 100644 --- a/frontend/src/layout/components/Main/Task.vue +++ b/frontend/src/layout/components/Main/Task.vue @@ -1,15 +1,11 @@ + + + + + + diff --git a/frontend/src/layout/components/Main/TaskTemplate/TaskProcess/components/TaskButton.vue b/frontend/src/layout/components/Main/TaskTemplate/TaskProcess/components/TaskButton.vue new file mode 100644 index 0000000..f7b055e --- /dev/null +++ b/frontend/src/layout/components/Main/TaskTemplate/TaskProcess/components/TaskButton.vue @@ -0,0 +1,113 @@ + + + + + diff --git a/frontend/src/layout/components/Main/TaskTemplate/TaskProcess/components/mock/AgentTaskProcessBackendMock.ts b/frontend/src/layout/components/Main/TaskTemplate/TaskProcess/components/mock/AgentTaskProcessBackendMock.ts new file mode 100644 index 0000000..2c2e6c8 --- /dev/null +++ b/frontend/src/layout/components/Main/TaskTemplate/TaskProcess/components/mock/AgentTaskProcessBackendMock.ts @@ -0,0 +1,183 @@ +// 模拟后端原始返回格式的 Mock 数据 - fill_stepTask_TaskProcess 接口 +// 后端返回格式: IRawStepTask { StepName, TaskContent, InputObject_List, OutputObject, AgentSelection, TaskProcess, Collaboration_Brief_frontEnd } + +import type { IRawStepTask } from '@/stores' + +// TaskProcess 项格式 +interface RawTaskProcessItem { + ID: string + ActionType: string + AgentName: string + Description: string + ImportantInput: string[] +} + +// Collaboration_Brief_frontEnd 数据项格式 +interface RawBriefDataItem { + text: string + color: number[] // [h, s, l] +} + +// 后端返回的完整数据格式 +export interface RawAgentTaskProcessResponse { + StepName: string + TaskContent: string + InputObject_List: string[] + OutputObject: string + AgentSelection: string[] + TaskProcess: RawTaskProcessItem[] + Collaboration_Brief_frontEnd?: { + template: string + data: Record + } +} + +// 模拟后端返回的原始数据结构(与后端缓存数据格式一致) +// 使用与 AgentAssignmentBackendMock 相同的 agent 列表 +export const mockBackendAgentTaskProcessData: RawAgentTaskProcessResponse = { + StepName: '腐蚀类型识别', + TaskContent: '分析船舶制造中常见的材料腐蚀类型及其成因。', + InputObject_List: [], + OutputObject: '腐蚀类型及成因列表', + AgentSelection: ['腐蚀机理研究员', '实验材料学家', '防护工程专家'], + TaskProcess: [ + { + ID: 'action_101', + ActionType: 'Propose', + AgentName: '腐蚀机理研究员', + Description: '分析海洋环境下的腐蚀机理,确定关键防护要素', + ImportantInput: ['海洋环境参数', '防护性能指标'], + }, + { + ID: 'action_102', + ActionType: 'Critique', + AgentName: '实验材料学家', + Description: '基于腐蚀机理分析结果,设计涂层材料的基础配方', + ImportantInput: ['腐蚀机理分析结果', '涂层材料配方'], + }, + { + ID: 'action_103', + ActionType: 'Improve', + AgentName: '防护工程专家', + Description: '筛选适用于防护涂层的二维材料,评估其性能潜力', + ImportantInput: ['材料配方设计', '涂层材料配方'], + }, + { + ID: 'action_104', + ActionType: 'Finalize', + AgentName: '实验材料学家', + Description: '制定涂层材料性能测试实验方案,包括测试指标和方法', + ImportantInput: ['二维材料筛选结果', '防护性能指标'], + }, + { + ID: 'action_105', + ActionType: 'Critique', + AgentName: '防护工程专家', + Description: '模拟海洋流体环境对涂层材料的影响,优化涂层结构', + ImportantInput: ['实验方案', '海洋环境参数'], + }, + { + ID: 'action_106', + ActionType: 'Improve', + AgentName: '腐蚀机理研究员', + Description: '综合评估涂层材料的防护性能,提出改进建议', + ImportantInput: ['流体力学模拟结果', '实验材料学测试结果', '二维材料性能数据'], + }, + { + ID: 'action_107', + ActionType: 'Improve', + AgentName: '实验材料学家', + Description: '整理研发数据和测试结果,撰写完整的研发报告', + ImportantInput: ['综合性能评估', '所有研发数据'], + }, + ], + Collaboration_Brief_frontEnd: { + template: '基于!<0>!、!<1>!和!<2>!,!<3>!、!<4>!、!<5>!和!<6>!执行!<7>!任务,以获得!<8>!。', + data: { + '0': { + text: '涂层材料配方', + color: [120, 60, 70], // hsl(120, 60%, 70%) + }, + '1': { + text: '海洋环境参数', + color: [120, 60, 70], // hsl(120, 60%, 70%) + }, + '2': { + text: '防护性能指标', + color: [120, 60, 70], // hsl(120, 60%, 70%) + }, + '3': { + text: '腐蚀机理研究员', + color: [0, 0, 90], // hsl(0, 0%, 90%) + }, + '4': { + text: '先进材料研发员', + color: [0, 0, 90], // hsl(0, 0%, 90%) + }, + '5': { + text: '二维材料科学家', + color: [0, 0, 90], // hsl(0, 0%, 90%) + }, + '6': { + text: '实验材料学家', + color: [0, 0, 90], // hsl(0, 0%, 90%) + }, + '7': { + text: '研发适用于海洋环境的耐腐蚀防护涂层材料,并进行性能测试与评估', + color: [0, 0, 87], // hsl(0, 0%, 87%) + }, + '8': { + text: '防护涂层材料研发报告', + color: [30, 100, 80], // hsl(30, 100%, 80%) + }, + }, + }, +} + +// 模拟后端API调用 - fill_stepTask_TaskProcess +export const mockBackendFillAgentTaskProcess = async ( + goal: string, + stepTask: any, + agents: string[], +): Promise => { + // 模拟网络延迟 500ms + await new Promise((resolve) => setTimeout(resolve, 500)) + + // 在真实场景中,后端会根据传入的 goal、stepTask 和 agents 生成不同的 TaskProcess + // 这里我们直接返回预设的 Mock 数据 + // 可以根据传入的 agents 动态修改 AgentSelection 和 TaskProcess + + // 确保 agents 数组不为空 + const safeAgents = agents.length > 0 ? agents : ['腐蚀机理研究员'] + + const responseData: RawAgentTaskProcessResponse = { + ...mockBackendAgentTaskProcessData, + AgentSelection: agents, + TaskProcess: mockBackendAgentTaskProcessData.TaskProcess.map((action, index) => ({ + ...action, + AgentName: safeAgents[index % safeAgents.length], + })), + Collaboration_Brief_frontEnd: mockBackendAgentTaskProcessData.Collaboration_Brief_frontEnd + ? { + template: mockBackendAgentTaskProcessData.Collaboration_Brief_frontEnd.template, + data: { ...mockBackendAgentTaskProcessData.Collaboration_Brief_frontEnd.data }, + } + : undefined, + } + + // 更新 Collaboration_Brief_frontEnd.data 中的 agent 引用 + if (responseData.Collaboration_Brief_frontEnd?.data) { + const agentCount = Math.min(safeAgents.length, 4) // 最多4个agent + for (let i = 0; i < agentCount; i++) { + const key = String(i + 3) // agent从索引3开始 + if (responseData.Collaboration_Brief_frontEnd.data[key]) { + responseData.Collaboration_Brief_frontEnd.data[key] = { + ...responseData.Collaboration_Brief_frontEnd.data[key], + text: safeAgents[i]!, + } + } + } + } + + return responseData +} diff --git a/frontend/src/layout/components/Main/TaskTemplate/TaskProcess/components/mock/fillStepTaskMock.ts b/frontend/src/layout/components/Main/TaskTemplate/TaskProcess/components/mock/fillStepTaskMock.ts new file mode 100644 index 0000000..7bfc874 --- /dev/null +++ b/frontend/src/layout/components/Main/TaskTemplate/TaskProcess/components/mock/fillStepTaskMock.ts @@ -0,0 +1,142 @@ +// /api/fill_stepTask 接口的Vue适用mock数据 +import type { IApiStepTask, IRawStepTask } from '@/stores/modules/agents' + +// 模拟接口响应数据 +export const mockFillStepTaskResponse: IApiStepTask = { + name: '需求分析与原型设计', + content: '分析用户需求并创建产品原型', + inputs: ['用户调研报告', '竞品分析文档'], + output: '产品原型设计稿', + agents: ['实验材料学家', '腐蚀机理研究员', '防护工程专家'], + brief: { + template: '基于!<0>!和!<1>!,!<2>!、!<3>!和!<4>!执行!<5>!任务,以获得!<6>!。', + data: { + '0': { + text: '用户调研报告', + style: { + background: 'hsl(120, 60%, 70%)', + }, + }, + '1': { + text: '竞品分析文档', + style: { + background: 'hsl(120, 60%, 70%)', + }, + }, + '2': { + text: '实验材料学家', + style: { + background: 'hsl(0, 0%, 90%)', + boxShadow: '1px 1px 4px 1px rgba(0,0,0,0.2)', + }, + }, + '3': { + text: '腐蚀机理研究员', + style: { + background: 'hsl(0, 0%, 90%)', + boxShadow: '1px 1px 4px 1px rgba(0,0,0,0.2)', + }, + }, + '4': { + text: '防护工程专家', + style: { + background: 'hsl(0, 0%, 90%)', + boxShadow: '1px 1px 4px 1px rgba(0,0,0,0.2)', + }, + }, + '5': { + text: '分析用户需求并创建产品原型', + style: { + background: 'hsl(0, 0%, 87%)', + border: '1.5px solid #ddd', + }, + }, + '6': { + text: '产品原型设计稿', + style: { + background: 'hsl(30, 100%, 80%)', + }, + }, + }, + }, + process: [ + { + id: 'action_001', + type: '需求分析', + agent: '实验材料学家', + description: '分析用户调研报告,识别核心需求点', + inputs: ['用户调研报告'], + }, + { + id: 'action_002', + type: '竞品分析', + agent: '实验材料学家', + description: '对比竞品功能,确定产品差异化优势', + inputs: ['竞品分析文档'], + }, + { + id: 'action_003', + type: '信息架构设计', + agent: '防护工程专家', + description: '设计产品信息结构和用户流程', + inputs: ['需求分析结果'], + }, + { + id: 'action_004', + type: '界面原型设计', + agent: '腐蚀机理研究员', + description: '创建高保真界面原型', + inputs: ['信息架构设计'], + }, + { + id: 'action_005', + type: '原型评审', + agent: '实验材料学家', + description: '组织团队评审原型设计', + inputs: ['界面原型设计'], + }, + ], +} + +// 请求参数类型 +export interface IFillStepTaskRequest { + goal: string + stepTask: IApiStepTask +} + +// Vue composable +export const useFillStepTaskMock = () => { + const fillStepTask = async ( + goal: string, + stepTask: IApiStepTask, + ): Promise<{ data: IApiStepTask }> => { + return new Promise((resolve) => { + setTimeout(() => { + resolve({ + data: mockFillStepTaskResponse, + }) + }, 500) + }) + } + + return { + fillStepTask, + } +} + +// Vue组件使用示例 +export const fillStepTaskExampleRequest: IFillStepTaskRequest = { + goal: '开发一个智能协作平台', + stepTask: { + name: '需求分析与原型设计', + content: '分析用户需求并创建产品原型', + inputs: ['用户调研报告', '竞品分析文档'], + output: '产品原型设计稿', + agents: [], + brief: { + template: '', + data: {}, + }, + process: [], + }, +} diff --git a/frontend/src/layout/components/Main/TaskTemplate/TaskProcess/components/mock/fillStepTaskProcessMock.ts b/frontend/src/layout/components/Main/TaskTemplate/TaskProcess/components/mock/fillStepTaskProcessMock.ts new file mode 100644 index 0000000..c0e4160 --- /dev/null +++ b/frontend/src/layout/components/Main/TaskTemplate/TaskProcess/components/mock/fillStepTaskProcessMock.ts @@ -0,0 +1,159 @@ +// /api/fill_stepTask_TaskProcess 接口的Vue适用mock数据 +import type { IApiStepTask } from '@/stores' + +// 模拟接口响应数据 +export const mockFillAgentSelectionResponse: IApiStepTask = { + name: '技术方案设计与开发', + content: '设计技术架构并完成核心功能开发', + inputs: ['产品需求文档', '技术选型指南'], + output: '可运行的产品版本', + agents: ['架构师', '后端工程师', '前端工程师', '测试工程师'], + brief: { + template: '基于!<0>!和!<1>!,!<2>!、!<3>!、!<4>!和!<5>!执行!<6>!任务,以获得!<7>!。', + data: { + '0': { + text: '产品需求文档', + style: { + background: 'hsl(120, 60%, 70%)', + }, + }, + '1': { + text: '技术选型指南', + style: { + background: 'hsl(120, 60%, 70%)', + }, + }, + '2': { + text: '架构师', + style: { + background: 'hsl(0, 0%, 90%)', + boxShadow: '1px 1px 4px 1px rgba(0,0,0,0.2)', + }, + }, + '3': { + text: '后端工程师', + style: { + background: 'hsl(0, 0%, 90%)', + boxShadow: '1px 1px 4px 1px rgba(0,0,0,0.2)', + }, + }, + '4': { + text: '前端工程师', + style: { + background: 'hsl(0, 0%, 90%)', + boxShadow: '1px 1px 4px 1px rgba(0,0,0,0.2)', + }, + }, + '5': { + text: '测试工程师', + style: { + background: 'hsl(0, 0%, 90%)', + boxShadow: '1px 1px 4px 1px rgba(0,0,0,0.2)', + }, + }, + '6': { + text: '设计技术架构并完成核心功能开发', + style: { + background: 'hsl(0, 0%, 87%)', + border: '1.5px solid #ddd', + }, + }, + '7': { + text: '可运行的产品版本', + style: { + background: 'hsl(30, 100%, 80%)', + }, + }, + }, + }, + process: [ + { + id: 'action_101', + type: '技术架构设计', + agent: '架构师', + description: '设计系统架构和技术栈选型', + inputs: ['产品需求文档', '技术选型指南'], + }, + { + id: 'action_102', + type: '数据库设计', + agent: '后端工程师', + description: '设计数据库表结构和关系', + inputs: ['技术架构设计'], + }, + { + id: 'action_103', + type: '后端API开发', + agent: '后端工程师', + description: '实现RESTful API接口', + inputs: ['数据库设计'], + }, + { + id: 'action_104', + type: '前端界面开发', + agent: '前端工程师', + description: '开发用户界面和交互功能', + inputs: ['后端API开发'], + }, + { + id: 'action_105', + type: '单元测试', + agent: '测试工程师', + description: '编写和执行单元测试用例', + inputs: ['前端界面开发'], + }, + { + id: 'action_106', + type: '集成测试', + agent: '测试工程师', + description: '进行系统集成测试', + inputs: ['单元测试'], + }, + ], +} + +// 请求参数类型 +export interface IFillAgentSelectionRequest { + goal: string + stepTask: IApiStepTask + agents: string[] +} + +// Vue composable +export const useFillAgentSelectionMock = () => { + const fillAgentSelection = async ( + goal: string, + stepTask: IApiStepTask, + agents: string[], + ): Promise<{ data: IApiStepTask }> => { + return new Promise((resolve) => { + setTimeout(() => { + resolve({ + data: mockFillAgentSelectionResponse, + }) + }, 500) + }) + } + + return { + fillAgentSelection, + } +} + +// Vue组件使用示例 +export const fillAgentSelectionExampleRequest: IFillAgentSelectionRequest = { + goal: '开发一个智能协作平台', + stepTask: { + name: '技术方案设计与开发', + content: '设计技术架构并完成核心功能开发', + inputs: ['产品需求文档', '技术选型指南'], + output: '可运行的产品版本', + agents: [], + brief: { + template: '', + data: {}, + }, + process: [], + }, + agents: ['架构师', '后端工程师', '前端工程师', '测试工程师'], +} diff --git a/frontend/src/layout/components/Main/TaskTemplate/TaskResult/AdditionalOutputCard.vue b/frontend/src/layout/components/Main/TaskTemplate/TaskResult/AdditionalOutputCard.vue index a8214db..7858736 100644 --- a/frontend/src/layout/components/Main/TaskTemplate/TaskResult/AdditionalOutputCard.vue +++ b/frontend/src/layout/components/Main/TaskTemplate/TaskResult/AdditionalOutputCard.vue @@ -109,6 +109,26 @@ const handleBlur = () => { + + +
+ + +
diff --git a/frontend/src/layout/components/Main/TaskTemplate/TaskResult/index.vue b/frontend/src/layout/components/Main/TaskTemplate/TaskResult/index.vue index 8c29029..9d88a52 100644 --- a/frontend/src/layout/components/Main/TaskTemplate/TaskResult/index.vue +++ b/frontend/src/layout/components/Main/TaskTemplate/TaskResult/index.vue @@ -20,7 +20,11 @@ const emit = defineEmits<{ const agentsStore = useAgentsStore() const drawerVisible = ref(false) const collaborationProcess = computed(() => { - return agentsStore.agentRawPlan.data?.['Collaboration Process'] ?? [] + const data = agentsStore.agentRawPlan.data?.['Collaboration Process'] ?? [] + // console.log('data:', data) + return data + + // return agentsStore.agentRawPlan.data?.['Collaboration Process'] ?? [] }) // 监听额外产物变化 @@ -319,7 +323,7 @@ defineExpose({ :class="{ 'is-running': agentsStore.executePlan.length > 0 }" > -
+
执行结果
任务过程 @@ -343,6 +348,7 @@ defineExpose({ title="请先输入要执行的任务" :visible="showPopover" @hide="showPopover = false" + style="order: 2" >