intentkit 0.6.13.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.

Files changed (385) hide show
  1. intentkit/__init__.py +1 -1
  2. intentkit/abstracts/agent.py +4 -5
  3. intentkit/abstracts/engine.py +5 -5
  4. intentkit/abstracts/graph.py +14 -7
  5. intentkit/abstracts/skill.py +6 -144
  6. intentkit/abstracts/twitter.py +4 -5
  7. intentkit/clients/__init__.py +5 -2
  8. intentkit/clients/cdp.py +101 -141
  9. intentkit/clients/twitter.py +83 -62
  10. intentkit/clients/web3.py +29 -0
  11. intentkit/config/config.py +8 -5
  12. intentkit/core/agent.py +472 -195
  13. intentkit/core/asset.py +253 -0
  14. intentkit/core/chat.py +51 -0
  15. intentkit/core/client.py +1 -1
  16. intentkit/core/credit.py +460 -130
  17. intentkit/core/engine.py +262 -233
  18. intentkit/core/node.py +15 -16
  19. intentkit/core/prompt.py +62 -28
  20. intentkit/core/scheduler.py +92 -0
  21. intentkit/core/statistics.py +168 -0
  22. intentkit/models/agent.py +1096 -949
  23. intentkit/models/agent_data.py +68 -38
  24. intentkit/models/agent_public.json +98 -0
  25. intentkit/models/agent_schema.json +54 -439
  26. intentkit/models/app_setting.py +96 -33
  27. intentkit/models/chat.py +74 -27
  28. intentkit/models/conversation.py +8 -8
  29. intentkit/models/credit.py +362 -74
  30. intentkit/models/db.py +26 -8
  31. intentkit/models/db_mig.py +2 -2
  32. intentkit/models/llm.csv +28 -0
  33. intentkit/models/llm.py +185 -350
  34. intentkit/models/redis.py +6 -4
  35. intentkit/models/skill.py +186 -72
  36. intentkit/models/skills.csv +174 -0
  37. intentkit/models/user.py +82 -24
  38. intentkit/skills/acolyt/__init__.py +2 -9
  39. intentkit/skills/acolyt/ask.py +3 -4
  40. intentkit/skills/acolyt/base.py +4 -9
  41. intentkit/skills/acolyt/schema.json +4 -3
  42. intentkit/skills/aixbt/__init__.py +2 -13
  43. intentkit/skills/aixbt/base.py +1 -7
  44. intentkit/skills/aixbt/projects.py +14 -15
  45. intentkit/skills/aixbt/schema.json +4 -4
  46. intentkit/skills/allora/__init__.py +2 -9
  47. intentkit/skills/allora/base.py +4 -9
  48. intentkit/skills/allora/price.py +3 -4
  49. intentkit/skills/allora/schema.json +3 -2
  50. intentkit/skills/base.py +248 -85
  51. intentkit/skills/basename/__init__.py +51 -0
  52. intentkit/skills/basename/base.py +11 -0
  53. intentkit/skills/basename/basename.svg +11 -0
  54. intentkit/skills/basename/schema.json +58 -0
  55. intentkit/skills/carv/__init__.py +115 -121
  56. intentkit/skills/carv/base.py +184 -185
  57. intentkit/skills/carv/fetch_news.py +3 -3
  58. intentkit/skills/carv/onchain_query.py +4 -4
  59. intentkit/skills/carv/schema.json +134 -137
  60. intentkit/skills/carv/token_info_and_price.py +5 -5
  61. intentkit/skills/casino/README.md +254 -0
  62. intentkit/skills/casino/__init__.py +86 -0
  63. intentkit/skills/casino/base.py +17 -0
  64. intentkit/skills/casino/casino.png +0 -0
  65. intentkit/skills/casino/deck_draw.py +127 -0
  66. intentkit/skills/casino/deck_shuffle.py +118 -0
  67. intentkit/skills/casino/dice_roll.py +100 -0
  68. intentkit/skills/casino/schema.json +77 -0
  69. intentkit/skills/casino/utils.py +107 -0
  70. intentkit/skills/cdp/__init__.py +22 -84
  71. intentkit/skills/cdp/base.py +1 -7
  72. intentkit/skills/cdp/schema.json +11 -314
  73. intentkit/skills/chainlist/__init__.py +2 -7
  74. intentkit/skills/chainlist/base.py +1 -7
  75. intentkit/skills/chainlist/chain_lookup.py +18 -18
  76. intentkit/skills/chainlist/schema.json +3 -5
  77. intentkit/skills/common/__init__.py +2 -9
  78. intentkit/skills/common/base.py +1 -7
  79. intentkit/skills/common/current_time.py +1 -2
  80. intentkit/skills/common/schema.json +2 -2
  81. intentkit/skills/cookiefun/__init__.py +6 -9
  82. intentkit/skills/cookiefun/base.py +2 -7
  83. intentkit/skills/cookiefun/get_account_details.py +7 -7
  84. intentkit/skills/cookiefun/get_account_feed.py +19 -19
  85. intentkit/skills/cookiefun/get_account_smart_followers.py +7 -7
  86. intentkit/skills/cookiefun/get_sectors.py +3 -3
  87. intentkit/skills/cookiefun/schema.json +1 -3
  88. intentkit/skills/cookiefun/search_accounts.py +9 -9
  89. intentkit/skills/cryptocompare/__init__.py +7 -24
  90. intentkit/skills/cryptocompare/api.py +2 -3
  91. intentkit/skills/cryptocompare/base.py +11 -25
  92. intentkit/skills/cryptocompare/fetch_news.py +4 -5
  93. intentkit/skills/cryptocompare/fetch_price.py +6 -7
  94. intentkit/skills/cryptocompare/fetch_top_exchanges.py +4 -5
  95. intentkit/skills/cryptocompare/fetch_top_market_cap.py +4 -5
  96. intentkit/skills/cryptocompare/fetch_top_volume.py +4 -5
  97. intentkit/skills/cryptocompare/fetch_trading_signals.py +5 -6
  98. intentkit/skills/cryptocompare/schema.json +3 -3
  99. intentkit/skills/cryptopanic/__init__.py +7 -10
  100. intentkit/skills/cryptopanic/base.py +51 -55
  101. intentkit/skills/cryptopanic/fetch_crypto_news.py +4 -8
  102. intentkit/skills/cryptopanic/fetch_crypto_sentiment.py +5 -7
  103. intentkit/skills/cryptopanic/schema.json +105 -103
  104. intentkit/skills/dapplooker/__init__.py +2 -9
  105. intentkit/skills/dapplooker/base.py +4 -9
  106. intentkit/skills/dapplooker/dapplooker_token_data.py +7 -7
  107. intentkit/skills/dapplooker/schema.json +3 -5
  108. intentkit/skills/defillama/__init__.py +24 -74
  109. intentkit/skills/defillama/api.py +6 -9
  110. intentkit/skills/defillama/base.py +11 -21
  111. intentkit/skills/defillama/coins/fetch_batch_historical_prices.py +8 -10
  112. intentkit/skills/defillama/coins/fetch_block.py +6 -8
  113. intentkit/skills/defillama/coins/fetch_current_prices.py +8 -10
  114. intentkit/skills/defillama/coins/fetch_first_price.py +7 -9
  115. intentkit/skills/defillama/coins/fetch_historical_prices.py +9 -11
  116. intentkit/skills/defillama/coins/fetch_price_chart.py +9 -11
  117. intentkit/skills/defillama/coins/fetch_price_percentage.py +7 -9
  118. intentkit/skills/defillama/config/chains.py +1 -3
  119. intentkit/skills/defillama/fees/fetch_fees_overview.py +24 -26
  120. intentkit/skills/defillama/schema.json +5 -1
  121. intentkit/skills/defillama/stablecoins/fetch_stablecoin_chains.py +16 -18
  122. intentkit/skills/defillama/stablecoins/fetch_stablecoin_charts.py +8 -10
  123. intentkit/skills/defillama/stablecoins/fetch_stablecoin_prices.py +5 -7
  124. intentkit/skills/defillama/stablecoins/fetch_stablecoins.py +7 -9
  125. intentkit/skills/defillama/tests/api_integration.test.py +1 -1
  126. intentkit/skills/defillama/tvl/fetch_chain_historical_tvl.py +4 -6
  127. intentkit/skills/defillama/tvl/fetch_chains.py +9 -11
  128. intentkit/skills/defillama/tvl/fetch_historical_tvl.py +4 -6
  129. intentkit/skills/defillama/tvl/fetch_protocol.py +32 -38
  130. intentkit/skills/defillama/tvl/fetch_protocol_current_tvl.py +3 -5
  131. intentkit/skills/defillama/tvl/fetch_protocols.py +37 -45
  132. intentkit/skills/defillama/volumes/fetch_dex_overview.py +42 -48
  133. intentkit/skills/defillama/volumes/fetch_dex_summary.py +35 -37
  134. intentkit/skills/defillama/volumes/fetch_options_overview.py +24 -28
  135. intentkit/skills/defillama/yields/fetch_pool_chart.py +10 -12
  136. intentkit/skills/defillama/yields/fetch_pools.py +26 -30
  137. intentkit/skills/dexscreener/README.md +154 -0
  138. intentkit/skills/dexscreener/__init__.py +97 -93
  139. intentkit/skills/dexscreener/base.py +125 -133
  140. intentkit/skills/dexscreener/get_pair_info.py +158 -0
  141. intentkit/skills/dexscreener/get_token_pairs.py +165 -0
  142. intentkit/skills/dexscreener/get_tokens_info.py +212 -0
  143. intentkit/skills/dexscreener/model/search_token_response.py +80 -82
  144. intentkit/skills/dexscreener/schema.json +91 -48
  145. intentkit/skills/dexscreener/search_token.py +182 -321
  146. intentkit/skills/dexscreener/utils.py +420 -0
  147. intentkit/skills/dune_analytics/__init__.py +7 -9
  148. intentkit/skills/dune_analytics/base.py +48 -52
  149. intentkit/skills/dune_analytics/fetch_kol_buys.py +5 -7
  150. intentkit/skills/dune_analytics/fetch_nation_metrics.py +6 -8
  151. intentkit/skills/dune_analytics/schema.json +104 -99
  152. intentkit/skills/elfa/__init__.py +5 -18
  153. intentkit/skills/elfa/base.py +10 -14
  154. intentkit/skills/elfa/mention.py +19 -21
  155. intentkit/skills/elfa/schema.json +3 -2
  156. intentkit/skills/elfa/stats.py +4 -4
  157. intentkit/skills/elfa/tokens.py +12 -12
  158. intentkit/skills/elfa/utils.py +26 -28
  159. intentkit/skills/enso/__init__.py +11 -31
  160. intentkit/skills/enso/base.py +50 -35
  161. intentkit/skills/enso/best_yield.py +16 -24
  162. intentkit/skills/enso/networks.py +6 -11
  163. intentkit/skills/enso/prices.py +11 -13
  164. intentkit/skills/enso/route.py +34 -38
  165. intentkit/skills/enso/schema.json +3 -2
  166. intentkit/skills/enso/tokens.py +29 -38
  167. intentkit/skills/enso/wallet.py +76 -191
  168. intentkit/skills/erc20/__init__.py +50 -0
  169. intentkit/skills/erc20/base.py +11 -0
  170. intentkit/skills/erc20/erc20.svg +5 -0
  171. intentkit/skills/erc20/schema.json +74 -0
  172. intentkit/skills/erc721/__init__.py +53 -0
  173. intentkit/skills/erc721/base.py +11 -0
  174. intentkit/skills/erc721/erc721.svg +5 -0
  175. intentkit/skills/erc721/schema.json +90 -0
  176. intentkit/skills/firecrawl/README.md +11 -5
  177. intentkit/skills/firecrawl/__init__.py +5 -18
  178. intentkit/skills/firecrawl/base.py +4 -11
  179. intentkit/skills/firecrawl/clear.py +4 -8
  180. intentkit/skills/firecrawl/crawl.py +19 -19
  181. intentkit/skills/firecrawl/query.py +4 -3
  182. intentkit/skills/firecrawl/schema.json +6 -8
  183. intentkit/skills/firecrawl/scrape.py +150 -40
  184. intentkit/skills/firecrawl/utils.py +50 -42
  185. intentkit/skills/github/__init__.py +2 -7
  186. intentkit/skills/github/base.py +1 -7
  187. intentkit/skills/github/github_search.py +1 -2
  188. intentkit/skills/github/schema.json +3 -4
  189. intentkit/skills/heurist/__init__.py +8 -27
  190. intentkit/skills/heurist/base.py +4 -9
  191. intentkit/skills/heurist/image_generation_animagine_xl.py +12 -13
  192. intentkit/skills/heurist/image_generation_arthemy_comics.py +12 -13
  193. intentkit/skills/heurist/image_generation_arthemy_real.py +12 -13
  194. intentkit/skills/heurist/image_generation_braindance.py +12 -13
  195. intentkit/skills/heurist/image_generation_cyber_realistic_xl.py +12 -13
  196. intentkit/skills/heurist/image_generation_flux_1_dev.py +12 -13
  197. intentkit/skills/heurist/image_generation_sdxl.py +12 -13
  198. intentkit/skills/heurist/schema.json +2 -2
  199. intentkit/skills/http/__init__.py +4 -15
  200. intentkit/skills/http/base.py +1 -7
  201. intentkit/skills/http/get.py +21 -16
  202. intentkit/skills/http/post.py +23 -18
  203. intentkit/skills/http/put.py +23 -18
  204. intentkit/skills/http/schema.json +4 -5
  205. intentkit/skills/lifi/__init__.py +8 -13
  206. intentkit/skills/lifi/base.py +1 -7
  207. intentkit/skills/lifi/schema.json +17 -8
  208. intentkit/skills/lifi/token_execute.py +36 -30
  209. intentkit/skills/lifi/token_quote.py +8 -10
  210. intentkit/skills/lifi/utils.py +104 -51
  211. intentkit/skills/moralis/__init__.py +6 -10
  212. intentkit/skills/moralis/api.py +6 -7
  213. intentkit/skills/moralis/base.py +5 -10
  214. intentkit/skills/moralis/fetch_chain_portfolio.py +10 -11
  215. intentkit/skills/moralis/fetch_nft_portfolio.py +22 -22
  216. intentkit/skills/moralis/fetch_solana_portfolio.py +11 -12
  217. intentkit/skills/moralis/fetch_wallet_portfolio.py +8 -9
  218. intentkit/skills/moralis/schema.json +7 -2
  219. intentkit/skills/morpho/__init__.py +52 -0
  220. intentkit/skills/morpho/base.py +11 -0
  221. intentkit/skills/morpho/morpho.svg +12 -0
  222. intentkit/skills/morpho/schema.json +73 -0
  223. intentkit/skills/nation/__init__.py +4 -9
  224. intentkit/skills/nation/base.py +5 -10
  225. intentkit/skills/nation/nft_check.py +3 -4
  226. intentkit/skills/nation/schema.json +4 -3
  227. intentkit/skills/onchain.py +23 -0
  228. intentkit/skills/openai/__init__.py +17 -18
  229. intentkit/skills/openai/base.py +10 -14
  230. intentkit/skills/openai/dalle_image_generation.py +3 -8
  231. intentkit/skills/openai/gpt_avatar_generator.py +102 -0
  232. intentkit/skills/openai/gpt_image_generation.py +4 -8
  233. intentkit/skills/openai/gpt_image_mini_generator.py +91 -0
  234. intentkit/skills/openai/gpt_image_to_image.py +4 -8
  235. intentkit/skills/openai/image_to_text.py +3 -7
  236. intentkit/skills/openai/schema.json +34 -3
  237. intentkit/skills/portfolio/__init__.py +11 -35
  238. intentkit/skills/portfolio/base.py +33 -19
  239. intentkit/skills/portfolio/schema.json +3 -5
  240. intentkit/skills/portfolio/token_balances.py +21 -21
  241. intentkit/skills/portfolio/wallet_approvals.py +17 -18
  242. intentkit/skills/portfolio/wallet_defi_positions.py +3 -3
  243. intentkit/skills/portfolio/wallet_history.py +31 -31
  244. intentkit/skills/portfolio/wallet_net_worth.py +13 -13
  245. intentkit/skills/portfolio/wallet_nfts.py +19 -19
  246. intentkit/skills/portfolio/wallet_profitability.py +18 -18
  247. intentkit/skills/portfolio/wallet_profitability_summary.py +5 -5
  248. intentkit/skills/portfolio/wallet_stats.py +3 -3
  249. intentkit/skills/portfolio/wallet_swaps.py +19 -19
  250. intentkit/skills/pyth/__init__.py +50 -0
  251. intentkit/skills/pyth/base.py +11 -0
  252. intentkit/skills/pyth/pyth.svg +6 -0
  253. intentkit/skills/pyth/schema.json +75 -0
  254. intentkit/skills/skills.toml +40 -0
  255. intentkit/skills/slack/__init__.py +5 -17
  256. intentkit/skills/slack/base.py +3 -9
  257. intentkit/skills/slack/get_channel.py +8 -8
  258. intentkit/skills/slack/get_message.py +9 -9
  259. intentkit/skills/slack/schedule_message.py +5 -5
  260. intentkit/skills/slack/schema.json +2 -2
  261. intentkit/skills/slack/send_message.py +3 -5
  262. intentkit/skills/supabase/__init__.py +7 -23
  263. intentkit/skills/supabase/base.py +9 -13
  264. intentkit/skills/supabase/delete_data.py +5 -6
  265. intentkit/skills/supabase/fetch_data.py +13 -14
  266. intentkit/skills/supabase/insert_data.py +5 -6
  267. intentkit/skills/supabase/invoke_function.py +7 -8
  268. intentkit/skills/supabase/schema.json +2 -3
  269. intentkit/skills/supabase/update_data.py +7 -8
  270. intentkit/skills/supabase/upsert_data.py +5 -6
  271. intentkit/skills/superfluid/__init__.py +53 -0
  272. intentkit/skills/superfluid/base.py +11 -0
  273. intentkit/skills/superfluid/schema.json +89 -0
  274. intentkit/skills/superfluid/superfluid.svg +6 -0
  275. intentkit/skills/system/__init__.py +7 -24
  276. intentkit/skills/system/add_autonomous_task.py +10 -12
  277. intentkit/skills/system/delete_autonomous_task.py +2 -2
  278. intentkit/skills/system/edit_autonomous_task.py +14 -18
  279. intentkit/skills/system/list_autonomous_tasks.py +3 -5
  280. intentkit/skills/system/read_agent_api_key.py +6 -4
  281. intentkit/skills/system/regenerate_agent_api_key.py +6 -4
  282. intentkit/skills/system/schema.json +6 -8
  283. intentkit/skills/tavily/__init__.py +3 -12
  284. intentkit/skills/tavily/base.py +4 -9
  285. intentkit/skills/tavily/schema.json +3 -5
  286. intentkit/skills/tavily/tavily_extract.py +2 -4
  287. intentkit/skills/tavily/tavily_search.py +4 -6
  288. intentkit/skills/token/__init__.py +5 -10
  289. intentkit/skills/token/base.py +7 -11
  290. intentkit/skills/token/erc20_transfers.py +19 -19
  291. intentkit/skills/token/schema.json +3 -6
  292. intentkit/skills/token/token_analytics.py +3 -3
  293. intentkit/skills/token/token_price.py +13 -13
  294. intentkit/skills/token/token_search.py +9 -9
  295. intentkit/skills/twitter/__init__.py +11 -35
  296. intentkit/skills/twitter/base.py +23 -35
  297. intentkit/skills/twitter/follow_user.py +3 -7
  298. intentkit/skills/twitter/get_mentions.py +6 -13
  299. intentkit/skills/twitter/get_timeline.py +5 -13
  300. intentkit/skills/twitter/get_user_by_username.py +3 -7
  301. intentkit/skills/twitter/get_user_tweets.py +6 -14
  302. intentkit/skills/twitter/like_tweet.py +3 -7
  303. intentkit/skills/twitter/post_tweet.py +23 -12
  304. intentkit/skills/twitter/reply_tweet.py +21 -12
  305. intentkit/skills/twitter/retweet.py +3 -7
  306. intentkit/skills/twitter/schema.json +1 -0
  307. intentkit/skills/twitter/search_tweets.py +5 -13
  308. intentkit/skills/unrealspeech/__init__.py +2 -7
  309. intentkit/skills/unrealspeech/base.py +2 -8
  310. intentkit/skills/unrealspeech/schema.json +2 -5
  311. intentkit/skills/unrealspeech/text_to_speech.py +8 -8
  312. intentkit/skills/venice_audio/__init__.py +98 -106
  313. intentkit/skills/venice_audio/base.py +117 -121
  314. intentkit/skills/venice_audio/input.py +41 -41
  315. intentkit/skills/venice_audio/schema.json +151 -152
  316. intentkit/skills/venice_audio/venice_audio.py +38 -21
  317. intentkit/skills/venice_image/__init__.py +147 -154
  318. intentkit/skills/venice_image/api.py +138 -138
  319. intentkit/skills/venice_image/base.py +185 -192
  320. intentkit/skills/venice_image/config.py +33 -35
  321. intentkit/skills/venice_image/image_enhance/image_enhance.py +2 -3
  322. intentkit/skills/venice_image/image_enhance/image_enhance_base.py +21 -23
  323. intentkit/skills/venice_image/image_enhance/image_enhance_input.py +38 -40
  324. intentkit/skills/venice_image/image_generation/image_generation_base.py +9 -9
  325. intentkit/skills/venice_image/image_generation/image_generation_fluently_xl.py +26 -26
  326. intentkit/skills/venice_image/image_generation/image_generation_flux_dev.py +27 -27
  327. intentkit/skills/venice_image/image_generation/image_generation_flux_dev_uncensored.py +26 -26
  328. intentkit/skills/venice_image/image_generation/image_generation_input.py +158 -158
  329. intentkit/skills/venice_image/image_generation/image_generation_lustify_sdxl.py +26 -26
  330. intentkit/skills/venice_image/image_generation/image_generation_pony_realism.py +26 -26
  331. intentkit/skills/venice_image/image_generation/image_generation_stable_diffusion_3_5.py +28 -28
  332. intentkit/skills/venice_image/image_generation/image_generation_venice_sd35.py +28 -28
  333. intentkit/skills/venice_image/image_upscale/image_upscale.py +3 -3
  334. intentkit/skills/venice_image/image_upscale/image_upscale_base.py +21 -23
  335. intentkit/skills/venice_image/image_upscale/image_upscale_input.py +22 -22
  336. intentkit/skills/venice_image/image_vision/image_vision.py +2 -2
  337. intentkit/skills/venice_image/image_vision/image_vision_base.py +17 -17
  338. intentkit/skills/venice_image/image_vision/image_vision_input.py +9 -9
  339. intentkit/skills/venice_image/schema.json +267 -267
  340. intentkit/skills/venice_image/utils.py +77 -78
  341. intentkit/skills/web_scraper/__init__.py +5 -18
  342. intentkit/skills/web_scraper/base.py +21 -7
  343. intentkit/skills/web_scraper/document_indexer.py +7 -6
  344. intentkit/skills/web_scraper/schema.json +2 -6
  345. intentkit/skills/web_scraper/scrape_and_index.py +15 -15
  346. intentkit/skills/web_scraper/utils.py +62 -63
  347. intentkit/skills/web_scraper/website_indexer.py +17 -19
  348. intentkit/skills/weth/__init__.py +49 -0
  349. intentkit/skills/weth/base.py +11 -0
  350. intentkit/skills/weth/schema.json +58 -0
  351. intentkit/skills/weth/weth.svg +6 -0
  352. intentkit/skills/wow/__init__.py +51 -0
  353. intentkit/skills/wow/base.py +11 -0
  354. intentkit/skills/wow/schema.json +89 -0
  355. intentkit/skills/wow/wow.svg +7 -0
  356. intentkit/skills/x402/__init__.py +61 -0
  357. intentkit/skills/x402/ask_agent.py +98 -0
  358. intentkit/skills/x402/base.py +99 -0
  359. intentkit/skills/x402/http_request.py +117 -0
  360. intentkit/skills/x402/schema.json +45 -0
  361. intentkit/skills/x402/x402.webp +0 -0
  362. intentkit/skills/xmtp/__init__.py +4 -15
  363. intentkit/skills/xmtp/base.py +61 -2
  364. intentkit/skills/xmtp/price.py +18 -13
  365. intentkit/skills/xmtp/schema.json +69 -71
  366. intentkit/skills/xmtp/swap.py +22 -25
  367. intentkit/skills/xmtp/transfer.py +71 -32
  368. intentkit/utils/chain.py +3 -3
  369. intentkit/utils/error.py +14 -1
  370. intentkit/utils/logging.py +2 -4
  371. intentkit/utils/s3.py +59 -7
  372. intentkit/utils/schema.py +100 -0
  373. intentkit/utils/slack_alert.py +7 -8
  374. {intentkit-0.6.13.dev2.dist-info → intentkit-0.8.17.dist-info}/METADATA +14 -16
  375. intentkit-0.8.17.dist-info/RECORD +466 -0
  376. intentkit/abstracts/exception.py +0 -9
  377. intentkit/core/skill.py +0 -200
  378. intentkit/models/generator.py +0 -347
  379. intentkit/skills/cdp/get_balance.py +0 -110
  380. intentkit/skills/cdp/swap.py +0 -121
  381. intentkit/skills/moralis/tests/__init__.py +0 -0
  382. intentkit/skills/moralis/tests/test_wallet.py +0 -511
  383. intentkit-0.6.13.dev2.dist-info/RECORD +0 -409
  384. {intentkit-0.6.13.dev2.dist-info → intentkit-0.8.17.dist-info}/WHEEL +0 -0
  385. {intentkit-0.6.13.dev2.dist-info → intentkit-0.8.17.dist-info}/licenses/LICENSE +0 -0
