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/__init__.py
CHANGED
intentkit/abstracts/agent.py
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
from abc import ABC, abstractmethod
|
|
2
|
-
from typing import Dict, Optional
|
|
3
2
|
|
|
4
3
|
from intentkit.models.agent import Agent
|
|
5
4
|
from intentkit.models.agent_data import AgentData, AgentQuota
|
|
@@ -24,7 +23,7 @@ class AgentStoreABC(ABC):
|
|
|
24
23
|
self.agent_id = agent_id
|
|
25
24
|
|
|
26
25
|
@abstractmethod
|
|
27
|
-
async def get_config(self) ->
|
|
26
|
+
async def get_config(self) -> Agent | None:
|
|
28
27
|
"""Get agent configuration.
|
|
29
28
|
|
|
30
29
|
Returns:
|
|
@@ -33,7 +32,7 @@ class AgentStoreABC(ABC):
|
|
|
33
32
|
pass
|
|
34
33
|
|
|
35
34
|
@abstractmethod
|
|
36
|
-
async def get_data(self) ->
|
|
35
|
+
async def get_data(self) -> AgentData | None:
|
|
37
36
|
"""Get additional agent data.
|
|
38
37
|
|
|
39
38
|
Returns:
|
|
@@ -42,7 +41,7 @@ class AgentStoreABC(ABC):
|
|
|
42
41
|
pass
|
|
43
42
|
|
|
44
43
|
@abstractmethod
|
|
45
|
-
async def set_data(self, data:
|
|
44
|
+
async def set_data(self, data: dict) -> None:
|
|
46
45
|
"""Update agent data.
|
|
47
46
|
|
|
48
47
|
Args:
|
|
@@ -51,7 +50,7 @@ class AgentStoreABC(ABC):
|
|
|
51
50
|
pass
|
|
52
51
|
|
|
53
52
|
@abstractmethod
|
|
54
|
-
async def get_quota(self) ->
|
|
53
|
+
async def get_quota(self) -> AgentQuota | None:
|
|
55
54
|
"""Get agent quota information.
|
|
56
55
|
|
|
57
56
|
Returns:
|
intentkit/abstracts/engine.py
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
from
|
|
1
|
+
from collections.abc import Callable
|
|
2
2
|
|
|
3
3
|
from pydantic import BaseModel
|
|
4
4
|
|
|
@@ -12,19 +12,19 @@ class AgentMessageInput(BaseModel):
|
|
|
12
12
|
|
|
13
13
|
Attributes:
|
|
14
14
|
text (str): The main text content of the message or query
|
|
15
|
-
images (
|
|
15
|
+
images (list[str]): List of image references/URLs to be processed by the agent.
|
|
16
16
|
Empty list if no images are provided.
|
|
17
17
|
"""
|
|
18
18
|
|
|
19
19
|
text: str # required
|
|
20
20
|
"""The main text content or query to be processed by the agent"""
|
|
21
21
|
|
|
22
|
-
images:
|
|
22
|
+
images: list[str] = [] # optional, defaults to empty list
|
|
23
23
|
"""List of image references or URLs for multimodal processing"""
|
|
24
24
|
|
|
25
25
|
|
|
26
26
|
# Define a type hint for the callback that takes three strings and returns a list of strings
|
|
27
|
-
AgentExecutionCallback = Callable[[str, AgentMessageInput, str],
|
|
27
|
+
AgentExecutionCallback = Callable[[str, AgentMessageInput, str], list[str]]
|
|
28
28
|
"""Callback function type for agent execution.
|
|
29
29
|
|
|
30
30
|
Args:
|
|
@@ -33,6 +33,6 @@ Args:
|
|
|
33
33
|
thread_id (str): The thread ID for tracking the conversation context
|
|
34
34
|
|
|
35
35
|
Returns:
|
|
36
|
-
|
|
36
|
+
list[str]: A list of formatted response lines from the agent execution. Each line
|
|
37
37
|
typically contains input/output markers, agent responses, and timing information.
|
|
38
38
|
"""
|
intentkit/abstracts/graph.py
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
|
+
from collections.abc import Callable
|
|
1
2
|
from enum import Enum
|
|
2
|
-
from typing import Any,
|
|
3
|
+
from typing import Any, NotRequired
|
|
3
4
|
|
|
4
5
|
from langgraph.prebuilt.chat_agent_executor import AgentState as BaseAgentState
|
|
5
6
|
from pydantic import BaseModel
|
|
@@ -23,21 +24,25 @@ class AgentState(BaseAgentState):
|
|
|
23
24
|
|
|
24
25
|
context: dict[str, Any]
|
|
25
26
|
error: NotRequired[AgentError]
|
|
26
|
-
__extra__: NotRequired[
|
|
27
|
+
__extra__: NotRequired[dict[str, Any]]
|
|
27
28
|
|
|
28
29
|
|
|
29
30
|
class AgentContext(BaseModel):
|
|
30
31
|
agent_id: str
|
|
31
32
|
get_agent: Callable[[], Agent]
|
|
32
33
|
chat_id: str
|
|
33
|
-
user_id:
|
|
34
|
-
app_id:
|
|
34
|
+
user_id: str | None = None
|
|
35
|
+
app_id: str | None = None
|
|
35
36
|
entrypoint: AuthorType
|
|
36
37
|
is_private: bool
|
|
37
38
|
search: bool = False
|
|
38
39
|
thinking: bool = False
|
|
39
|
-
payer:
|
|
40
|
+
payer: str | None = None
|
|
40
41
|
|
|
41
42
|
@property
|
|
42
43
|
def agent(self) -> Agent:
|
|
43
44
|
return self.get_agent()
|
|
45
|
+
|
|
46
|
+
@property
|
|
47
|
+
def thread_id(self) -> str:
|
|
48
|
+
return f"{self.agent_id}-{self.chat_id}"
|
intentkit/abstracts/skill.py
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
from abc import ABC, abstractmethod
|
|
2
|
-
from typing import Any
|
|
2
|
+
from typing import Any
|
|
3
3
|
|
|
4
|
-
from intentkit.models.agent import Agent
|
|
4
|
+
from intentkit.models.agent import Agent
|
|
5
5
|
from intentkit.models.agent_data import AgentData, AgentQuota
|
|
6
6
|
|
|
7
7
|
|
|
@@ -20,7 +20,7 @@ class SkillStoreABC(ABC):
|
|
|
20
20
|
|
|
21
21
|
@staticmethod
|
|
22
22
|
@abstractmethod
|
|
23
|
-
async def get_agent_config(agent_id: str) ->
|
|
23
|
+
async def get_agent_config(agent_id: str) -> Agent | None:
|
|
24
24
|
"""Get agent configuration.
|
|
25
25
|
|
|
26
26
|
Returns:
|
|
@@ -30,7 +30,7 @@ class SkillStoreABC(ABC):
|
|
|
30
30
|
|
|
31
31
|
@staticmethod
|
|
32
32
|
@abstractmethod
|
|
33
|
-
async def get_agent_data(agent_id: str) ->
|
|
33
|
+
async def get_agent_data(agent_id: str) -> AgentData | None:
|
|
34
34
|
"""Get additional agent data.
|
|
35
35
|
|
|
36
36
|
Returns:
|
|
@@ -40,7 +40,7 @@ class SkillStoreABC(ABC):
|
|
|
40
40
|
|
|
41
41
|
@staticmethod
|
|
42
42
|
@abstractmethod
|
|
43
|
-
async def set_agent_data(agent_id: str, data:
|
|
43
|
+
async def set_agent_data(agent_id: str, data: dict) -> None:
|
|
44
44
|
"""Update agent data.
|
|
45
45
|
|
|
46
46
|
Args:
|
|
@@ -51,148 +51,10 @@ class SkillStoreABC(ABC):
|
|
|
51
51
|
|
|
52
52
|
@staticmethod
|
|
53
53
|
@abstractmethod
|
|
54
|
-
async def get_agent_quota(agent_id: str) ->
|
|
54
|
+
async def get_agent_quota(agent_id: str) -> AgentQuota | None:
|
|
55
55
|
"""Get agent quota information.
|
|
56
56
|
|
|
57
57
|
Returns:
|
|
58
58
|
Agent quota if found, None otherwise
|
|
59
59
|
"""
|
|
60
60
|
pass
|
|
61
|
-
|
|
62
|
-
@staticmethod
|
|
63
|
-
@abstractmethod
|
|
64
|
-
async def get_agent_skill_data(
|
|
65
|
-
agent_id: str, skill: str, key: str
|
|
66
|
-
) -> Optional[Dict[str, Any]]:
|
|
67
|
-
"""Get skill data for an agent.
|
|
68
|
-
|
|
69
|
-
Args:
|
|
70
|
-
agent_id: ID of the agent
|
|
71
|
-
skill: Name of the skill
|
|
72
|
-
key: Data key
|
|
73
|
-
|
|
74
|
-
Returns:
|
|
75
|
-
Dictionary containing the skill data if found, None otherwise
|
|
76
|
-
"""
|
|
77
|
-
pass
|
|
78
|
-
|
|
79
|
-
@staticmethod
|
|
80
|
-
@abstractmethod
|
|
81
|
-
async def save_agent_skill_data(
|
|
82
|
-
agent_id: str, skill: str, key: str, data: Dict[str, Any]
|
|
83
|
-
) -> None:
|
|
84
|
-
"""Save or update skill data for an agent.
|
|
85
|
-
|
|
86
|
-
Args:
|
|
87
|
-
agent_id: ID of the agent
|
|
88
|
-
skill: Name of the skill
|
|
89
|
-
key: Data key
|
|
90
|
-
data: JSON data to store
|
|
91
|
-
"""
|
|
92
|
-
pass
|
|
93
|
-
|
|
94
|
-
@staticmethod
|
|
95
|
-
@abstractmethod
|
|
96
|
-
async def delete_agent_skill_data(agent_id: str, skill: str, key: str) -> None:
|
|
97
|
-
"""Delete skill data for an agent.
|
|
98
|
-
|
|
99
|
-
Args:
|
|
100
|
-
agent_id: ID of the agent
|
|
101
|
-
skill: Name of the skill
|
|
102
|
-
key: Data key
|
|
103
|
-
"""
|
|
104
|
-
pass
|
|
105
|
-
|
|
106
|
-
@staticmethod
|
|
107
|
-
@abstractmethod
|
|
108
|
-
async def get_thread_skill_data(
|
|
109
|
-
thread_id: str, skill: str, key: str
|
|
110
|
-
) -> Optional[Dict[str, Any]]:
|
|
111
|
-
"""Get skill data for a thread.
|
|
112
|
-
|
|
113
|
-
Args:
|
|
114
|
-
thread_id: ID of the thread
|
|
115
|
-
skill: Name of the skill
|
|
116
|
-
key: Data key
|
|
117
|
-
|
|
118
|
-
Returns:
|
|
119
|
-
Dictionary containing the skill data if found, None otherwise
|
|
120
|
-
"""
|
|
121
|
-
pass
|
|
122
|
-
|
|
123
|
-
@staticmethod
|
|
124
|
-
@abstractmethod
|
|
125
|
-
async def save_thread_skill_data(
|
|
126
|
-
thread_id: str,
|
|
127
|
-
agent_id: str,
|
|
128
|
-
skill: str,
|
|
129
|
-
key: str,
|
|
130
|
-
data: Dict[str, Any],
|
|
131
|
-
) -> None:
|
|
132
|
-
"""Save or update skill data for a thread.
|
|
133
|
-
|
|
134
|
-
Args:
|
|
135
|
-
thread_id: ID of the thread
|
|
136
|
-
agent_id: ID of the agent that owns this thread
|
|
137
|
-
skill: Name of the skill
|
|
138
|
-
key: Data key
|
|
139
|
-
data: JSON data to store
|
|
140
|
-
"""
|
|
141
|
-
pass
|
|
142
|
-
|
|
143
|
-
@staticmethod
|
|
144
|
-
@abstractmethod
|
|
145
|
-
async def list_autonomous_tasks(agent_id: str) -> List[AgentAutonomous]:
|
|
146
|
-
"""List all autonomous tasks for an agent.
|
|
147
|
-
|
|
148
|
-
Args:
|
|
149
|
-
agent_id: ID of the agent
|
|
150
|
-
|
|
151
|
-
Returns:
|
|
152
|
-
List[AgentAutonomous]: List of autonomous task configurations
|
|
153
|
-
"""
|
|
154
|
-
pass
|
|
155
|
-
|
|
156
|
-
@staticmethod
|
|
157
|
-
@abstractmethod
|
|
158
|
-
async def add_autonomous_task(
|
|
159
|
-
agent_id: str, task: AgentAutonomous
|
|
160
|
-
) -> AgentAutonomous:
|
|
161
|
-
"""Add a new autonomous task to an agent.
|
|
162
|
-
|
|
163
|
-
Args:
|
|
164
|
-
agent_id: ID of the agent
|
|
165
|
-
task: Autonomous task configuration
|
|
166
|
-
|
|
167
|
-
Returns:
|
|
168
|
-
AgentAutonomous: The created task
|
|
169
|
-
"""
|
|
170
|
-
pass
|
|
171
|
-
|
|
172
|
-
@staticmethod
|
|
173
|
-
@abstractmethod
|
|
174
|
-
async def delete_autonomous_task(agent_id: str, task_id: str) -> None:
|
|
175
|
-
"""Delete an autonomous task from an agent.
|
|
176
|
-
|
|
177
|
-
Args:
|
|
178
|
-
agent_id: ID of the agent
|
|
179
|
-
task_id: ID of the task to delete
|
|
180
|
-
"""
|
|
181
|
-
pass
|
|
182
|
-
|
|
183
|
-
@staticmethod
|
|
184
|
-
@abstractmethod
|
|
185
|
-
async def update_autonomous_task(
|
|
186
|
-
agent_id: str, task_id: str, task_updates: dict
|
|
187
|
-
) -> AgentAutonomous:
|
|
188
|
-
"""Update an autonomous task for an agent.
|
|
189
|
-
|
|
190
|
-
Args:
|
|
191
|
-
agent_id: ID of the agent
|
|
192
|
-
task_id: ID of the task to update
|
|
193
|
-
task_updates: Dictionary containing fields to update
|
|
194
|
-
|
|
195
|
-
Returns:
|
|
196
|
-
AgentAutonomous: The updated task
|
|
197
|
-
"""
|
|
198
|
-
pass
|
intentkit/abstracts/twitter.py
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
from abc import ABC, abstractmethod
|
|
2
|
-
from typing import Optional
|
|
3
2
|
|
|
4
3
|
from tweepy.asynchronous import AsyncClient
|
|
5
4
|
|
|
@@ -15,7 +14,7 @@ class TwitterABC(ABC):
|
|
|
15
14
|
use_key = False
|
|
16
15
|
|
|
17
16
|
@abstractmethod
|
|
18
|
-
async def get_client(self) ->
|
|
17
|
+
async def get_client(self) -> AsyncClient | None:
|
|
19
18
|
"""Get a configured Tweepy client.
|
|
20
19
|
|
|
21
20
|
Returns:
|
|
@@ -25,7 +24,7 @@ class TwitterABC(ABC):
|
|
|
25
24
|
|
|
26
25
|
@property
|
|
27
26
|
@abstractmethod
|
|
28
|
-
def self_id(self) ->
|
|
27
|
+
def self_id(self) -> str | None:
|
|
29
28
|
"""Get the Twitter user ID.
|
|
30
29
|
|
|
31
30
|
Returns:
|
|
@@ -35,7 +34,7 @@ class TwitterABC(ABC):
|
|
|
35
34
|
|
|
36
35
|
@property
|
|
37
36
|
@abstractmethod
|
|
38
|
-
def self_username(self) ->
|
|
37
|
+
def self_username(self) -> str | None:
|
|
39
38
|
"""Get the Twitter username.
|
|
40
39
|
|
|
41
40
|
Returns:
|
|
@@ -45,7 +44,7 @@ class TwitterABC(ABC):
|
|
|
45
44
|
|
|
46
45
|
@property
|
|
47
46
|
@abstractmethod
|
|
48
|
-
def self_name(self) ->
|
|
47
|
+
def self_name(self) -> str | None:
|
|
49
48
|
"""Get the Twitter display name.
|
|
50
49
|
|
|
51
50
|
Returns:
|
intentkit/clients/__init__.py
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
from intentkit.clients.cdp import
|
|
1
|
+
from intentkit.clients.cdp import get_cdp_client, get_evm_account, get_wallet_provider
|
|
2
2
|
from intentkit.clients.twitter import (
|
|
3
3
|
TwitterClient,
|
|
4
4
|
TwitterClientConfig,
|
|
@@ -10,7 +10,8 @@ __all__ = [
|
|
|
10
10
|
"TwitterClient",
|
|
11
11
|
"TwitterClientConfig",
|
|
12
12
|
"get_twitter_client",
|
|
13
|
-
"
|
|
13
|
+
"get_evm_account",
|
|
14
|
+
"get_cdp_client",
|
|
14
15
|
"get_wallet_provider",
|
|
15
16
|
"get_web3_client",
|
|
16
17
|
]
|
intentkit/clients/cdp.py
CHANGED
|
@@ -1,16 +1,11 @@
|
|
|
1
1
|
import asyncio
|
|
2
|
-
import json
|
|
3
2
|
import logging
|
|
4
|
-
from typing import Dict, Optional, Tuple
|
|
5
3
|
|
|
6
|
-
from
|
|
7
|
-
from cdp import CdpClient as OriginCdpClient # noqa: E402
|
|
4
|
+
from cdp import CdpClient, EvmServerAccount # noqa: E402
|
|
8
5
|
from coinbase_agentkit import ( # noqa: E402
|
|
9
6
|
CdpEvmWalletProvider,
|
|
10
7
|
CdpEvmWalletProviderConfig,
|
|
11
8
|
)
|
|
12
|
-
from eth_keys.datatypes import PrivateKey
|
|
13
|
-
from eth_utils import to_checksum_address
|
|
14
9
|
|
|
15
10
|
from intentkit.config.config import config
|
|
16
11
|
from intentkit.models.agent import Agent, AgentTable # noqa: E402
|
|
@@ -18,66 +13,31 @@ from intentkit.models.agent_data import AgentData
|
|
|
18
13
|
from intentkit.models.db import get_session
|
|
19
14
|
from intentkit.utils.error import IntentKitAPIError # noqa: E402
|
|
20
15
|
|
|
21
|
-
_wallet_providers:
|
|
22
|
-
|
|
16
|
+
_wallet_providers: dict[str, tuple[str, str, CdpEvmWalletProvider]] = {}
|
|
17
|
+
_cdp_client: CdpClient | None = None
|
|
23
18
|
|
|
24
19
|
logger = logging.getLogger(__name__)
|
|
25
20
|
|
|
26
21
|
|
|
27
|
-
def
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
Args:
|
|
32
|
-
seed_hex: The BIP39 seed in hexadecimal format
|
|
33
|
-
|
|
34
|
-
Returns:
|
|
35
|
-
Dict containing private_key, public_key, and address
|
|
36
|
-
"""
|
|
37
|
-
# Convert the hex seed to bytes
|
|
38
|
-
seed_bytes = bytes.fromhex(seed_hex)
|
|
39
|
-
|
|
40
|
-
# Derive the master key from the seed
|
|
41
|
-
bip32 = BIP32.from_seed(seed_bytes)
|
|
42
|
-
|
|
43
|
-
# Derive the Ethereum address using the standard derivation path
|
|
44
|
-
private_key_bytes = bip32.get_privkey_from_path("m/44'/60'/0'/0/0")
|
|
45
|
-
|
|
46
|
-
# Create a private key object
|
|
47
|
-
private_key = PrivateKey(private_key_bytes)
|
|
48
|
-
|
|
49
|
-
# Get the public key
|
|
50
|
-
public_key = private_key.public_key
|
|
51
|
-
|
|
52
|
-
# Get the Ethereum address
|
|
53
|
-
address = public_key.to_address()
|
|
54
|
-
|
|
55
|
-
return {
|
|
56
|
-
"private_key": private_key.to_hex(),
|
|
57
|
-
"public_key": public_key.to_hex(),
|
|
58
|
-
"address": to_checksum_address(address),
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
def get_origin_cdp_client() -> OriginCdpClient:
|
|
63
|
-
global _origin_cdp_client
|
|
64
|
-
if _origin_cdp_client:
|
|
65
|
-
return _origin_cdp_client
|
|
22
|
+
def get_cdp_client() -> CdpClient:
|
|
23
|
+
global _cdp_client
|
|
24
|
+
if _cdp_client:
|
|
25
|
+
return _cdp_client
|
|
66
26
|
|
|
67
27
|
# Get credentials from global configuration
|
|
68
28
|
api_key_id = config.cdp_api_key_id
|
|
69
29
|
api_key_secret = config.cdp_api_key_secret
|
|
70
30
|
wallet_secret = config.cdp_wallet_secret
|
|
71
31
|
|
|
72
|
-
|
|
32
|
+
_cdp_client = CdpClient(
|
|
73
33
|
api_key_id=api_key_id,
|
|
74
34
|
api_key_secret=api_key_secret,
|
|
75
35
|
wallet_secret=wallet_secret,
|
|
76
36
|
)
|
|
77
|
-
return
|
|
37
|
+
return _cdp_client
|
|
78
38
|
|
|
79
39
|
|
|
80
|
-
|
|
40
|
+
def _assert_cdp_wallet_provider(agent: Agent) -> None:
|
|
81
41
|
if agent.wallet_provider != "cdp":
|
|
82
42
|
raise IntentKitAPIError(
|
|
83
43
|
400,
|
|
@@ -85,6 +45,46 @@ async def get_wallet_provider(agent: Agent) -> CdpEvmWalletProvider:
|
|
|
85
45
|
"Your agent wallet provider is not cdp but you selected a skill that requires a cdp wallet.",
|
|
86
46
|
)
|
|
87
47
|
|
|
48
|
+
|
|
49
|
+
async def _ensure_evm_account(
|
|
50
|
+
agent: Agent, agent_data: AgentData | None = None
|
|
51
|
+
) -> tuple[EvmServerAccount, AgentData]:
|
|
52
|
+
cdp_client = get_cdp_client()
|
|
53
|
+
agent_data = agent_data or await AgentData.get(agent.id)
|
|
54
|
+
address = agent_data.evm_wallet_address
|
|
55
|
+
account: EvmServerAccount | None = None
|
|
56
|
+
|
|
57
|
+
if not address:
|
|
58
|
+
logger.info("Creating new wallet...")
|
|
59
|
+
account = await cdp_client.evm.create_account(
|
|
60
|
+
name=agent.id,
|
|
61
|
+
)
|
|
62
|
+
address = account.address
|
|
63
|
+
logger.info("Created new wallet: %s", address)
|
|
64
|
+
|
|
65
|
+
agent_data.evm_wallet_address = address
|
|
66
|
+
await agent_data.save()
|
|
67
|
+
if not agent.slug:
|
|
68
|
+
async with get_session() as db:
|
|
69
|
+
db_agent = await db.get(AgentTable, agent.id)
|
|
70
|
+
if db_agent and not db_agent.slug:
|
|
71
|
+
db_agent.slug = agent_data.evm_wallet_address
|
|
72
|
+
await db.commit()
|
|
73
|
+
|
|
74
|
+
if account is None:
|
|
75
|
+
account = await cdp_client.evm.get_account(address=address)
|
|
76
|
+
|
|
77
|
+
return account, agent_data
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
async def get_evm_account(agent: Agent) -> EvmServerAccount:
|
|
81
|
+
_assert_cdp_wallet_provider(agent)
|
|
82
|
+
account, _ = await _ensure_evm_account(agent)
|
|
83
|
+
return account
|
|
84
|
+
|
|
85
|
+
|
|
86
|
+
async def get_wallet_provider(agent: Agent) -> CdpEvmWalletProvider:
|
|
87
|
+
_assert_cdp_wallet_provider(agent)
|
|
88
88
|
if not agent.network_id:
|
|
89
89
|
raise IntentKitAPIError(
|
|
90
90
|
400,
|
|
@@ -104,6 +104,9 @@ async def get_wallet_provider(agent: Agent) -> CdpEvmWalletProvider:
|
|
|
104
104
|
if cached_address == address:
|
|
105
105
|
return provider
|
|
106
106
|
|
|
107
|
+
account, agent_data = await _ensure_evm_account(agent, agent_data)
|
|
108
|
+
address = account.address
|
|
109
|
+
|
|
107
110
|
# Get credentials from global config
|
|
108
111
|
api_key_id = config.cdp_api_key_id
|
|
109
112
|
api_key_secret = config.cdp_api_key_secret
|
|
@@ -111,48 +114,6 @@ async def get_wallet_provider(agent: Agent) -> CdpEvmWalletProvider:
|
|
|
111
114
|
|
|
112
115
|
network_id = agent.network_id
|
|
113
116
|
|
|
114
|
-
# new agent or address not migrated yet
|
|
115
|
-
if not address:
|
|
116
|
-
cdp_client = get_origin_cdp_client()
|
|
117
|
-
# try migrating from v1 cdp_wallet_data
|
|
118
|
-
if agent_data.cdp_wallet_data:
|
|
119
|
-
wallet_data = json.loads(agent_data.cdp_wallet_data)
|
|
120
|
-
if not isinstance(wallet_data, dict):
|
|
121
|
-
raise ValueError("Invalid wallet data format")
|
|
122
|
-
if wallet_data.get("default_address_id") and wallet_data.get("seed"):
|
|
123
|
-
# verify seed and convert to pk
|
|
124
|
-
keys = bip39_seed_to_eth_keys(wallet_data["seed"])
|
|
125
|
-
if keys["address"] != wallet_data["default_address_id"]:
|
|
126
|
-
raise ValueError(
|
|
127
|
-
"Bad wallet data, seed does not match default_address_id"
|
|
128
|
-
)
|
|
129
|
-
# try to import wallet to v2
|
|
130
|
-
logger.info("Migrating wallet data to v2...")
|
|
131
|
-
await cdp_client.evm.import_account(
|
|
132
|
-
name=agent.id,
|
|
133
|
-
private_key=keys["private_key"],
|
|
134
|
-
)
|
|
135
|
-
address = keys["address"]
|
|
136
|
-
logger.info("Migrated wallet data to v2 successfully: %s", address)
|
|
137
|
-
# still not address
|
|
138
|
-
if not address:
|
|
139
|
-
logger.info("Creating new wallet...")
|
|
140
|
-
new_account = await cdp_client.evm.create_account(
|
|
141
|
-
name=agent.id,
|
|
142
|
-
)
|
|
143
|
-
address = new_account.address
|
|
144
|
-
logger.info("Created new wallet: %s", address)
|
|
145
|
-
|
|
146
|
-
agent_data.evm_wallet_address = address
|
|
147
|
-
await agent_data.save()
|
|
148
|
-
# Update agent slug with evm_wallet_address if slug is null or empty
|
|
149
|
-
if not agent.slug:
|
|
150
|
-
async with get_session() as db:
|
|
151
|
-
db_agent = await db.get(AgentTable, agent.id)
|
|
152
|
-
if db_agent:
|
|
153
|
-
db_agent.slug = agent_data.evm_wallet_address
|
|
154
|
-
await db.commit()
|
|
155
|
-
|
|
156
117
|
wallet_provider_config = CdpEvmWalletProviderConfig(
|
|
157
118
|
api_key_id=api_key_id,
|
|
158
119
|
api_key_secret=api_key_secret,
|