Skip to content

Commit 6782f81

Browse files
committed
add get user details, stream by accounts mentioned and tweet authors
1 parent 77def1c commit 6782f81

File tree

4 files changed

+73
-7
lines changed

4 files changed

+73
-7
lines changed

agents/example.json

+5-1
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,11 @@
2525
"timeline_read_count": 10,
2626
"own_tweet_replies_count":2,
2727
"tweet_interval": 5400,
28-
"respond_to_mentions": false
28+
"respond_to_mentions": {
29+
"enabled": true,
30+
"accounts_mentioned": ["0xzerebro"],
31+
"accounts_to_listen_to": ["0xzerebro"]
32+
}
2933
},
3034
{
3135
"name": "farcaster",

src/actions/twitter_actions.py

+27-1
Original file line numberDiff line numberDiff line change
@@ -98,12 +98,38 @@ def like_tweet(agent, **kwargs):
9898
@register_action("respond-to-mentions")
9999
def respond_to_mentions(agent,**kwargs): #REQUIRES TWITTER PREMIUM PLAN
100100

101-
filter_str = f"@{agent.username} -is:retweet"
101+
accounts_to_listen_to = kwargs.get('accounts_to_listen_to', [])
102+
accounts_mentioned = kwargs.get('accounts_mentioned', [])
103+
104+
# Get user IDs of accounts to listen to
105+
accounts_to_listen_to_ids = []
106+
user_ids = agent.connection_manager.perform_action(
107+
connection_name="twitter",
108+
action_name="get-user-details",
109+
params = [None, accounts_to_listen_to]
110+
)
111+
if user_ids:
112+
accounts_to_listen_to_ids = [user.get('id') for user in user_ids]
113+
114+
# Create filter string to get tweets from accounts_to_listen_to_ids mentioning any of accounts_mentioned
115+
if accounts_mentioned:
116+
mention_str = " OR ".join([f"@{account}" for account in accounts_mentioned])
117+
118+
if accounts_to_listen_to_ids:
119+
filter_str = " OR ".join([f"from:{user_id}" for user_id in accounts_to_listen_to_ids])
120+
filter_str = f"({filter_str}) ({mention_str}) -is:retweet"
121+
else:
122+
filter_str = f"({mention_str}) -is:retweet"
123+
else:
124+
filter_str = ""
125+
126+
102127
stream_function = agent.connection_manager.perform_action(
103128
connection_name="twitter",
104129
action_name="stream-tweets",
105130
params=[filter_str]
106131
)
132+
107133
def process_tweets():
108134
for tweet_data in stream_function:
109135
try:

src/agent.py

+13-5
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,14 @@ def __init__(
4747
if self.has_twitter_tasks and twitter_config:
4848
self.tweet_interval = twitter_config.get("tweet_interval", 900)
4949
self.own_tweet_replies_count = twitter_config.get("own_tweet_replies_count", 2)
50-
self.respond_to_mentions = twitter_config.get("respond_to_mentions", False)
50+
respond_to_mentions_config = twitter_config.get("respond_to_mentions", None)
51+
52+
if (respond_to_mentions_config):
53+
self.respond_to_mentions = respond_to_mentions_config.get("enabled", False)
54+
self.accounts_mentioned = respond_to_mentions_config.get("accounts_mentioned", [])
55+
self.accounts_to_listen_to = respond_to_mentions_config.get("accounts_to_listen_to", [])
56+
else:
57+
self.respond_to_mentions = False
5158

5259
# Extract Echochambers config
5360
echochambers_config = next((config for config in agent_dict["config"] if config["name"] == "echochambers"), None)
@@ -176,15 +183,16 @@ def loop(self):
176183
if self.has_twitter_tasks:
177184
if self.respond_to_mentions:
178185
logger.info("\n👀 Listening for mentions...")
179-
execute_action(self, "respond-to-mentions")
180-
186+
if (len(self.accounts_mentioned) == 0):
187+
self.accounts_mentioned = [self.username] # Default to listening to own mentions if no accounts mentioned
188+
execute_action(self, "respond-to-mentions", accounts_mentioned=self.accounts_mentioned, accounts_to_listen_to=self.accounts_to_listen_to)
181189
try:
182190
while True:
183191
success = False
184192
try:
185193
# REPLENISH INPUTS
186194
# TODO: Add more inputs to complexify agent behavior
187-
if "timeline_tweets" not in self.state or self.state["timeline_tweets"] is None or len(self.state["timeline_tweets"]) == 0:
195+
'''if "timeline_tweets" not in self.state or self.state["timeline_tweets"] is None or len(self.state["timeline_tweets"]) == 0:
188196
if (self.has_twitter_tasks):
189197
logger.info("\n👀 READING TIMELINE")
190198
self.state["timeline_tweets"] = self.connection_manager.perform_action(
@@ -200,7 +208,7 @@ def loop(self):
200208
connection_name="echochambers",
201209
action_name="get-room-info",
202210
params={}
203-
)
211+
)'''
204212

205213
# CHOOSE AN ACTION
206214
# TODO: Add agentic action selection

src/connections/twitter_connection.py

+28
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,14 @@ def register_actions(self) -> None:
9393
],
9494
description="Fetch tweet replies"
9595
),
96+
"get-user-details": Action(
97+
name="get-user-details",
98+
parameters=[
99+
ActionParameter("user_ids", True, list, "IDs of the user to get details for"),
100+
ActionParameter("usernames", True, list, "Usernames of the user to get details for")
101+
],
102+
description="Get details for user(s) by ID or username"
103+
),
96104
"get-tweet-details": Action(
97105
name="get-tweet-details",
98106
parameters=[
@@ -524,6 +532,26 @@ def get_tweet_replies(self, tweet_id: str, count: int = 10, **kwargs) -> List[di
524532

525533
logger.info(f"Retrieved {len(replies)} replies")
526534
return replies
535+
536+
def get_user_details(self, user_ids: list, usernames: list, **kwargs) -> dict:
537+
"""Get details for user(s) by ID or username"""
538+
logger.debug(f"Getting details for user_ids: {user_ids} or usernames: {usernames}")
539+
540+
params = {"user.fields": "username"}
541+
542+
if user_ids:
543+
params["ids"] = ",".join(user_ids)
544+
endpoint = "users"
545+
else:
546+
params["usernames"] = ",".join(usernames)
547+
endpoint = f"users/by/"
548+
549+
response = self._make_request('get', endpoint, params=params)
550+
551+
users = response.get("data", [])
552+
553+
logger.info("Retrieved user details")
554+
return users
527555

528556
def get_tweet_details(self, tweet_id: str, **kwargs) -> dict:
529557
"""Get details for a specific tweet"""

0 commit comments

Comments
 (0)