mirror of
https://github.com/Significant-Gravitas/AutoGPT.git
synced 2026-01-09 15:17:59 -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 typing import Any, Dict
|
||||||
|
|
||||||
from backend.blocks.twitter._mappers import (
|
from backend.blocks.twitter._mappers import (
|
||||||
@@ -237,6 +237,12 @@ class TweetDurationBuilder:
|
|||||||
|
|
||||||
def add_start_time(self, start_time: datetime | None):
|
def add_start_time(self, start_time: datetime | None):
|
||||||
if start_time:
|
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
|
self.params["start_time"] = start_time
|
||||||
return self
|
return self
|
||||||
|
|
||||||
|
|||||||
@@ -51,8 +51,10 @@ class ResponseDataSerializer(BaseSerializer):
|
|||||||
return serialized_item
|
return serialized_item
|
||||||
|
|
||||||
@classmethod
|
@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"""
|
"""Serializes a list of dictionary items"""
|
||||||
|
if not data:
|
||||||
|
return []
|
||||||
return [cls.serialize_dict(item) for item in data]
|
return [cls.serialize_dict(item) for item in data]
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -408,7 +408,7 @@ class ListExpansionInputs(BlockSchemaInput):
|
|||||||
|
|
||||||
class TweetTimeWindowInputs(BlockSchemaInput):
|
class TweetTimeWindowInputs(BlockSchemaInput):
|
||||||
start_time: datetime | None = SchemaField(
|
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",
|
placeholder="Enter start time",
|
||||||
default=None,
|
default=None,
|
||||||
advanced=False,
|
advanced=False,
|
||||||
|
|||||||
Reference in New Issue
Block a user