vxcontrol/pentagi · error

time_start and time_end are required for temporal_window sea

Error message

time_start and time_end are required for temporal_window search

What it means

The temporal_window search type requires both time_start and time_end to bound the episode window queried in Graphiti. This guard fires before any HTTP call when either parameter is an empty string. It is a precondition validation error aimed at the tool caller.

Source

Thrown at backend/pkg/tools/graphiti_search.go:343

	if args.MinMentions != nil {
		input["min_mentions"] = args.MinMentions.Int()
	}
	if args.RecencyWindow != "" {
		input["recency_window"] = args.RecencyWindow
	}
	return input
}

// handleTemporalWindowSearch performs time-bounded search
func (t *graphitiSearchTool) handleTemporalWindowSearch(
	ctx context.Context,
	groupID string,
	args GraphitiSearchAction,
	observationObject *graphiti.Observation,
) (string, error) {
	// Validate temporal parameters
	if args.TimeStart == "" || args.TimeEnd == "" {
		return "", fmt.Errorf("time_start and time_end are required for temporal_window search")
	}

	timeStart, err := parseGraphitiTime(args.TimeStart)
	if err != nil {
		return "", fmt.Errorf("invalid time_start format (use ISO 8601, e.g. 2026-01-02T15:04:05Z): %w", err)
	}

	timeEnd, err := parseGraphitiTime(args.TimeEnd)
	if err != nil {
		return "", fmt.Errorf("invalid time_end format (use ISO 8601, e.g. 2026-01-02T15:04:05Z): %w", err)
	}

	if timeEnd.Before(timeStart) {
		return "", fmt.Errorf("time_end must be after time_start")
	}

	maxResults := args.MaxResults.Int()
	if maxResults <= 0 {

View on GitHub (pinned to ea665308ba)

Solutions

  1. Provide both time_start and time_end in ISO 8601 format (e.g. 2026-01-02T15:04:05Z)
  2. Use a narrower search type if you do not actually need a time-bounded window
  3. Re-invoke the tool after adding the missing temporal parameters

Example fix

// before
{"search_type": "temporal_window", "query": "login flow"}
// after
{"search_type": "temporal_window", "query": "login flow", "time_start": "2026-08-01T00:00:00Z", "time_end": "2026-08-31T23:59:59Z"}
Defensive patterns

Strategy: validation

Validate before calling

if searchType == "temporal_window" && (args.TimeStart == "" || args.TimeEnd == "") {
    return errors.New("temporal_window requires both time_start and time_end (ISO 8601)")
}

Type guard

func temporalWindowArgsComplete(args GraphitiSearchAction) bool {
    return args.SearchType == "temporal_window" && args.TimeStart != "" && args.TimeEnd != ""
}

Prevention

When it happens

Trigger: Calling graphiti_search with search_type="temporal_window" while omitting time_start and/or time_end, or passing empty strings for them.

Common situations: LLM agents forgetting required parameters for temporal queries; templates that only fill query/max_results; copying a generic search payload and switching search_type to temporal_window without adding the time fields.

Understand the failure class

Background: "missing required argument" and "the following required arguments were not provided": what required-argument errors mean and how to fix them — this error's family across 20 libraries.

Related errors


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