🐛 fix: fix multi tasks no summary issue (#11685)

fix task issue
This commit is contained in:
Arvin Xu
2026-01-21 22:01:03 +08:00
committed by GitHub
parent 3110e2c356
commit 26ce317313
5 changed files with 296 additions and 0 deletions

View File

@@ -1,8 +1,10 @@
import type { Message } from '../../../../types';
import multiTasksWithSummary from './multi-tasks-with-summary.json';
import simple from './simple.json';
import withSummary from './with-summary.json';
export const tasks = {
multiTasksWithSummary: multiTasksWithSummary as Message[],
simple: simple as Message[],
withSummary: withSummary as Message[],
};

View File

@@ -0,0 +1,234 @@
[
{
"id": "msg-user-1",
"role": "user",
"content": "Process these files in 10 parallel tasks and give me a summary.",
"parentId": null,
"createdAt": 1735526559382,
"updatedAt": 1735526559382
},
{
"id": "msg-assistant-1",
"role": "assistant",
"content": "I'll process these files in 10 parallel tasks.",
"parentId": "msg-user-1",
"createdAt": 1735526560163,
"updatedAt": 1735526585550,
"model": "gpt-4",
"provider": "openai",
"tools": [
{
"id": "call_exec_tasks_1",
"type": "builtin",
"apiName": "execTasks",
"arguments": "{\"tasks\": [{\"description\": \"Task 1\"}, {\"description\": \"Task 2\"}, {\"description\": \"Task 3\"}, {\"description\": \"Task 4\"}, {\"description\": \"Task 5\"}, {\"description\": \"Task 6\"}, {\"description\": \"Task 7\"}, {\"description\": \"Task 8\"}, {\"description\": \"Task 9\"}, {\"description\": \"Task 10\"}]}",
"identifier": "lobe-gtd"
}
]
},
{
"id": "msg-tool-1",
"role": "tool",
"content": "Triggered 10 async tasks",
"parentId": "msg-assistant-1",
"tool_call_id": "call_exec_tasks_1",
"createdAt": 1735526588116,
"updatedAt": 1735526591337,
"pluginState": {
"type": "execTasks",
"tasks": [
{ "description": "Task 1" },
{ "description": "Task 2" },
{ "description": "Task 3" },
{ "description": "Task 4" },
{ "description": "Task 5" },
{ "description": "Task 6" },
{ "description": "Task 7" },
{ "description": "Task 8" },
{ "description": "Task 9" },
{ "description": "Task 10" }
],
"parentMessageId": "msg-tool-1"
}
},
{
"id": "msg-task-1",
"role": "task",
"content": "Task 1 completed with results...",
"parentId": "msg-tool-1",
"createdAt": 1735526594643,
"updatedAt": 1735526756262,
"taskDetail": {
"duration": 120000,
"status": "completed",
"threadId": "thd_task_1",
"title": "Task 1",
"totalCost": 0.015,
"totalMessages": 15,
"totalTokens": 100000
}
},
{
"id": "msg-task-2",
"role": "task",
"content": "Task 2 completed with results...",
"parentId": "msg-tool-1",
"createdAt": 1735526595000,
"updatedAt": 1735526757000,
"taskDetail": {
"duration": 121000,
"status": "completed",
"threadId": "thd_task_2",
"title": "Task 2",
"totalCost": 0.016,
"totalMessages": 16,
"totalTokens": 101000
}
},
{
"id": "msg-task-3",
"role": "task",
"content": "Task 3 completed with results...",
"parentId": "msg-tool-1",
"createdAt": 1735526596000,
"updatedAt": 1735526758000,
"taskDetail": {
"duration": 122000,
"status": "completed",
"threadId": "thd_task_3",
"title": "Task 3",
"totalCost": 0.017,
"totalMessages": 17,
"totalTokens": 102000
}
},
{
"id": "msg-task-4",
"role": "task",
"content": "Task 4 completed with results...",
"parentId": "msg-tool-1",
"createdAt": 1735526597000,
"updatedAt": 1735526759000,
"taskDetail": {
"duration": 123000,
"status": "completed",
"threadId": "thd_task_4",
"title": "Task 4",
"totalCost": 0.018,
"totalMessages": 18,
"totalTokens": 103000
}
},
{
"id": "msg-task-5",
"role": "task",
"content": "Task 5 completed with results...",
"parentId": "msg-tool-1",
"createdAt": 1735526598000,
"updatedAt": 1735526760000,
"taskDetail": {
"duration": 124000,
"status": "completed",
"threadId": "thd_task_5",
"title": "Task 5",
"totalCost": 0.019,
"totalMessages": 19,
"totalTokens": 104000
}
},
{
"id": "msg-task-6",
"role": "task",
"content": "Task 6 completed with results...",
"parentId": "msg-tool-1",
"createdAt": 1735526599000,
"updatedAt": 1735526761000,
"taskDetail": {
"duration": 125000,
"status": "completed",
"threadId": "thd_task_6",
"title": "Task 6",
"totalCost": 0.02,
"totalMessages": 20,
"totalTokens": 105000
}
},
{
"id": "msg-task-7",
"role": "task",
"content": "Task 7 completed with results...",
"parentId": "msg-tool-1",
"createdAt": 1735526600000,
"updatedAt": 1735526762000,
"taskDetail": {
"duration": 126000,
"status": "completed",
"threadId": "thd_task_7",
"title": "Task 7",
"totalCost": 0.021,
"totalMessages": 21,
"totalTokens": 106000
}
},
{
"id": "msg-task-8",
"role": "task",
"content": "Task 8 completed with results...",
"parentId": "msg-tool-1",
"createdAt": 1735526601000,
"updatedAt": 1735526763000,
"taskDetail": {
"duration": 127000,
"status": "completed",
"threadId": "thd_task_8",
"title": "Task 8",
"totalCost": 0.022,
"totalMessages": 22,
"totalTokens": 107000
}
},
{
"id": "msg-task-9",
"role": "task",
"content": "Task 9 completed with results...",
"parentId": "msg-tool-1",
"createdAt": 1735526602000,
"updatedAt": 1735526764000,
"taskDetail": {
"duration": 128000,
"status": "completed",
"threadId": "thd_task_9",
"title": "Task 9",
"totalCost": 0.023,
"totalMessages": 23,
"totalTokens": 108000
}
},
{
"id": "msg-task-10",
"role": "task",
"content": "Task 10 completed with results...",
"parentId": "msg-tool-1",
"createdAt": 1735526603000,
"updatedAt": 1735526765000,
"taskDetail": {
"duration": 129000,
"status": "completed",
"threadId": "thd_task_10",
"title": "Task 10",
"totalCost": 0.024,
"totalMessages": 24,
"totalTokens": 109000
}
},
{
"id": "msg-assistant-summary",
"role": "assistant",
"content": "All 10 tasks completed successfully! Here's the comprehensive summary...",
"parentId": "msg-task-10",
"createdAt": 1735526810000,
"updatedAt": 1735526820000,
"model": "gpt-4",
"provider": "openai"
}
]

View File

@@ -194,6 +194,31 @@ describe('parse', () => {
expect(serializeParseResult(result)).toEqual(outputs.tasks.withSummary);
});
it('should handle 10 parallel tasks with summary as task child', () => {
const result = parse(inputs.tasks.multiTasksWithSummary);
// The critical assertions:
// 1. flatList should have 4 items: user, assistantGroup(+tool), tasks(10 tasks), assistant-summary
expect(result.flatList).toHaveLength(4);
expect(result.flatList[0].role).toBe('user');
expect(result.flatList[1].role).toBe('assistantGroup');
expect(result.flatList[2].role).toBe('tasks');
expect(result.flatList[3].role).toBe('assistant');
// 2. tasks virtual message should have 10 task messages
expect((result.flatList[2] as any).tasks).toHaveLength(10);
// 3. Verify all tasks are completed
const tasks = (result.flatList[2] as any).tasks;
for (const task of tasks) {
expect(task.taskDetail.status).toBe('completed');
}
// 4. The summary message should be present and accessible
expect(result.flatList[3].id).toBe('msg-assistant-summary');
expect(result.flatList[3].content).toContain('All 10 tasks completed');
});
});
describe('Performance', () => {

View File

@@ -125,6 +125,21 @@ export class ContextTreeBuilder {
for (const nonTaskChild of nonTaskChildren) {
this.transformToLinear(nonTaskChild, contextTree);
}
// Also check for children of task messages (e.g., summary as child of last task)
const taskChildren = idNode.children.filter((child) => {
const childMsg = this.messageMap.get(child.id);
return childMsg?.role === 'task';
});
for (const taskChild of taskChildren) {
for (const taskGrandchild of taskChild.children) {
const taskGrandchildMsg = this.messageMap.get(taskGrandchild.id);
if (taskGrandchildMsg && taskGrandchildMsg.role !== 'task') {
this.transformToLinear(taskGrandchild, contextTree);
}
}
}
return;
}

View File

@@ -113,6 +113,26 @@ export class FlatListBuilder {
}
}
}
// Also check for children of task messages (e.g., summary as child of last task)
for (const taskChildId of taskChildren) {
const taskChildrenIds = this.childrenMap.get(taskChildId) ?? [];
for (const taskGrandchildId of taskChildrenIds) {
if (!processedIds.has(taskGrandchildId)) {
const taskGrandchild = this.messageMap.get(taskGrandchildId);
if (taskGrandchild && taskGrandchild.role !== 'task') {
flatList.push(taskGrandchild);
processedIds.add(taskGrandchildId);
this.buildFlatListRecursive(
taskGrandchildId,
flatList,
processedIds,
allMessages,
);
}
}
}
}
return;
}
}