intentkit/__init__.py CHANGED
@@ -3,7 +3,7 @@
3
3
  A powerful platform for building AI agents with blockchain and cryptocurrency capabilities.
4
4
  """
5
5
 
6
- __version__ = "0.6.13-dev2"
6
+ __version__ = "0.8.17"
7
7
  __author__ = "hyacinthus"
8
8
  __email__ = "hyacinthus@gmail.com"
9
9
 
@@ -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) -> Optional[Agent]:
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) -> Optional[AgentData]:
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: Dict) -> None:
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) -> Optional[AgentQuota]:
53
+ async def get_quota(self) -> AgentQuota | None:
55
54
  """Get agent quota information.
56
55
 
57
56
  Returns:
@@ -1,4 +1,4 @@
1
- from typing import Callable, List
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 (List[str]): List of image references/URLs to be processed by the agent.
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: List[str] = [] # optional, defaults to empty list
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], List[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
- List[str]: A list of formatted response lines from the agent execution. Each line
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
  """
@@ -1,6 +1,6 @@
1
- import asyncio
1
+ from collections.abc import Callable
2
2
  from enum import Enum
3
- from typing import Any, Dict, NotRequired, Optional
3
+ from typing import Any, NotRequired
4
4
 
5
5
  from langgraph.prebuilt.chat_agent_executor import AgentState as BaseAgentState
6
6
  from pydantic import BaseModel
@@ -24,18 +24,25 @@ class AgentState(BaseAgentState):
24
24
 
25
25
  context: dict[str, Any]
26
26
  error: NotRequired[AgentError]
27
- __extra__: NotRequired[Dict[str, Any]]
27
+ __extra__: NotRequired[dict[str, Any]]
28
28
 
29
29
 
30
30
  class AgentContext(BaseModel):
31
31
  agent_id: str
32
+ get_agent: Callable[[], Agent]
32
33
  chat_id: str
33
- user_id: Optional[str] = None
34
- app_id: Optional[str] = None
34
+ user_id: str | None = None
35
+ app_id: str | None = None
35
36
  entrypoint: AuthorType
36
37
  is_private: bool
37
- payer: Optional[str] = None
38
+ search: bool = False
39
+ thinking: bool = False
40
+ payer: str | None = None
38
41
 
39
42
  @property
40
43
  def agent(self) -> Agent:
41
- return asyncio.run(Agent.get(self.agent_id))
44
+ return self.get_agent()
45
+
46
+ @property
47
+ def thread_id(self) -> str:
48
+ return f"{self.agent_id}-{self.chat_id}"
@@ -1,7 +1,7 @@
1
1
  from abc import ABC, abstractmethod
2
- from typing import Any, Dict, List, Optional
2
+ from typing import Any
3
3
 
4
- from intentkit.models.agent import Agent, AgentAutonomous
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) -> Optional[Agent]:
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) -> Optional[AgentData]:
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: Dict) -> None:
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) -> Optional[AgentQuota]:
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
@@ -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) -> Optional[AsyncClient]:
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) -> Optional[str]:
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) -> Optional[str]:
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) -> Optional[str]:
47
+ def self_name(self) -> str | None:
49
48
  """Get the Twitter display name.
50
49
 
51
50
  Returns:
@@ -1,14 +1,17 @@
1
- from intentkit.clients.cdp import CdpClient, get_cdp_client
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,
5
5
  get_twitter_client,
6
6
  )
