intentkit 0.8.6.dev2__py3-none-any.whl → 0.8.17__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of intentkit might be problematic. Click here for more details.
- intentkit/__init__.py +1 -1
- intentkit/abstracts/agent.py +4 -5
- intentkit/abstracts/engine.py +5 -5
- intentkit/abstracts/graph.py +10 -5
- intentkit/abstracts/skill.py +6 -144
- intentkit/abstracts/twitter.py +4 -5
- intentkit/clients/__init__.py +3 -2
- intentkit/clients/cdp.py +53 -92
- intentkit/clients/twitter.py +56 -57
- intentkit/clients/web3.py +1 -3
- intentkit/config/config.py +5 -0
- intentkit/core/agent.py +16 -388
- intentkit/core/asset.py +64 -18
- intentkit/core/client.py +1 -1
- intentkit/core/credit.py +19 -20
- intentkit/core/engine.py +26 -11
- intentkit/core/node.py +2 -1
- intentkit/core/prompt.py +53 -15
- intentkit/core/scheduler.py +9 -9
- intentkit/core/statistics.py +6 -7
- intentkit/models/agent.py +256 -176
- intentkit/models/agent_data.py +62 -36
- intentkit/models/agent_schema.json +6 -9
- intentkit/models/app_setting.py +6 -6
- intentkit/models/chat.py +28 -24
- intentkit/models/conversation.py +8 -8
- intentkit/models/credit.py +62 -64
- intentkit/models/db.py +8 -7
- intentkit/models/db_mig.py +2 -2
- intentkit/models/llm.csv +15 -12
- intentkit/models/llm.py +18 -16
- intentkit/models/redis.py +2 -3
- intentkit/models/skill.py +62 -66
- intentkit/models/skills.csv +30 -26
- intentkit/models/user.py +46 -21
- intentkit/skills/acolyt/__init__.py +2 -9
- intentkit/skills/acolyt/ask.py +3 -4
- intentkit/skills/acolyt/base.py +4 -9
- intentkit/skills/aixbt/__init__.py +2 -13
- intentkit/skills/aixbt/base.py +1 -7
- intentkit/skills/aixbt/projects.py +14 -15
- intentkit/skills/allora/__init__.py +2 -9
- intentkit/skills/allora/base.py +4 -9
- intentkit/skills/allora/price.py +3 -4
- intentkit/skills/base.py +175 -52
- intentkit/skills/basename/__init__.py +4 -8
- intentkit/skills/carv/__init__.py +115 -121
- intentkit/skills/carv/base.py +184 -185
- intentkit/skills/carv/fetch_news.py +3 -3
- intentkit/skills/carv/onchain_query.py +4 -4
- intentkit/skills/carv/token_info_and_price.py +5 -5
- intentkit/skills/casino/__init__.py +4 -15
- intentkit/skills/casino/base.py +1 -7
- intentkit/skills/casino/deck_draw.py +5 -8
- intentkit/skills/casino/deck_shuffle.py +6 -6
- intentkit/skills/casino/dice_roll.py +2 -4
- intentkit/skills/cdp/__init__.py +3 -10
- intentkit/skills/cdp/base.py +1 -7
- intentkit/skills/cdp/schema.json +1 -17
- intentkit/skills/chainlist/__init__.py +2 -7
- intentkit/skills/chainlist/base.py +1 -7
- intentkit/skills/chainlist/chain_lookup.py +18 -18
- intentkit/skills/common/__init__.py +2 -9
- intentkit/skills/common/base.py +1 -7
- intentkit/skills/common/current_time.py +1 -2
- intentkit/skills/cookiefun/__init__.py +6 -9
- intentkit/skills/cookiefun/base.py +2 -7
- intentkit/skills/cookiefun/get_account_details.py +7 -7
- intentkit/skills/cookiefun/get_account_feed.py +19 -19
- intentkit/skills/cookiefun/get_account_smart_followers.py +7 -7
- intentkit/skills/cookiefun/get_sectors.py +3 -3
- intentkit/skills/cookiefun/search_accounts.py +9 -9
- intentkit/skills/cryptocompare/__init__.py +7 -24
- intentkit/skills/cryptocompare/api.py +2 -3
- intentkit/skills/cryptocompare/base.py +10 -24
- intentkit/skills/cryptocompare/fetch_news.py +4 -5
- intentkit/skills/cryptocompare/fetch_price.py +6 -7
- intentkit/skills/cryptocompare/fetch_top_exchanges.py +4 -5
- intentkit/skills/cryptocompare/fetch_top_market_cap.py +4 -5
- intentkit/skills/cryptocompare/fetch_top_volume.py +4 -5
- intentkit/skills/cryptocompare/fetch_trading_signals.py +5 -6
- intentkit/skills/cryptopanic/__init__.py +7 -10
- intentkit/skills/cryptopanic/base.py +51 -55
- intentkit/skills/cryptopanic/fetch_crypto_news.py +4 -8
- intentkit/skills/cryptopanic/fetch_crypto_sentiment.py +5 -7
- intentkit/skills/dapplooker/__init__.py +2 -9
- intentkit/skills/dapplooker/base.py +4 -9
- intentkit/skills/dapplooker/dapplooker_token_data.py +7 -7
- intentkit/skills/defillama/__init__.py +24 -74
- intentkit/skills/defillama/api.py +6 -9
- intentkit/skills/defillama/base.py +8 -19
- intentkit/skills/defillama/coins/fetch_batch_historical_prices.py +8 -10
- intentkit/skills/defillama/coins/fetch_block.py +6 -8
- intentkit/skills/defillama/coins/fetch_current_prices.py +8 -10
- intentkit/skills/defillama/coins/fetch_first_price.py +7 -9
- intentkit/skills/defillama/coins/fetch_historical_prices.py +9 -11
- intentkit/skills/defillama/coins/fetch_price_chart.py +9 -11
- intentkit/skills/defillama/coins/fetch_price_percentage.py +7 -9
- intentkit/skills/defillama/config/chains.py +1 -3
- intentkit/skills/defillama/fees/fetch_fees_overview.py +24 -26
- intentkit/skills/defillama/stablecoins/fetch_stablecoin_chains.py +16 -18
- intentkit/skills/defillama/stablecoins/fetch_stablecoin_charts.py +8 -10
- intentkit/skills/defillama/stablecoins/fetch_stablecoin_prices.py +5 -7
- intentkit/skills/defillama/stablecoins/fetch_stablecoins.py +7 -9
- intentkit/skills/defillama/tests/api_integration.test.py +1 -1
- intentkit/skills/defillama/tvl/fetch_chain_historical_tvl.py +4 -6
- intentkit/skills/defillama/tvl/fetch_chains.py +9 -11
- intentkit/skills/defillama/tvl/fetch_historical_tvl.py +4 -6
- intentkit/skills/defillama/tvl/fetch_protocol.py +32 -38
- intentkit/skills/defillama/tvl/fetch_protocol_current_tvl.py +3 -5
- intentkit/skills/defillama/tvl/fetch_protocols.py +37 -45
- intentkit/skills/defillama/volumes/fetch_dex_overview.py +42 -48
- intentkit/skills/defillama/volumes/fetch_dex_summary.py +35 -37
- intentkit/skills/defillama/volumes/fetch_options_overview.py +24 -28
- intentkit/skills/defillama/yields/fetch_pool_chart.py +10 -12
- intentkit/skills/defillama/yields/fetch_pools.py +26 -30
- intentkit/skills/dexscreener/__init__.py +97 -102
- intentkit/skills/dexscreener/base.py +125 -130
- intentkit/skills/dexscreener/get_pair_info.py +4 -5
- intentkit/skills/dexscreener/get_token_pairs.py +4 -5
- intentkit/skills/dexscreener/get_tokens_info.py +7 -8
- intentkit/skills/dexscreener/model/search_token_response.py +80 -82
- intentkit/skills/dexscreener/search_token.py +182 -184
- intentkit/skills/dexscreener/utils.py +15 -14
- intentkit/skills/dune_analytics/__init__.py +7 -9
- intentkit/skills/dune_analytics/base.py +48 -52
- intentkit/skills/dune_analytics/fetch_kol_buys.py +5 -7
- intentkit/skills/dune_analytics/fetch_nation_metrics.py +6 -8
- intentkit/skills/elfa/__init__.py +5 -18
- intentkit/skills/elfa/base.py +10 -14
- intentkit/skills/elfa/mention.py +19 -21
- intentkit/skills/elfa/stats.py +4 -4
- intentkit/skills/elfa/tokens.py +12 -12
- intentkit/skills/elfa/utils.py +26 -28
- intentkit/skills/enso/__init__.py +11 -31
- intentkit/skills/enso/base.py +9 -15
- intentkit/skills/enso/best_yield.py +5 -7
- intentkit/skills/enso/networks.py +3 -9
- intentkit/skills/enso/prices.py +2 -4
- intentkit/skills/enso/route.py +6 -12
- intentkit/skills/enso/tokens.py +4 -16
- intentkit/skills/enso/wallet.py +6 -6
- intentkit/skills/erc20/__init__.py +5 -11
- intentkit/skills/erc721/__init__.py +5 -9
- intentkit/skills/firecrawl/__init__.py +5 -18
- intentkit/skills/firecrawl/base.py +4 -9
- intentkit/skills/firecrawl/clear.py +4 -8
- intentkit/skills/firecrawl/crawl.py +19 -19
- intentkit/skills/firecrawl/query.py +4 -3
- intentkit/skills/firecrawl/scrape.py +17 -22
- intentkit/skills/firecrawl/utils.py +50 -42
- intentkit/skills/github/__init__.py +2 -7
- intentkit/skills/github/base.py +1 -7
- intentkit/skills/github/github_search.py +1 -2
- intentkit/skills/heurist/__init__.py +8 -27
- intentkit/skills/heurist/base.py +4 -9
- intentkit/skills/heurist/image_generation_animagine_xl.py +12 -13
- intentkit/skills/heurist/image_generation_arthemy_comics.py +12 -13
- intentkit/skills/heurist/image_generation_arthemy_real.py +12 -13
- intentkit/skills/heurist/image_generation_braindance.py +12 -13
- intentkit/skills/heurist/image_generation_cyber_realistic_xl.py +12 -13
- intentkit/skills/heurist/image_generation_flux_1_dev.py +12 -13
- intentkit/skills/heurist/image_generation_sdxl.py +12 -13
- intentkit/skills/http/__init__.py +4 -15
- intentkit/skills/http/base.py +1 -7
- intentkit/skills/http/get.py +21 -16
- intentkit/skills/http/post.py +23 -18
- intentkit/skills/http/put.py +23 -18
- intentkit/skills/lifi/__init__.py +5 -10
- intentkit/skills/lifi/base.py +1 -7
- intentkit/skills/lifi/token_execute.py +14 -17
- intentkit/skills/lifi/token_quote.py +7 -9
- intentkit/skills/lifi/utils.py +16 -16
- intentkit/skills/moralis/__init__.py +6 -10
- intentkit/skills/moralis/api.py +6 -7
- intentkit/skills/moralis/base.py +5 -10
- intentkit/skills/moralis/fetch_chain_portfolio.py +10 -11
- intentkit/skills/moralis/fetch_nft_portfolio.py +22 -22
- intentkit/skills/moralis/fetch_solana_portfolio.py +11 -12
- intentkit/skills/moralis/fetch_wallet_portfolio.py +8 -9
- intentkit/skills/morpho/__init__.py +5 -9
- intentkit/skills/nation/__init__.py +4 -9
- intentkit/skills/nation/base.py +5 -10
- intentkit/skills/nation/nft_check.py +3 -4
- intentkit/skills/onchain.py +23 -0
- intentkit/skills/openai/__init__.py +17 -18
- intentkit/skills/openai/base.py +10 -14
- intentkit/skills/openai/dalle_image_generation.py +3 -8
- intentkit/skills/openai/gpt_avatar_generator.py +102 -0
- intentkit/skills/openai/gpt_image_generation.py +4 -8
- intentkit/skills/openai/gpt_image_mini_generator.py +91 -0
- intentkit/skills/openai/gpt_image_to_image.py +4 -8
- intentkit/skills/openai/image_to_text.py +3 -7
- intentkit/skills/openai/schema.json +32 -0
- intentkit/skills/portfolio/__init__.py +11 -35
- intentkit/skills/portfolio/base.py +33 -19
- intentkit/skills/portfolio/token_balances.py +21 -21
- intentkit/skills/portfolio/wallet_approvals.py +17 -18
- intentkit/skills/portfolio/wallet_defi_positions.py +3 -3
- intentkit/skills/portfolio/wallet_history.py +31 -31
- intentkit/skills/portfolio/wallet_net_worth.py +13 -13
- intentkit/skills/portfolio/wallet_nfts.py +19 -19
- intentkit/skills/portfolio/wallet_profitability.py +18 -18
- intentkit/skills/portfolio/wallet_profitability_summary.py +5 -5
- intentkit/skills/portfolio/wallet_stats.py +3 -3
- intentkit/skills/portfolio/wallet_swaps.py +19 -19
- intentkit/skills/pyth/__init__.py +4 -10
- intentkit/skills/skills.toml +4 -0
- intentkit/skills/slack/__init__.py +5 -17
- intentkit/skills/slack/base.py +3 -9
- intentkit/skills/slack/get_channel.py +8 -8
- intentkit/skills/slack/get_message.py +9 -9
- intentkit/skills/slack/schedule_message.py +5 -5
- intentkit/skills/slack/send_message.py +3 -5
- intentkit/skills/supabase/__init__.py +7 -23
- intentkit/skills/supabase/base.py +1 -7
- intentkit/skills/supabase/delete_data.py +4 -4
- intentkit/skills/supabase/fetch_data.py +12 -12
- intentkit/skills/supabase/insert_data.py +4 -4
- intentkit/skills/supabase/invoke_function.py +6 -6
- intentkit/skills/supabase/update_data.py +6 -6
- intentkit/skills/supabase/upsert_data.py +4 -4
- intentkit/skills/superfluid/__init__.py +5 -9
- intentkit/skills/system/__init__.py +7 -24
- intentkit/skills/system/add_autonomous_task.py +10 -12
- intentkit/skills/system/delete_autonomous_task.py +2 -2
- intentkit/skills/system/edit_autonomous_task.py +14 -18
- intentkit/skills/system/list_autonomous_tasks.py +3 -5
- intentkit/skills/system/read_agent_api_key.py +6 -4
- intentkit/skills/system/regenerate_agent_api_key.py +6 -4
- intentkit/skills/tavily/__init__.py +3 -12
- intentkit/skills/tavily/base.py +4 -9
- intentkit/skills/tavily/tavily_extract.py +2 -4
- intentkit/skills/tavily/tavily_search.py +4 -6
- intentkit/skills/token/__init__.py +5 -10
- intentkit/skills/token/base.py +7 -11
- intentkit/skills/token/erc20_transfers.py +19 -19
- intentkit/skills/token/token_analytics.py +3 -3
- intentkit/skills/token/token_price.py +13 -13
- intentkit/skills/token/token_search.py +9 -9
- intentkit/skills/twitter/__init__.py +11 -35
- intentkit/skills/twitter/base.py +22 -34
- intentkit/skills/twitter/follow_user.py +2 -6
- intentkit/skills/twitter/get_mentions.py +5 -12
- intentkit/skills/twitter/get_timeline.py +4 -12
- intentkit/skills/twitter/get_user_by_username.py +2 -6
- intentkit/skills/twitter/get_user_tweets.py +5 -13
- intentkit/skills/twitter/like_tweet.py +2 -6
- intentkit/skills/twitter/post_tweet.py +6 -9
- intentkit/skills/twitter/reply_tweet.py +6 -9
- intentkit/skills/twitter/retweet.py +2 -6
- intentkit/skills/twitter/search_tweets.py +4 -12
- intentkit/skills/unrealspeech/__init__.py +2 -7
- intentkit/skills/unrealspeech/base.py +2 -8
- intentkit/skills/unrealspeech/text_to_speech.py +8 -8
- intentkit/skills/venice_audio/__init__.py +98 -106
- intentkit/skills/venice_audio/base.py +117 -121
- intentkit/skills/venice_audio/input.py +41 -41
- intentkit/skills/venice_audio/venice_audio.py +7 -11
- intentkit/skills/venice_image/__init__.py +147 -154
- intentkit/skills/venice_image/api.py +138 -138
- intentkit/skills/venice_image/base.py +185 -192
- intentkit/skills/venice_image/config.py +33 -35
- intentkit/skills/venice_image/image_enhance/image_enhance.py +2 -3
- intentkit/skills/venice_image/image_enhance/image_enhance_base.py +21 -23
- intentkit/skills/venice_image/image_enhance/image_enhance_input.py +38 -40
- intentkit/skills/venice_image/image_generation/image_generation_base.py +9 -9
- intentkit/skills/venice_image/image_generation/image_generation_fluently_xl.py +26 -26
- intentkit/skills/venice_image/image_generation/image_generation_flux_dev.py +27 -27
- intentkit/skills/venice_image/image_generation/image_generation_flux_dev_uncensored.py +26 -26
- intentkit/skills/venice_image/image_generation/image_generation_input.py +158 -158
- intentkit/skills/venice_image/image_generation/image_generation_lustify_sdxl.py +26 -26
- intentkit/skills/venice_image/image_generation/image_generation_pony_realism.py +26 -26
- intentkit/skills/venice_image/image_generation/image_generation_stable_diffusion_3_5.py +28 -28
- intentkit/skills/venice_image/image_generation/image_generation_venice_sd35.py +28 -28
- intentkit/skills/venice_image/image_upscale/image_upscale.py +3 -3
- intentkit/skills/venice_image/image_upscale/image_upscale_base.py +21 -23
- intentkit/skills/venice_image/image_upscale/image_upscale_input.py +22 -22
- intentkit/skills/venice_image/image_vision/image_vision.py +2 -2
- intentkit/skills/venice_image/image_vision/image_vision_base.py +17 -17
- intentkit/skills/venice_image/image_vision/image_vision_input.py +9 -9
- intentkit/skills/venice_image/utils.py +77 -78
- intentkit/skills/web_scraper/__init__.py +5 -18
- intentkit/skills/web_scraper/base.py +21 -7
- intentkit/skills/web_scraper/document_indexer.py +7 -6
- intentkit/skills/web_scraper/scrape_and_index.py +15 -15
- intentkit/skills/web_scraper/utils.py +62 -63
- intentkit/skills/web_scraper/website_indexer.py +17 -19
- intentkit/skills/weth/__init__.py +5 -11
- intentkit/skills/wow/__init__.py +5 -11
- intentkit/skills/x402/__init__.py +61 -0
- intentkit/skills/x402/ask_agent.py +98 -0
- intentkit/skills/x402/base.py +99 -0
- intentkit/skills/x402/http_request.py +117 -0
- intentkit/skills/x402/schema.json +45 -0
- intentkit/skills/x402/x402.webp +0 -0
- intentkit/skills/xmtp/__init__.py +4 -15
- intentkit/skills/xmtp/base.py +5 -5
- intentkit/skills/xmtp/price.py +6 -6
- intentkit/skills/xmtp/swap.py +6 -8
- intentkit/skills/xmtp/transfer.py +4 -6
- intentkit/utils/error.py +2 -2
- intentkit/utils/logging.py +2 -4
- intentkit/utils/s3.py +8 -9
- intentkit/utils/schema.py +100 -0
- intentkit/utils/slack_alert.py +7 -8
- {intentkit-0.8.6.dev2.dist-info → intentkit-0.8.17.dist-info}/METADATA +3 -4
- intentkit-0.8.17.dist-info/RECORD +466 -0
- intentkit/models/generator.py +0 -347
- intentkit-0.8.6.dev2.dist-info/RECORD +0 -457
- {intentkit-0.8.6.dev2.dist-info → intentkit-0.8.17.dist-info}/WHEEL +0 -0
- {intentkit-0.8.6.dev2.dist-info → intentkit-0.8.17.dist-info}/licenses/LICENSE +0 -0
intentkit/clients/twitter.py
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import logging
|
|
2
2
|
import os
|
|
3
3
|
import tempfile
|
|
4
|
-
from datetime import datetime, timedelta
|
|
5
|
-
from typing import Any,
|
|
4
|
+
from datetime import UTC, datetime, timedelta
|
|
5
|
+
from typing import Any, NotRequired, TypedDict
|
|
6
6
|
from urllib.parse import urlencode
|
|
7
7
|
|
|
8
8
|
import httpx
|
|
@@ -11,15 +11,14 @@ from requests.auth import HTTPBasicAuth
|
|
|
11
11
|
from requests_oauthlib import OAuth2Session
|
|
12
12
|
from tweepy.asynchronous import AsyncClient
|
|
13
13
|
|
|
14
|
-
from intentkit.abstracts.skill import SkillStoreABC
|
|
15
14
|
from intentkit.abstracts.twitter import TwitterABC
|
|
16
15
|
from intentkit.models.agent_data import AgentData
|
|
17
16
|
from intentkit.models.redis import get_redis
|
|
18
17
|
|
|
19
18
|
logger = logging.getLogger(__name__)
|
|
20
19
|
|
|
21
|
-
_clients_linked:
|
|
22
|
-
_clients_self_key:
|
|
20
|
+
_clients_linked: dict[str, "TwitterClient"] = {}
|
|
21
|
+
_clients_self_key: dict[str, "TwitterClient"] = {}
|
|
23
22
|
|
|
24
23
|
_VERIFIER_KEY = "intentkit:twitter:code_verifier"
|
|
25
24
|
_CHALLENGE_KEY = "intentkit:twitter:code_challenge"
|
|
@@ -30,7 +29,7 @@ class TwitterMedia(BaseModel):
|
|
|
30
29
|
|
|
31
30
|
media_key: str
|
|
32
31
|
type: str
|
|
33
|
-
url:
|
|
32
|
+
url: str | None = None
|
|
34
33
|
|
|
35
34
|
|
|
36
35
|
class TwitterUser(BaseModel):
|
|
@@ -59,10 +58,10 @@ class Tweet(BaseModel):
|
|
|
59
58
|
id: str
|
|
60
59
|
text: str
|
|
61
60
|
author_id: str
|
|
62
|
-
author:
|
|
61
|
+
author: TwitterUser | None = None
|
|
63
62
|
created_at: datetime
|
|
64
|
-
referenced_tweets:
|
|
65
|
-
attachments:
|
|
63
|
+
referenced_tweets: list["Tweet"] | None = None
|
|
64
|
+
attachments: list[TwitterMedia] | None = None
|
|
66
65
|
|
|
67
66
|
|
|
68
67
|
class TwitterClientConfig(TypedDict):
|
|
@@ -80,33 +79,44 @@ class TwitterClient(TwitterABC):
|
|
|
80
79
|
|
|
81
80
|
Args:
|
|
82
81
|
agent_id: The ID of the agent
|
|
83
|
-
skill_store: The skill store for retrieving data
|
|
84
82
|
config: Configuration dictionary that may contain API keys
|
|
85
83
|
"""
|
|
86
84
|
|
|
87
|
-
def __init__(self, agent_id: str,
|
|
85
|
+
def __init__(self, agent_id: str, config: dict) -> None:
|
|
88
86
|
"""Initialize the Twitter client.
|
|
89
87
|
|
|
90
88
|
Args:
|
|
91
89
|
agent_id: The ID of the agent
|
|
92
|
-
skill_store: The skill store for retrieving data
|
|
93
90
|
config: Configuration dictionary that may contain API keys
|
|
94
91
|
"""
|
|
95
92
|
self.agent_id = agent_id
|
|
96
|
-
self._client:
|
|
97
|
-
self.
|
|
98
|
-
self._agent_data: Optional[AgentData] = None
|
|
93
|
+
self._client: AsyncClient | None = None
|
|
94
|
+
self._agent_data: AgentData | None = None
|
|
99
95
|
self.use_key = _is_self_key(config)
|
|
100
96
|
self._config = config
|
|
101
97
|
|
|
98
|
+
async def _get_agent_data(self) -> AgentData:
|
|
99
|
+
"""Retrieve cached agent data, loading from the database if needed."""
|
|
100
|
+
|
|
101
|
+
if not self._agent_data:
|
|
102
|
+
self._agent_data = await AgentData.get(self.agent_id)
|
|
103
|
+
return self._agent_data
|
|
104
|
+
|
|
105
|
+
async def _refresh_agent_data(self) -> AgentData:
|
|
106
|
+
"""Reload agent data from the database."""
|
|
107
|
+
|
|
108
|
+
self._agent_data = await AgentData.get(self.agent_id)
|
|
109
|
+
return self._agent_data
|
|
110
|
+
|
|
102
111
|
async def get_client(self) -> AsyncClient:
|
|
103
112
|
"""Get the initialized Twitter client.
|
|
104
113
|
|
|
105
114
|
Returns:
|
|
106
115
|
AsyncClient: The Twitter client if initialized
|
|
107
116
|
"""
|
|
108
|
-
|
|
109
|
-
|
|
117
|
+
|
|
118
|
+
agent_data = await self._get_agent_data()
|
|
119
|
+
|
|
110
120
|
if not self._client:
|
|
111
121
|
# Check if we have API keys in config
|
|
112
122
|
if self.use_key:
|
|
@@ -118,30 +128,26 @@ class TwitterClient(TwitterABC):
|
|
|
118
128
|
return_type=dict,
|
|
119
129
|
)
|
|
120
130
|
# refresh userinfo if needed
|
|
121
|
-
if not
|
|
122
|
-
|
|
123
|
-
< datetime.now(tz=
|
|
131
|
+
if not agent_data.twitter_self_key_refreshed_at or (
|
|
132
|
+
agent_data.twitter_self_key_refreshed_at
|
|
133
|
+
< datetime.now(tz=UTC) - timedelta(days=1)
|
|
124
134
|
):
|
|
125
135
|
me = await self._client.get_me(
|
|
126
136
|
user_auth=self.use_key,
|
|
127
137
|
user_fields="id,username,name,verified",
|
|
128
138
|
)
|
|
129
139
|
if me and "data" in me and "id" in me["data"]:
|
|
130
|
-
await
|
|
140
|
+
await AgentData.patch(
|
|
131
141
|
self.agent_id,
|
|
132
142
|
{
|
|
133
143
|
"twitter_id": me["data"]["id"],
|
|
134
144
|
"twitter_username": me["data"]["username"],
|
|
135
145
|
"twitter_name": me["data"]["name"],
|
|
136
146
|
"twitter_is_verified": me["data"]["verified"],
|
|
137
|
-
"twitter_self_key_refreshed_at": datetime.now(
|
|
138
|
-
tz=timezone.utc
|
|
139
|
-
),
|
|
147
|
+
"twitter_self_key_refreshed_at": datetime.now(tz=UTC),
|
|
140
148
|
},
|
|
141
149
|
)
|
|
142
|
-
|
|
143
|
-
self.agent_id
|
|
144
|
-
)
|
|
150
|
+
agent_data = await self._refresh_agent_data()
|
|
145
151
|
logger.info(
|
|
146
152
|
f"Twitter self key client initialized. "
|
|
147
153
|
f"Use API key: {self.use_key}, "
|
|
@@ -152,43 +158,38 @@ class TwitterClient(TwitterABC):
|
|
|
152
158
|
)
|
|
153
159
|
return self._client
|
|
154
160
|
# Otherwise try to get OAuth2 tokens from agent data
|
|
155
|
-
if not
|
|
161
|
+
if not agent_data.twitter_access_token:
|
|
156
162
|
raise Exception(f"[{self.agent_id}] Twitter access token not found")
|
|
157
|
-
if not
|
|
163
|
+
if not agent_data.twitter_access_token_expires_at:
|
|
158
164
|
raise Exception(
|
|
159
165
|
f"[{self.agent_id}] Twitter access token expiration not found"
|
|
160
166
|
)
|
|
161
|
-
if
|
|
162
|
-
tz=timezone.utc
|
|
163
|
-
):
|
|
167
|
+
if agent_data.twitter_access_token_expires_at <= datetime.now(tz=UTC):
|
|
164
168
|
raise Exception(f"[{self.agent_id}] Twitter access token has expired")
|
|
165
169
|
self._client = AsyncClient(
|
|
166
|
-
bearer_token=
|
|
170
|
+
bearer_token=agent_data.twitter_access_token,
|
|
167
171
|
return_type=dict,
|
|
168
172
|
)
|
|
169
173
|
return self._client
|
|
174
|
+
|
|
170
175
|
if not self.use_key:
|
|
171
176
|
# check if access token has expired
|
|
172
|
-
if
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
self._agent_data = await self._skill_store.get_agent_data(self.agent_id)
|
|
176
|
-
# check again
|
|
177
|
-
if self._agent_data.twitter_access_token_expires_at <= datetime.now(
|
|
178
|
-
tz=timezone.utc
|
|
179
|
-
):
|
|
177
|
+
if agent_data.twitter_access_token_expires_at <= datetime.now(tz=UTC):
|
|
178
|
+
agent_data = await self._refresh_agent_data()
|
|
179
|
+
if agent_data.twitter_access_token_expires_at <= datetime.now(tz=UTC):
|
|
180
180
|
raise Exception(
|
|
181
181
|
f"[{self.agent_id}] Twitter access token has expired"
|
|
182
182
|
)
|
|
183
183
|
self._client = AsyncClient(
|
|
184
|
-
bearer_token=
|
|
184
|
+
bearer_token=agent_data.twitter_access_token,
|
|
185
185
|
return_type=dict,
|
|
186
186
|
)
|
|
187
187
|
return self._client
|
|
188
|
+
|
|
188
189
|
return self._client
|
|
189
190
|
|
|
190
191
|
@property
|
|
191
|
-
def self_id(self) ->
|
|
192
|
+
def self_id(self) -> str | None:
|
|
192
193
|
"""Get the Twitter user ID.
|
|
193
194
|
|
|
194
195
|
Returns:
|
|
@@ -201,7 +202,7 @@ class TwitterClient(TwitterABC):
|
|
|
201
202
|
return self._agent_data.twitter_id
|
|
202
203
|
|
|
203
204
|
@property
|
|
204
|
-
def self_username(self) ->
|
|
205
|
+
def self_username(self) -> str | None:
|
|
205
206
|
"""Get the Twitter username.
|
|
206
207
|
|
|
207
208
|
Returns:
|
|
@@ -214,7 +215,7 @@ class TwitterClient(TwitterABC):
|
|
|
214
215
|
return self._agent_data.twitter_username
|
|
215
216
|
|
|
216
217
|
@property
|
|
217
|
-
def self_name(self) ->
|
|
218
|
+
def self_name(self) -> str | None:
|
|
218
219
|
"""Get the Twitter display name.
|
|
219
220
|
|
|
220
221
|
Returns:
|
|
@@ -227,7 +228,7 @@ class TwitterClient(TwitterABC):
|
|
|
227
228
|
return self._agent_data.twitter_name
|
|
228
229
|
|
|
229
230
|
@property
|
|
230
|
-
def self_is_verified(self) ->
|
|
231
|
+
def self_is_verified(self) -> bool | None:
|
|
231
232
|
"""Get the Twitter account verification status.
|
|
232
233
|
|
|
233
234
|
Returns:
|
|
@@ -239,14 +240,14 @@ class TwitterClient(TwitterABC):
|
|
|
239
240
|
return None
|
|
240
241
|
return self._agent_data.twitter_is_verified
|
|
241
242
|
|
|
242
|
-
def process_tweets_response(self, response:
|
|
243
|
+
def process_tweets_response(self, response: dict[str, Any]) -> list[Tweet]:
|
|
243
244
|
"""Process Twitter API response and convert it to a list of Tweet objects.
|
|
244
245
|
|
|
245
246
|
Args:
|
|
246
247
|
response: Raw Twitter API response containing tweets data and includes.
|
|
247
248
|
|
|
248
249
|
Returns:
|
|
249
|
-
|
|
250
|
+
list[Tweet]: List of processed Tweet objects.
|
|
250
251
|
"""
|
|
251
252
|
result = []
|
|
252
253
|
if not response.get("data"):
|
|
@@ -338,7 +339,7 @@ class TwitterClient(TwitterABC):
|
|
|
338
339
|
|
|
339
340
|
return result
|
|
340
341
|
|
|
341
|
-
async def upload_media(self, agent_id: str, image_url: str) ->
|
|
342
|
+
async def upload_media(self, agent_id: str, image_url: str) -> list[str]:
|
|
342
343
|
"""Upload media to Twitter and return the media IDs.
|
|
343
344
|
|
|
344
345
|
Args:
|
|
@@ -346,13 +347,13 @@ class TwitterClient(TwitterABC):
|
|
|
346
347
|
image_url: The URL of the image to upload.
|
|
347
348
|
|
|
348
349
|
Returns:
|
|
349
|
-
|
|
350
|
+
list[str]: A list of media IDs for the uploaded media.
|
|
350
351
|
|
|
351
352
|
Raises:
|
|
352
353
|
ValueError: If there's an error uploading the media.
|
|
353
354
|
"""
|
|
354
355
|
# Get agent data to access the token
|
|
355
|
-
agent_data = await
|
|
356
|
+
agent_data = await AgentData.get(agent_id)
|
|
356
357
|
if not agent_data.twitter_access_token:
|
|
357
358
|
raise ValueError("Only linked X account can post media")
|
|
358
359
|
|
|
@@ -419,19 +420,17 @@ class TwitterClient(TwitterABC):
|
|
|
419
420
|
return media_ids
|
|
420
421
|
|
|
421
422
|
|
|
422
|
-
def _is_self_key(config:
|
|
423
|
+
def _is_self_key(config: dict) -> bool:
|
|
423
424
|
return config.get("api_key_provider") == "agent_owner"
|
|
424
425
|
|
|
425
426
|
|
|
426
|
-
def get_twitter_client(
|
|
427
|
-
agent_id: str, skill_store: SkillStoreABC, config: Dict
|
|
428
|
-
) -> "TwitterClient":
|
|
427
|
+
def get_twitter_client(agent_id: str, config: dict) -> "TwitterClient":
|
|
429
428
|
if _is_self_key(config):
|
|
430
429
|
if agent_id not in _clients_self_key:
|
|
431
|
-
_clients_self_key[agent_id] = TwitterClient(agent_id,
|
|
430
|
+
_clients_self_key[agent_id] = TwitterClient(agent_id, config)
|
|
432
431
|
return _clients_self_key[agent_id]
|
|
433
432
|
if agent_id not in _clients_linked:
|
|
434
|
-
_clients_linked[agent_id] = TwitterClient(agent_id,
|
|
433
|
+
_clients_linked[agent_id] = TwitterClient(agent_id, config)
|
|
435
434
|
return _clients_linked[agent_id]
|
|
436
435
|
|
|
437
436
|
|
intentkit/clients/web3.py
CHANGED
|
@@ -1,12 +1,10 @@
|
|
|
1
|
-
from typing import Dict
|
|
2
|
-
|
|
3
1
|
from web3 import Web3
|
|
4
2
|
|
|
5
3
|
from intentkit.config.config import config
|
|
6
4
|
from intentkit.utils.chain import ChainProvider
|
|
7
5
|
|
|
8
6
|
# Global cache for Web3 clients by network_id
|
|
9
|
-
_web3_client_cache:
|
|
7
|
+
_web3_client_cache: dict[str, Web3] = {}
|
|
10
8
|
|
|
11
9
|
|
|
12
10
|
def get_web3_client(network_id: str) -> Web3:
|
intentkit/config/config.py
CHANGED
|
@@ -79,6 +79,7 @@ class Config:
|
|
|
79
79
|
self.debug_password = self.load("DEBUG_PASSWORD")
|
|
80
80
|
# Payment
|
|
81
81
|
self.payment_enabled = self.load("PAYMENT_ENABLED", "false") == "true"
|
|
82
|
+
self.x402_fee_address = self.load("X402_FEE_ADDRESS")
|
|
82
83
|
# Open API for agent
|
|
83
84
|
self.open_api_base_url = self.load("OPEN_API_BASE_URL", "http://localhost:8000")
|
|
84
85
|
# CDP - AgentKit 0.7.x Configuration
|
|
@@ -108,6 +109,10 @@ class Config:
|
|
|
108
109
|
self.tg_server_host = self.load("TG_SERVER_HOST", "127.0.0.1")
|
|
109
110
|
self.tg_server_port = self.load("TG_SERVER_PORT", "8081")
|
|
110
111
|
self.tg_new_agent_poll_interval = self.load("TG_NEW_AGENT_POLL_INTERVAL", "60")
|
|
112
|
+
# Discord server settings
|
|
113
|
+
self.discord_new_agent_poll_interval = self.load(
|
|
114
|
+
"DISCORD_NEW_AGENT_POLL_INTERVAL", "30"
|
|
115
|
+
)
|
|
111
116
|
# Twitter
|
|
112
117
|
self.twitter_oauth2_client_id = self.load("TWITTER_OAUTH2_CLIENT_ID")
|
|
113
118
|
self.twitter_oauth2_client_secret = self.load("TWITTER_OAUTH2_CLIENT_SECRET")
|