mirror of
https://github.com/Significant-Gravitas/AutoGPT.git
synced 2026-01-07 22:33:57 -05:00
fix(blocks): clamp Twitter search start_time to 10 seconds before now (#11461)
## Summary - Clamp `start_time` to at least 10 seconds before request time (Twitter API requirement) - Update input description to document this automatic adjustment - Fix `serialize_list` to handle `None` data gracefully (exposed by the fix) ## Background Twitter API returns `400 Bad Request` when `start_time` is less than 10 seconds before the request time. Users providing current/future times would hit this error. **Sentry Issue:** [BUILDER-3PG](https://significant-gravitas.sentry.io/issues/6919685270/) ## Affected Blocks - `TwitterSearchRecentTweetsBlock` - `TwitterGetUserMentionsBlock` - `TwitterGetHomeTimelineBlock` - `TwitterGetUserTweetsBlock` ## Test plan - [x] Tested `TwitterSearchRecentTweetsBlock` with current time as `start_time` - [x] Verified clamping works and API call succeeds - [x] Verified "No tweets found" is returned correctly when search window has no results 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-authored-by: Claude <noreply@anthropic.com> Co-authored-by: Abhimanyu Yadav <122007096+Abhi1992002@users.noreply.github.com>
This commit is contained in:
@@ -1,4 +1,4 @@
|
||||
from datetime import datetime
|
||||
from datetime import datetime, timedelta, timezone
|
||||
from typing import Any, Dict
|
||||
|
||||
from backend.blocks.twitter._mappers import (
|
||||
@@ -237,6 +237,12 @@ class TweetDurationBuilder:
|
||||
|
||||
def add_start_time(self, start_time: datetime | None):
|
||||
if start_time:
|
||||
# Twitter API requires start_time to be at least 10 seconds before now
|
||||
max_start_time = datetime.now(timezone.utc) - timedelta(seconds=10)
|
||||
if start_time.tzinfo is None:
|
||||
start_time = start_time.replace(tzinfo=timezone.utc)
|
||||
if start_time > max_start_time:
|
||||
start_time = max_start_time
|
||||
self.params["start_time"] = start_time
|
||||
return self
|
||||
|
||||
|
||||
@@ -51,8 +51,10 @@ class ResponseDataSerializer(BaseSerializer):
|
||||
return serialized_item
|
||||
|
||||
@classmethod
|
||||
def serialize_list(cls, data: List[Dict[str, Any]]) -> List[Dict[str, Any]]:
|
||||
def serialize_list(cls, data: List[Dict[str, Any]] | None) -> List[Dict[str, Any]]:
|
||||
"""Serializes a list of dictionary items"""
|
||||
if not data:
|
||||
return []
|
||||
return [cls.serialize_dict(item) for item in data]
|
||||
|
||||
|
||||
|
||||
@@ -408,7 +408,7 @@ class ListExpansionInputs(BlockSchemaInput):
|
||||
|
||||
class TweetTimeWindowInputs(BlockSchemaInput):
|
||||
start_time: datetime | None = SchemaField(
|
||||
description="Start time in YYYY-MM-DDTHH:mm:ssZ format",
|
||||
description="Start time in YYYY-MM-DDTHH:mm:ssZ format. If set to a time less than 10 seconds ago, it will be automatically adjusted to 10 seconds ago (Twitter API requirement).",
|
||||
placeholder="Enter start time",
|
||||
default=None,
|
||||
advanced=False,
|
||||
|
||||
Reference in New Issue
Block a user