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
- Provide both time_start and time_end in ISO 8601 format (e.g. 2026-01-02T15:04:05Z)
- Use a narrower search type if you do not actually need a time-bounded window
- 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
- Always set both time bounds when choosing temporal_window
- Use a plain search type when no time filtering is needed
- Add the required fields to any tool-payload template for temporal queries
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
- time_end must be after time_start
- center_node_uuid is required for entity_relationships search
- unknown search_type: %s
- invalid time_start format (use ISO 8601, e.g. 2026-01-02T15:
- invalid time_end format (use ISO 8601, e.g. 2026-01-02T15:04
AI-assisted analysis of vxcontrol/pentagi@ea665308ba (2026-09-01).
Data as JSON: /api/errors/9fac263af09c3582.
Report an issue: GitHub.