vxcontrol/pentagi · warning

failed to summarize task list: %w

Error message

failed to summarize task list: %w

What it means

Thrown in buildTasksList (backend/pkg/tools/flow_manager.go:200) when the assembled task-list string exceeds taskListLimit (32 KB) and the configured summarizer fails while compressing it (input pre-truncated to summarizationLimit, 128 KB). The task data was fully rendered; only the final LLM compression of the list failed.

Source

Thrown at backend/pkg/tools/flow_manager.go:200

					return "", fmt.Errorf("failed to get task input: %w", err)
				}
				fmt.Fprintf(sb, "  Input:  %s\n", input)
			}
			if task.Result != "" {
				result, err := t.getResultText(ctx, task.Result)
				if err != nil {
					return "", fmt.Errorf("failed to get task result: %w", err)
				}
				fmt.Fprintf(sb, "  Result: %s\n", result)
			}
		}
	}

	taskList := sb.String()
	if t.summarizer != nil && len(taskList) > taskListLimit {
		taskList, err = t.summarizer(ctx, truncateText(taskList, summarizationLimit))
		if err != nil {
			return "", fmt.Errorf("failed to summarize task list: %w", err)
		}
	}

	return taskList, nil
}

func (t *flowStatusTool) buildSubtasksList(ctx context.Context, taskID *int64, verbose bool) (string, error) {
	var subtasks []database.Subtask
	var err error

	if taskID != nil && *taskID > 0 {
		subtasks, err = t.db.GetFlowTaskSubtasks(ctx, database.GetFlowTaskSubtasksParams{
			FlowID: t.flowID,
			TaskID: *taskID,
		})
	} else {
		subtasks, err = t.db.GetFlowSubtasks(ctx, t.flowID)
	}

View on GitHub (pinned to ea665308ba)

Solutions

  1. Check and fix the summarizer provider (credentials, quota, endpoint) per the wrapped error, then retry.
  2. Reduce detail: call with verbose=false or paginate by filtering tasks, keeping output below 32 KB.
  3. Extend the summarizer timeout or use a model with a larger context window for the 128 KB input.
  4. Disable the summarizer so the raw (already size-bounded by callers) list is returned truncated.

Example fix

// before
taskList, err = t.summarizer(ctx, truncateText(taskList, summarizationLimit))
if err != nil {
	return "", fmt.Errorf("failed to summarize task list: %w", err)
}
// after: fall back to the non-summarized list
rendered, serr := t.summarizer(ctx, truncateText(taskList, summarizationLimit))
if serr != nil {
	log.Warn("task list summarization failed", "err", serr)
	return truncateText(taskList, taskListLimit), nil
}
taskList = rendered
Defensive patterns

Strategy: fallback

Validate before calling

// estimate output size and avoid oversized verbose dumps
if estimatedTaskListSize(flowID, verbose) > taskListLimit && !summarizerHealthy(ctx) {
	args.Verbose = false
}

Try / catch

// Go: accept the unsanitized list if compression fails
out, err := tool.Handle(ctx, "get_flow_status", verboseTasksArgs)
if err != nil && strings.Contains(err.Error(), "failed to summarize task list") {
	out, err = tool.Handle(ctx, "get_flow_status", nonVerboseTasksArgs) // smaller, no LLM
}

Prevention

When it happens

Trigger: get_flow_status with detail='tasks' on a flow with many tasks (especially verbose=true with inputs/results), producing >32 KB output, combined with a summarizer failure — provider error, timeout, 429, cancelled context.

Common situations: Very long-running flows with dozens of tasks; verbose dumps pushing output past 32 KB; summarizer provider quota exhausted after the whole run; local summarizer model offline; caller context deadline exceeded during compression.

Related errors


AI-assisted analysis of vxcontrol/pentagi@ea665308ba (2026-09-01). Data as JSON: /api/errors/aa42f00066bac824. Report an issue: GitHub.