7
+ from intentkit.clients.web3 import get_web3_client
7
8
 
8
9
  __all__ = [
9
10
  "TwitterClient",
10
11
  "TwitterClientConfig",
11
12
  "get_twitter_client",
12
- "CdpClient",
13
+ "get_evm_account",
13
14
  "get_cdp_client",
15
+ "get_wallet_provider",
16
+ "get_web3_client",
14
17
  ]
intentkit/clients/cdp.py CHANGED
@@ -1,168 +1,128 @@
1
- import json
1
+ import asyncio
2
2
  import logging
3
- from typing import Dict, Optional
4
-
5
- from bip32 import BIP32
6
- from cdp import CdpClient as OriginCdpClient
7
- from cdp import EvmServerAccount
8
- from coinbase_agentkit import (
9
- CdpEvmServerWalletProvider,
10
- CdpEvmServerWalletProviderConfig,
3
+
4
+ from cdp import CdpClient, EvmServerAccount # noqa: E402
5
+ from coinbase_agentkit import ( # noqa: E402
6
+ CdpEvmWalletProvider,
7
+ CdpEvmWalletProviderConfig,
11
8
  )
12
- from eth_keys.datatypes import PrivateKey
13
- from eth_utils import to_checksum_address
14
9
 
15
- from intentkit.abstracts.skill import SkillStoreABC
16
- from intentkit.models.agent import Agent
10
+ from intentkit.config.config import config
11
+ from intentkit.models.agent import Agent, AgentTable # noqa: E402
17
12
  from intentkit.models.agent_data import AgentData
13
+ from intentkit.models.db import get_session
14
+ from intentkit.utils.error import IntentKitAPIError # noqa: E402
18
15
 
19
- _clients: Dict[str, "CdpClient"] = {}
20
- _origin_cdp_client: Optional[OriginCdpClient] = None
16
+ _wallet_providers: dict[str, tuple[str, str, CdpEvmWalletProvider]] = {}
17
+ _cdp_client: CdpClient | None = None
21
18
 
22
19
  logger = logging.getLogger(__name__)
23
20
 
24
21
 
25
- def bip39_seed_to_eth_keys(seed_hex: str) -> Dict[str, str]:
26
- """
27
- Converts a BIP39 seed to an Ethereum private key, public key, and address.
22
+ def get_cdp_client() -> CdpClient:
23
+ global _cdp_client
24
+ if _cdp_client:
25
+ return _cdp_client
28
26
 
29
- Args:
30
- seed_hex: The BIP39 seed in hexadecimal format
27
+ # Get credentials from global configuration
28
+ api_key_id = config.cdp_api_key_id
29
+ api_key_secret = config.cdp_api_key_secret
30
+ wallet_secret = config.cdp_wallet_secret
31
31
 
32
- Returns:
33
- Dict containing private_key, public_key, and address
34
- """
35
- # Convert the hex seed to bytes
36
- seed_bytes = bytes.fromhex(seed_hex)
32
+ _cdp_client = CdpClient(
33
+ api_key_id=api_key_id,
34
+ api_key_secret=api_key_secret,
35
+ wallet_secret=wallet_secret,
36
+ )
37
+ return _cdp_client
37
38
 
38
- # Derive the master key from the seed
39
- bip32 = BIP32.from_seed(seed_bytes)
40
39
 
41
- # Derive the Ethereum address using the standard derivation path
42
- private_key_bytes = bip32.get_privkey_from_path("m/44'/60'/0'/0/0")
40
+ def _assert_cdp_wallet_provider(agent: Agent) -> None:
41
+ if agent.wallet_provider != "cdp":
42
+ raise IntentKitAPIError(
43
+ 400,
44
+ "BadWalletProvider",
45
+ "Your agent wallet provider is not cdp but you selected a skill that requires a cdp wallet.",
46
+ )
43
47
 
44
- # Create a private key object
45
- private_key = PrivateKey(private_key_bytes)
46
48
 
47
- # Get the public key
48
- public_key = private_key.public_key
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
49
56
 
50
- # Get the Ethereum address
51
- address = public_key.to_address()
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)
52
64
 
53
- return {
54
- "private_key": private_key.to_hex(),
55
- "public_key": public_key.to_hex(),
56
- "address": to_checksum_address(address),
57
- }
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()
58
73
 
74
+ if account is None:
75
+ account = await cdp_client.evm.get_account(address=address)
59
76
 
60
- def get_origin_cdp_client(skill_store: SkillStoreABC) -> OriginCdpClient:
61
- global _origin_cdp_client
62
- if _origin_cdp_client:
63
- return _origin_cdp_client
77
+ return account, agent_data
64
78
 
65
- # Get credentials from skill store system config
66
- api_key_id = skill_store.get_system_config("cdp_api_key_id")
67
- api_key_secret = skill_store.get_system_config("cdp_api_key_secret")
68
- wallet_secret = skill_store.get_system_config("cdp_wallet_secret")
69
79
 
70
- _origin_cdp_client = OriginCdpClient(
71
- api_key_id=api_key_id,
72
- api_key_secret=api_key_secret,
73
- wallet_secret=wallet_secret,
74
- )
75
- return _origin_cdp_client
76
-
77
-
78
- class CdpClient:
79
- def __init__(self, agent_id: str, skill_store: SkillStoreABC) -> None:
80
- self._agent_id = agent_id
81
- self._skill_store = skill_store
82
- self._wallet_provider: Optional[CdpEvmServerWalletProvider] = None
83
- self._wallet_provider_config: Optional[CdpEvmServerWalletProviderConfig] = None
84
-
85
- async def get_wallet_provider(self) -> CdpEvmServerWalletProvider:
86
- if self._wallet_provider:
87
- return self._wallet_provider
88
- agent: Agent = await self._skill_store.get_agent_config(self._agent_id)
89
- agent_data: AgentData = await self._skill_store.get_agent_data(self._agent_id)
90
- network_id = agent.network_id or agent.cdp_network_id
91
-
92
- # Get credentials from skill store system config
93
- api_key_id = self._skill_store.get_system_config("cdp_api_key_id")
94
- api_key_secret = self._skill_store.get_system_config("cdp_api_key_secret")
95
- wallet_secret = self._skill_store.get_system_config("cdp_wallet_secret")
96
-
97
- # already have address
98
- address = agent_data.evm_wallet_address
99
-
100
- # new agent or address not migrated yet
101
- if not address:
102
- # create cdp client for later use
103
- cdp_client = get_origin_cdp_client(self._skill_store)
104
- # try migrating from v1 cdp_wallet_data
105
- if agent_data.cdp_wallet_data:
106
- wallet_data = json.loads(agent_data.cdp_wallet_data)
107
- if not isinstance(wallet_data, dict):
108
- raise ValueError("Invalid wallet data format")
109
- if wallet_data.get("default_address_id") and wallet_data.get("seed"):
110
- # verify seed and convert to pk
111
- keys = bip39_seed_to_eth_keys(wallet_data["seed"])
112
- if keys["address"] != wallet_data["default_address_id"]:
113
- raise ValueError(
114
- "Bad wallet data, seed does not match default_address_id"
115
- )
116
- # try to import wallet to v2
117
- logger.info("Migrating wallet data to v2...")
118
- await cdp_client.evm.import_account(
119
- name=agent.id,
120
- private_key=keys["private_key"],
121
- )
122
- address = keys["address"]
123
- logger.info("Migrated wallet data to v2 successfully: %s", address)
124
- # still not address
125
- if not address:
126
- logger.info("Creating new wallet...")
127
- new_account = await cdp_client.evm.create_account(
128
- name=agent.id,
129
- )
130
- address = new_account.address
131
- logger.info("Created new wallet: %s", address)
132
-
133
- # do not close cached global client
134
- # now it should be created or migrated, store it
135
- agent_data.evm_wallet_address = address
136
- await agent_data.save()
137
-
138
- # it must have v2 account now, load agentkit wallet provider
139
- self._wallet_provider_config = CdpEvmServerWalletProviderConfig(
140
- api_key_id=api_key_id,
141
- api_key_secret=api_key_secret,
142
- network_id=network_id,
143
- address=address,
144
- wallet_secret=wallet_secret,
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
+ if not agent.network_id:
89
+ raise IntentKitAPIError(
90
+ 400,
91
+ "BadNetworkID",
92
+ "Your agent network ID is not set. Please set it in the agent config.",
145
93
  )
146
- self._wallet_provider = CdpEvmServerWalletProvider(self._wallet_provider_config)
147
- return self._wallet_provider
148
94
 
149
- async def get_account(self) -> EvmServerAccount:
150
- """Get the account object from the wallet provider.
95
+ agent_data = await AgentData.get(agent.id)
96
+ address = agent_data.evm_wallet_address
97
+
98
+ cache_entry = _wallet_providers.get(agent.id)
99
+ if cache_entry:
100
+ cached_network_id, cached_address, provider = cache_entry
101
+ if cached_network_id == agent.network_id:
102
+ if not address:
103
+ address = cached_address or provider.get_address()
104
+ if cached_address == address:
105
+ return provider
151
106
 
152
- Returns:
153
- EvmServerAccount: The account object that can be used for balance checks, transfers, etc.
154
- """
155
- wallet_provider = await self.get_wallet_provider()
156
- # Access the internal account object
157
- return wallet_provider._account
107
+ account, agent_data = await _ensure_evm_account(agent, agent_data)
108
+ address = account.address
158
109
 
159
- async def get_provider_config(self) -> CdpEvmServerWalletProviderConfig:
160
- if not self._wallet_provider_config:
161
- await self.get_wallet_provider()
162
- return self._wallet_provider_config
110
+ # Get credentials from global config
111
+ api_key_id = config.cdp_api_key_id
112
+ api_key_secret = config.cdp_api_key_secret
113
+ wallet_secret = config.cdp_wallet_secret
163
114
 
115
+ network_id = agent.network_id
164
116
 
165
- async def get_cdp_client(agent_id: str, skill_store: SkillStoreABC) -> "CdpClient":
166
- if agent_id not in _clients:
167
- _clients[agent_id] = CdpClient(agent_id, skill_store)
168
- return _clients[agent_id]
117
+ wallet_provider_config = CdpEvmWalletProviderConfig(
118
+ api_key_id=api_key_id,
119
+ api_key_secret=api_key_secret,
120
+ network_id=network_id,
121
+ address=address,
122
+ wallet_secret=wallet_secret,
123
+ )
124
+ wallet_provider = await asyncio.to_thread(
125
+ CdpEvmWalletProvider, wallet_provider_config
126
+ )
127
+ _wallet_providers[agent.id] = (network_id, address, wallet_provider)
128
+ return wallet_provider