intentkit 0.5.1__py3-none-any.whl → 0.6.0__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 (400) hide show
  1. intentkit/__init__.py +17 -0
  2. {abstracts → intentkit/abstracts}/skill.py +12 -0
  3. intentkit/clients/cdp.py +151 -0
  4. {config → intentkit/config}/config.py +12 -4
  5. {core → intentkit/core}/engine.py +39 -31
  6. {core → intentkit/core}/node.py +8 -4
  7. {core → intentkit/core}/prompt.py +5 -6
  8. {core → intentkit/core}/skill.py +11 -0
  9. {models → intentkit/models}/agent.py +2 -9
  10. {models → intentkit/models}/agent_data.py +18 -0
  11. {models → intentkit/models}/agent_schema.json +12 -0
  12. {models → intentkit/models}/chat.py +50 -0
  13. {models → intentkit/models}/skill.py +19 -0
  14. {skills → intentkit/skills}/base.py +37 -17
  15. {skills → intentkit/skills}/cdp/__init__.py +6 -14
  16. intentkit/skills/cdp/get_balance.py +133 -0
  17. {skills → intentkit/skills}/cdp/schema.json +0 -64
  18. {skills → intentkit/skills}/cryptocompare/fetch_news.py +2 -2
  19. {skills → intentkit/skills}/cryptocompare/fetch_price.py +2 -2
  20. {skills → intentkit/skills}/cryptocompare/fetch_top_exchanges.py +2 -2
  21. {skills → intentkit/skills}/cryptocompare/fetch_top_market_cap.py +2 -2
  22. {skills → intentkit/skills}/cryptocompare/fetch_top_volume.py +2 -2
  23. {skills → intentkit/skills}/cryptocompare/fetch_trading_signals.py +2 -2
  24. {skills → intentkit/skills}/defillama/base.py +3 -3
  25. {skills → intentkit/skills}/enso/base.py +27 -4
  26. {skills → intentkit/skills}/enso/networks.py +1 -1
  27. {skills → intentkit/skills}/enso/route.py +24 -23
  28. {skills → intentkit/skills}/enso/tokens.py +1 -1
  29. {skills → intentkit/skills}/enso/wallet.py +27 -23
  30. intentkit/skills/firecrawl/README.md +211 -0
  31. intentkit/skills/firecrawl/__init__.py +107 -0
  32. intentkit/skills/firecrawl/base.py +28 -0
  33. intentkit/skills/firecrawl/clear.py +87 -0
  34. intentkit/skills/firecrawl/crawl.py +399 -0
  35. intentkit/skills/firecrawl/firecrawl.png +0 -0
  36. intentkit/skills/firecrawl/query.py +123 -0
  37. intentkit/skills/firecrawl/schema.json +153 -0
  38. intentkit/skills/firecrawl/scrape.py +318 -0
  39. intentkit/skills/firecrawl/utils.py +306 -0
  40. {skills → intentkit/skills}/heurist/image_generation_animagine_xl.py +1 -1
  41. {skills → intentkit/skills}/heurist/image_generation_arthemy_comics.py +1 -1
  42. {skills → intentkit/skills}/heurist/image_generation_arthemy_real.py +1 -1
  43. {skills → intentkit/skills}/heurist/image_generation_braindance.py +1 -1
  44. {skills → intentkit/skills}/heurist/image_generation_cyber_realistic_xl.py +1 -1
  45. {skills → intentkit/skills}/heurist/image_generation_flux_1_dev.py +1 -1
  46. {skills → intentkit/skills}/heurist/image_generation_sdxl.py +1 -1
  47. intentkit/skills/http/README.md +78 -0
  48. intentkit/skills/http/__init__.py +100 -0
  49. intentkit/skills/http/base.py +21 -0
  50. intentkit/skills/http/get.py +96 -0
  51. intentkit/skills/http/http.svg +15 -0
  52. intentkit/skills/http/post.py +113 -0
  53. intentkit/skills/http/put.py +113 -0
  54. intentkit/skills/http/schema.json +80 -0
  55. {skills → intentkit/skills}/lifi/token_execute.py +1 -1
  56. {skills → intentkit/skills}/openai/dalle_image_generation.py +1 -1
  57. {skills → intentkit/skills}/openai/gpt_image_generation.py +1 -1
  58. {skills → intentkit/skills}/openai/gpt_image_to_image.py +1 -1
  59. intentkit/skills/supabase/__init__.py +116 -0
  60. intentkit/skills/supabase/base.py +72 -0
  61. intentkit/skills/supabase/delete_data.py +102 -0
  62. intentkit/skills/supabase/fetch_data.py +120 -0
  63. intentkit/skills/supabase/insert_data.py +70 -0
  64. intentkit/skills/supabase/invoke_function.py +74 -0
  65. intentkit/skills/supabase/schema.json +170 -0
  66. intentkit/skills/supabase/supabase.svg +15 -0
  67. intentkit/skills/supabase/update_data.py +105 -0
  68. intentkit/skills/supabase/upsert_data.py +77 -0
  69. {skills → intentkit/skills}/system/read_agent_api_key.py +1 -1
  70. {skills → intentkit/skills}/system/regenerate_agent_api_key.py +1 -1
  71. {skills → intentkit/skills}/token/base.py +1 -39
  72. {skills → intentkit/skills}/twitter/follow_user.py +3 -3
  73. {skills → intentkit/skills}/twitter/get_mentions.py +6 -6
  74. {skills → intentkit/skills}/twitter/get_timeline.py +5 -5
  75. {skills → intentkit/skills}/twitter/get_user_by_username.py +3 -3
  76. {skills → intentkit/skills}/twitter/get_user_tweets.py +5 -5
  77. {skills → intentkit/skills}/twitter/like_tweet.py +3 -3
  78. {skills → intentkit/skills}/twitter/post_tweet.py +4 -4
  79. {skills → intentkit/skills}/twitter/reply_tweet.py +4 -4
  80. {skills → intentkit/skills}/twitter/retweet.py +3 -3
  81. {skills → intentkit/skills}/twitter/search_tweets.py +5 -5
  82. {skills → intentkit/skills}/unrealspeech/text_to_speech.py +1 -1
  83. {skills → intentkit/skills}/web_scraper/README.md +35 -4
  84. {skills → intentkit/skills}/web_scraper/__init__.py +16 -0
  85. intentkit/skills/web_scraper/document_indexer.py +143 -0
  86. {skills → intentkit/skills}/web_scraper/schema.json +28 -0
  87. intentkit/skills/web_scraper/scrape_and_index.py +262 -0
  88. intentkit/skills/web_scraper/utils.py +684 -0
  89. intentkit/skills/web_scraper/website_indexer.py +456 -0
  90. {utils → intentkit/utils}/logging.py +1 -1
  91. {intentkit-0.5.1.dist-info → intentkit-0.6.0.dist-info}/METADATA +1 -1
  92. intentkit-0.6.0.dist-info/RECORD +396 -0
  93. clients/cdp.py +0 -53
  94. intentkit-0.5.1.dist-info/RECORD +0 -364
  95. skills/cdp/get_balance.py +0 -81
  96. skills/web_scraper/scrape_and_index.py +0 -327
  97. {abstracts → intentkit/abstracts}/__init__.py +0 -0
  98. {abstracts → intentkit/abstracts}/agent.py +0 -0
  99. {abstracts → intentkit/abstracts}/api.py +0 -0
  100. {abstracts → intentkit/abstracts}/engine.py +0 -0
  101. {abstracts → intentkit/abstracts}/exception.py +0 -0
  102. {abstracts → intentkit/abstracts}/graph.py +0 -0
  103. {abstracts → intentkit/abstracts}/twitter.py +0 -0
  104. {clients → intentkit/clients}/__init__.py +0 -0
  105. {clients → intentkit/clients}/twitter.py +0 -0
  106. {config → intentkit/config}/__init__.py +0 -0
  107. {core → intentkit/core}/__init__.py +0 -0
  108. {core → intentkit/core}/agent.py +0 -0
  109. {core → intentkit/core}/api.py +0 -0
  110. {core → intentkit/core}/client.py +0 -0
  111. {core → intentkit/core}/credit.py +0 -0
  112. {models → intentkit/models}/app_setting.py +0 -0
  113. {models → intentkit/models}/base.py +0 -0
  114. {models → intentkit/models}/conversation.py +0 -0
  115. {models → intentkit/models}/credit.py +0 -0
  116. {models → intentkit/models}/db.py +0 -0
  117. {models → intentkit/models}/db_mig.py +0 -0
  118. {models → intentkit/models}/generator.py +0 -0
  119. {models → intentkit/models}/llm.py +0 -0
  120. {models → intentkit/models}/redis.py +0 -0
  121. {models → intentkit/models}/user.py +0 -0
  122. {skills → intentkit/skills}/__init__.py +0 -0
  123. {skills → intentkit/skills}/acolyt/__init__.py +0 -0
  124. {skills → intentkit/skills}/acolyt/acolyt.jpg +0 -0
  125. {skills → intentkit/skills}/acolyt/ask.py +0 -0
  126. {skills → intentkit/skills}/acolyt/base.py +0 -0
  127. {skills → intentkit/skills}/acolyt/schema.json +0 -0
  128. {skills → intentkit/skills}/aixbt/README.md +0 -0
  129. {skills → intentkit/skills}/aixbt/__init__.py +0 -0
  130. {skills → intentkit/skills}/aixbt/aixbt.jpg +0 -0
  131. {skills → intentkit/skills}/aixbt/base.py +0 -0
  132. {skills → intentkit/skills}/aixbt/projects.py +0 -0
  133. {skills → intentkit/skills}/aixbt/schema.json +0 -0
  134. {skills → intentkit/skills}/allora/__init__.py +0 -0
  135. {skills → intentkit/skills}/allora/allora.jpeg +0 -0
  136. {skills → intentkit/skills}/allora/base.py +0 -0
  137. {skills → intentkit/skills}/allora/price.py +0 -0
  138. {skills → intentkit/skills}/allora/schema.json +0 -0
  139. {skills → intentkit/skills}/carv/README.md +0 -0
  140. {skills → intentkit/skills}/carv/__init__.py +0 -0
  141. {skills → intentkit/skills}/carv/base.py +0 -0
  142. {skills → intentkit/skills}/carv/carv.webp +0 -0
  143. {skills → intentkit/skills}/carv/fetch_news.py +0 -0
  144. {skills → intentkit/skills}/carv/onchain_query.py +0 -0
  145. {skills → intentkit/skills}/carv/schema.json +0 -0
  146. {skills → intentkit/skills}/carv/token_info_and_price.py +0 -0
  147. {skills → intentkit/skills}/cdp/base.py +0 -0
  148. {skills → intentkit/skills}/cdp/cdp.png +0 -0
  149. {skills → intentkit/skills}/chainlist/README.md +0 -0
  150. {skills → intentkit/skills}/chainlist/__init__.py +0 -0
  151. {skills → intentkit/skills}/chainlist/base.py +0 -0
  152. {skills → intentkit/skills}/chainlist/chain_lookup.py +0 -0
  153. {skills → intentkit/skills}/chainlist/chainlist.png +0 -0
  154. {skills → intentkit/skills}/chainlist/schema.json +0 -0
  155. {skills → intentkit/skills}/common/__init__.py +0 -0
  156. {skills → intentkit/skills}/common/base.py +0 -0
  157. {skills → intentkit/skills}/common/common.jpg +0 -0
  158. {skills → intentkit/skills}/common/current_time.py +0 -0
  159. {skills → intentkit/skills}/common/schema.json +0 -0
  160. {skills → intentkit/skills}/cookiefun/README.md +0 -0
  161. {skills → intentkit/skills}/cookiefun/__init__.py +0 -0
  162. {skills → intentkit/skills}/cookiefun/base.py +0 -0
  163. {skills → intentkit/skills}/cookiefun/constants.py +0 -0
  164. {skills → intentkit/skills}/cookiefun/cookiefun.png +0 -0
  165. {skills → intentkit/skills}/cookiefun/get_account_details.py +0 -0
  166. {skills → intentkit/skills}/cookiefun/get_account_feed.py +0 -0
  167. {skills → intentkit/skills}/cookiefun/get_account_smart_followers.py +0 -0
  168. {skills → intentkit/skills}/cookiefun/get_sectors.py +0 -0
  169. {skills → intentkit/skills}/cookiefun/schema.json +0 -0
  170. {skills → intentkit/skills}/cookiefun/search_accounts.py +0 -0
  171. {skills → intentkit/skills}/cryptocompare/__init__.py +0 -0
  172. {skills → intentkit/skills}/cryptocompare/api.py +0 -0
  173. {skills → intentkit/skills}/cryptocompare/base.py +0 -0
  174. {skills → intentkit/skills}/cryptocompare/cryptocompare.png +0 -0
  175. {skills → intentkit/skills}/cryptocompare/schema.json +0 -0
  176. {skills → intentkit/skills}/cryptopanic/__init__.py +0 -0
  177. {skills → intentkit/skills}/cryptopanic/base.py +0 -0
  178. {skills → intentkit/skills}/cryptopanic/cryptopanic.png +0 -0
  179. {skills → intentkit/skills}/cryptopanic/fetch_crypto_news.py +0 -0
  180. {skills → intentkit/skills}/cryptopanic/fetch_crypto_sentiment.py +0 -0
  181. {skills → intentkit/skills}/cryptopanic/schema.json +0 -0
  182. {skills → intentkit/skills}/dapplooker/README.md +0 -0
  183. {skills → intentkit/skills}/dapplooker/__init__.py +0 -0
  184. {skills → intentkit/skills}/dapplooker/base.py +0 -0
  185. {skills → intentkit/skills}/dapplooker/dapplooker.jpg +0 -0
  186. {skills → intentkit/skills}/dapplooker/dapplooker_token_data.py +0 -0
  187. {skills → intentkit/skills}/dapplooker/schema.json +0 -0
  188. {skills → intentkit/skills}/defillama/__init__.py +0 -0
  189. {skills → intentkit/skills}/defillama/api.py +0 -0
  190. {skills → intentkit/skills}/defillama/coins/__init__.py +0 -0
  191. {skills → intentkit/skills}/defillama/coins/fetch_batch_historical_prices.py +0 -0
  192. {skills → intentkit/skills}/defillama/coins/fetch_block.py +0 -0
  193. {skills → intentkit/skills}/defillama/coins/fetch_current_prices.py +0 -0
  194. {skills → intentkit/skills}/defillama/coins/fetch_first_price.py +0 -0
  195. {skills → intentkit/skills}/defillama/coins/fetch_historical_prices.py +0 -0
  196. {skills → intentkit/skills}/defillama/coins/fetch_price_chart.py +0 -0
  197. {skills → intentkit/skills}/defillama/coins/fetch_price_percentage.py +0 -0
  198. {skills → intentkit/skills}/defillama/config/__init__.py +0 -0
  199. {skills → intentkit/skills}/defillama/config/chains.py +0 -0
  200. {skills → intentkit/skills}/defillama/defillama.jpeg +0 -0
  201. {skills → intentkit/skills}/defillama/fees/__init__.py +0 -0
  202. {skills → intentkit/skills}/defillama/fees/fetch_fees_overview.py +0 -0
  203. {skills → intentkit/skills}/defillama/schema.json +0 -0
  204. {skills → intentkit/skills}/defillama/stablecoins/__init__.py +0 -0
  205. {skills → intentkit/skills}/defillama/stablecoins/fetch_stablecoin_chains.py +0 -0
  206. {skills → intentkit/skills}/defillama/stablecoins/fetch_stablecoin_charts.py +0 -0
  207. {skills → intentkit/skills}/defillama/stablecoins/fetch_stablecoin_prices.py +0 -0
  208. {skills → intentkit/skills}/defillama/stablecoins/fetch_stablecoins.py +0 -0
  209. {skills → intentkit/skills}/defillama/tests/__init__.py +0 -0
  210. {skills → intentkit/skills}/defillama/tests/api_integration.test.py +0 -0
  211. {skills → intentkit/skills}/defillama/tests/api_unit.test.py +0 -0
  212. {skills → intentkit/skills}/defillama/tvl/__init__.py +0 -0
  213. {skills → intentkit/skills}/defillama/tvl/fetch_chain_historical_tvl.py +0 -0
  214. {skills → intentkit/skills}/defillama/tvl/fetch_chains.py +0 -0
  215. {skills → intentkit/skills}/defillama/tvl/fetch_historical_tvl.py +0 -0
  216. {skills → intentkit/skills}/defillama/tvl/fetch_protocol.py +0 -0
  217. {skills → intentkit/skills}/defillama/tvl/fetch_protocol_current_tvl.py +0 -0
  218. {skills → intentkit/skills}/defillama/tvl/fetch_protocols.py +0 -0
  219. {skills → intentkit/skills}/defillama/volumes/__init__.py +0 -0
  220. {skills → intentkit/skills}/defillama/volumes/fetch_dex_overview.py +0 -0
  221. {skills → intentkit/skills}/defillama/volumes/fetch_dex_summary.py +0 -0
  222. {skills → intentkit/skills}/defillama/volumes/fetch_options_overview.py +0 -0
  223. {skills → intentkit/skills}/defillama/yields/__init__.py +0 -0
  224. {skills → intentkit/skills}/defillama/yields/fetch_pool_chart.py +0 -0
  225. {skills → intentkit/skills}/defillama/yields/fetch_pools.py +0 -0
  226. {skills → intentkit/skills}/dexscreener/__init__.py +0 -0
  227. {skills → intentkit/skills}/dexscreener/base.py +0 -0
  228. {skills → intentkit/skills}/dexscreener/dexscreener.png +0 -0
  229. {skills → intentkit/skills}/dexscreener/model/__init__.py +0 -0
  230. {skills → intentkit/skills}/dexscreener/model/search_token_response.py +0 -0
  231. {skills → intentkit/skills}/dexscreener/schema.json +0 -0
  232. {skills → intentkit/skills}/dexscreener/search_token.py +0 -0
  233. {skills → intentkit/skills}/dune_analytics/__init__.py +0 -0
  234. {skills → intentkit/skills}/dune_analytics/base.py +0 -0
  235. {skills → intentkit/skills}/dune_analytics/dune.png +0 -0
  236. {skills → intentkit/skills}/dune_analytics/fetch_kol_buys.py +0 -0
  237. {skills → intentkit/skills}/dune_analytics/fetch_nation_metrics.py +0 -0
  238. {skills → intentkit/skills}/dune_analytics/schema.json +0 -0
  239. {skills → intentkit/skills}/elfa/README.md +0 -0
  240. {skills → intentkit/skills}/elfa/__init__.py +0 -0
  241. {skills → intentkit/skills}/elfa/base.py +0 -0
  242. {skills → intentkit/skills}/elfa/elfa.jpg +0 -0
  243. {skills → intentkit/skills}/elfa/mention.py +0 -0
  244. {skills → intentkit/skills}/elfa/schema.json +0 -0
  245. {skills → intentkit/skills}/elfa/stats.py +0 -0
  246. {skills → intentkit/skills}/elfa/tokens.py +0 -0
  247. {skills → intentkit/skills}/enso/README.md +0 -0
  248. {skills → intentkit/skills}/enso/__init__.py +0 -0
  249. {skills → intentkit/skills}/enso/abi/__init__.py +0 -0
  250. {skills → intentkit/skills}/enso/abi/approval.py +0 -0
  251. {skills → intentkit/skills}/enso/abi/erc20.py +0 -0
  252. {skills → intentkit/skills}/enso/abi/route.py +0 -0
  253. {skills → intentkit/skills}/enso/best_yield.py +0 -0
  254. {skills → intentkit/skills}/enso/enso.jpg +0 -0
  255. {skills → intentkit/skills}/enso/prices.py +0 -0
  256. {skills → intentkit/skills}/enso/schema.json +0 -0
  257. {skills → intentkit/skills}/github/README.md +0 -0
  258. {skills → intentkit/skills}/github/__init__.py +0 -0
  259. {skills → intentkit/skills}/github/base.py +0 -0
  260. {skills → intentkit/skills}/github/github.jpg +0 -0
  261. {skills → intentkit/skills}/github/github_search.py +0 -0
  262. {skills → intentkit/skills}/github/schema.json +0 -0
  263. {skills → intentkit/skills}/heurist/__init__.py +0 -0
  264. {skills → intentkit/skills}/heurist/base.py +0 -0
  265. {skills → intentkit/skills}/heurist/heurist.png +0 -0
  266. {skills → intentkit/skills}/heurist/schema.json +0 -0
  267. {skills → intentkit/skills}/lifi/README.md +0 -0
  268. {skills → intentkit/skills}/lifi/__init__.py +0 -0
  269. {skills → intentkit/skills}/lifi/base.py +0 -0
  270. {skills → intentkit/skills}/lifi/lifi.png +0 -0
  271. {skills → intentkit/skills}/lifi/schema.json +0 -0
  272. {skills → intentkit/skills}/lifi/token_quote.py +0 -0
  273. {skills → intentkit/skills}/lifi/utils.py +0 -0
  274. {skills → intentkit/skills}/moralis/README.md +0 -0
  275. {skills → intentkit/skills}/moralis/__init__.py +0 -0
  276. {skills → intentkit/skills}/moralis/api.py +0 -0
  277. {skills → intentkit/skills}/moralis/base.py +0 -0
  278. {skills → intentkit/skills}/moralis/fetch_chain_portfolio.py +0 -0
  279. {skills → intentkit/skills}/moralis/fetch_nft_portfolio.py +0 -0
  280. {skills → intentkit/skills}/moralis/fetch_solana_portfolio.py +0 -0
  281. {skills → intentkit/skills}/moralis/fetch_wallet_portfolio.py +0 -0
  282. {skills → intentkit/skills}/moralis/moralis.png +0 -0
  283. {skills → intentkit/skills}/moralis/schema.json +0 -0
  284. {skills → intentkit/skills}/moralis/tests/__init__.py +0 -0
  285. {skills → intentkit/skills}/moralis/tests/test_wallet.py +0 -0
  286. {skills → intentkit/skills}/nation/__init__.py +0 -0
  287. {skills → intentkit/skills}/nation/base.py +0 -0
  288. {skills → intentkit/skills}/nation/nation.png +0 -0
  289. {skills → intentkit/skills}/nation/nft_check.py +0 -0
  290. {skills → intentkit/skills}/nation/schema.json +0 -0
  291. {skills → intentkit/skills}/openai/__init__.py +0 -0
  292. {skills → intentkit/skills}/openai/base.py +0 -0
  293. {skills → intentkit/skills}/openai/image_to_text.py +0 -0
  294. {skills → intentkit/skills}/openai/openai.png +0 -0
  295. {skills → intentkit/skills}/openai/schema.json +0 -0
  296. {skills → intentkit/skills}/portfolio/README.md +0 -0
  297. {skills → intentkit/skills}/portfolio/__init__.py +0 -0
  298. {skills → intentkit/skills}/portfolio/base.py +0 -0
  299. {skills → intentkit/skills}/portfolio/constants.py +0 -0
  300. {skills → intentkit/skills}/portfolio/moralis.png +0 -0
  301. {skills → intentkit/skills}/portfolio/schema.json +0 -0
  302. {skills → intentkit/skills}/portfolio/token_balances.py +0 -0
  303. {skills → intentkit/skills}/portfolio/wallet_approvals.py +0 -0
  304. {skills → intentkit/skills}/portfolio/wallet_defi_positions.py +0 -0
  305. {skills → intentkit/skills}/portfolio/wallet_history.py +0 -0
  306. {skills → intentkit/skills}/portfolio/wallet_net_worth.py +0 -0
  307. {skills → intentkit/skills}/portfolio/wallet_nfts.py +0 -0
  308. {skills → intentkit/skills}/portfolio/wallet_profitability.py +0 -0
  309. {skills → intentkit/skills}/portfolio/wallet_profitability_summary.py +0 -0
  310. {skills → intentkit/skills}/portfolio/wallet_stats.py +0 -0
  311. {skills → intentkit/skills}/portfolio/wallet_swaps.py +0 -0
  312. {skills → intentkit/skills}/skills.toml +0 -0
  313. {skills → intentkit/skills}/slack/__init__.py +0 -0
  314. {skills → intentkit/skills}/slack/base.py +0 -0
  315. {skills → intentkit/skills}/slack/get_channel.py +0 -0
  316. {skills → intentkit/skills}/slack/get_message.py +0 -0
  317. {skills → intentkit/skills}/slack/schedule_message.py +0 -0
  318. {skills → intentkit/skills}/slack/schema.json +0 -0
  319. {skills → intentkit/skills}/slack/send_message.py +0 -0
  320. {skills → intentkit/skills}/slack/slack.jpg +0 -0
  321. {skills → intentkit/skills}/system/__init__.py +0 -0
  322. {skills → intentkit/skills}/system/base.py +0 -0
  323. {skills → intentkit/skills}/system/schema.json +0 -0
  324. {skills → intentkit/skills}/system/system.svg +0 -0
  325. {skills → intentkit/skills}/tavily/README.md +0 -0
  326. {skills → intentkit/skills}/tavily/__init__.py +0 -0
  327. {skills → intentkit/skills}/tavily/base.py +0 -0
  328. {skills → intentkit/skills}/tavily/schema.json +0 -0
  329. {skills → intentkit/skills}/tavily/tavily.jpg +0 -0
  330. {skills → intentkit/skills}/tavily/tavily_extract.py +0 -0
  331. {skills → intentkit/skills}/tavily/tavily_search.py +0 -0
  332. {skills → intentkit/skills}/token/README.md +0 -0
  333. {skills → intentkit/skills}/token/__init__.py +0 -0
  334. {skills → intentkit/skills}/token/constants.py +0 -0
  335. {skills → intentkit/skills}/token/erc20_transfers.py +0 -0
  336. {skills → intentkit/skills}/token/moralis.png +0 -0
  337. {skills → intentkit/skills}/token/schema.json +0 -0
  338. {skills → intentkit/skills}/token/token_analytics.py +0 -0
  339. {skills → intentkit/skills}/token/token_price.py +0 -0
  340. {skills → intentkit/skills}/token/token_search.py +0 -0
  341. {skills → intentkit/skills}/twitter/__init__.py +0 -0
  342. {skills → intentkit/skills}/twitter/base.py +0 -0
  343. {skills → intentkit/skills}/twitter/schema.json +0 -0
  344. {skills → intentkit/skills}/twitter/twitter.png +0 -0
  345. {skills → intentkit/skills}/unrealspeech/__init__.py +0 -0
  346. {skills → intentkit/skills}/unrealspeech/base.py +0 -0
  347. {skills → intentkit/skills}/unrealspeech/schema.json +0 -0
  348. {skills → intentkit/skills}/unrealspeech/unrealspeech.jpg +0 -0
  349. {skills → intentkit/skills}/venice_audio/__init__.py +0 -0
  350. {skills → intentkit/skills}/venice_audio/base.py +0 -0
  351. {skills → intentkit/skills}/venice_audio/input.py +0 -0
  352. {skills → intentkit/skills}/venice_audio/schema.json +0 -0
  353. {skills → intentkit/skills}/venice_audio/venice_audio.py +0 -0
  354. {skills → intentkit/skills}/venice_audio/venice_logo.jpg +0 -0
  355. {skills → intentkit/skills}/venice_image/README.md +0 -0
  356. {skills → intentkit/skills}/venice_image/__init__.py +0 -0
  357. {skills → intentkit/skills}/venice_image/api.py +0 -0
  358. {skills → intentkit/skills}/venice_image/base.py +0 -0
  359. {skills → intentkit/skills}/venice_image/config.py +0 -0
  360. {skills → intentkit/skills}/venice_image/image_enhance/README.md +0 -0
  361. {skills → intentkit/skills}/venice_image/image_enhance/__init__.py +0 -0
  362. {skills → intentkit/skills}/venice_image/image_enhance/image_enhance.py +0 -0
  363. {skills → intentkit/skills}/venice_image/image_enhance/image_enhance_base.py +0 -0
  364. {skills → intentkit/skills}/venice_image/image_enhance/image_enhance_input.py +0 -0
  365. {skills → intentkit/skills}/venice_image/image_generation/README.md +0 -0
  366. {skills → intentkit/skills}/venice_image/image_generation/__init__.py +0 -0
  367. {skills → intentkit/skills}/venice_image/image_generation/image_generation_base.py +0 -0
  368. {skills → intentkit/skills}/venice_image/image_generation/image_generation_fluently_xl.py +0 -0
  369. {skills → intentkit/skills}/venice_image/image_generation/image_generation_flux_dev.py +0 -0
  370. {skills → intentkit/skills}/venice_image/image_generation/image_generation_flux_dev_uncensored.py +0 -0
  371. {skills → intentkit/skills}/venice_image/image_generation/image_generation_input.py +0 -0
  372. {skills → intentkit/skills}/venice_image/image_generation/image_generation_lustify_sdxl.py +0 -0
  373. {skills → intentkit/skills}/venice_image/image_generation/image_generation_pony_realism.py +0 -0
  374. {skills → intentkit/skills}/venice_image/image_generation/image_generation_stable_diffusion_3_5.py +0 -0
  375. {skills → intentkit/skills}/venice_image/image_generation/image_generation_venice_sd35.py +0 -0
  376. {skills → intentkit/skills}/venice_image/image_upscale/README.md +0 -0
  377. {skills → intentkit/skills}/venice_image/image_upscale/__init__.py +0 -0
  378. {skills → intentkit/skills}/venice_image/image_upscale/image_upscale.py +0 -0
  379. {skills → intentkit/skills}/venice_image/image_upscale/image_upscale_base.py +0 -0
  380. {skills → intentkit/skills}/venice_image/image_upscale/image_upscale_input.py +0 -0
  381. {skills → intentkit/skills}/venice_image/image_vision/README.md +0 -0
  382. {skills → intentkit/skills}/venice_image/image_vision/__init__.py +0 -0
  383. {skills → intentkit/skills}/venice_image/image_vision/image_vision.py +0 -0
  384. {skills → intentkit/skills}/venice_image/image_vision/image_vision_base.py +0 -0
  385. {skills → intentkit/skills}/venice_image/image_vision/image_vision_input.py +0 -0
  386. {skills → intentkit/skills}/venice_image/schema.json +0 -0
  387. {skills → intentkit/skills}/venice_image/utils.py +0 -0
  388. {skills → intentkit/skills}/venice_image/venice_image.jpg +0 -0
  389. {skills → intentkit/skills}/web_scraper/base.py +0 -0
  390. {skills → intentkit/skills}/web_scraper/langchain.png +0 -0
  391. {utils → intentkit/utils}/__init__.py +0 -0
  392. {utils → intentkit/utils}/chain.py +0 -0
  393. {utils → intentkit/utils}/error.py +0 -0
  394. {utils → intentkit/utils}/middleware.py +0 -0
  395. {utils → intentkit/utils}/random.py +0 -0
  396. {utils → intentkit/utils}/s3.py +0 -0
  397. {utils → intentkit/utils}/slack_alert.py +0 -0
  398. {utils → intentkit/utils}/tx.py +0 -0
  399. {intentkit-0.5.1.dist-info → intentkit-0.6.0.dist-info}/WHEEL +0 -0
  400. {intentkit-0.5.1.dist-info → intentkit-0.6.0.dist-info}/licenses/LICENSE +0 -0
@@ -1,3 +1,4 @@
1
+ import asyncio
1
2
  import logging
2
3
  from typing import Any, Callable, Dict, Literal, NotRequired, Optional, TypedDict, Union
3
4
 
@@ -30,10 +31,33 @@ class SkillConfig(TypedDict):
30
31
 
31
32
 
32
33
  class SkillContext(BaseModel):
33
- agent: Agent
34
- config: Dict[str, Any]
35
- user_id: Optional[str]
34
+ skill_category: str
35
+ agent_id: str
36
+ user_id: Optional[str] = None
37
+ chat_id: Optional[str] = None
38
+ app_id: Optional[str] = None
36
39
  entrypoint: Literal["web", "twitter", "telegram", "trigger", "api"]
40
+ is_private: bool
41
+ payer: Optional[str] = None
42
+ _agent: Optional[Agent] = None
43
+
44
+ @property
45
+ def agent(self) -> Agent:
46
+ if self._agent is None:
47
+ self._agent = asyncio.run(Agent.get(self.agent_id))
48
+ return self._agent
49
+
50
+ @property
51
+ def config(self) -> Dict[str, Any]:
52
+ agent = self.agent
53
+ config = None
54
+ if agent.skills:
55
+ config = agent.skills.get(self.skill_category)
56
+ if not config:
57
+ raise ValueError(
58
+ f"Skill {self.skill_category} not found in agent {self.agent_id}"
59
+ )
60
+ return config
37
61
 
38
62
 
39
63
  class IntentKitSkill(BaseTool):
@@ -156,19 +180,15 @@ class IntentKitSkill(BaseTool):
156
180
  def context_from_config(self, runner_config: RunnableConfig) -> SkillContext:
157
181
  if "configurable" not in runner_config:
158
182
  raise ValueError("configurable not in runner_config")
159
- if "agent" not in runner_config["configurable"]:
160
- raise ValueError("agent not in runner_config['configurable']")
161
- agent: Agent = runner_config["configurable"].get("agent")
162
- config = None
163
- if agent.skills:
164
- config = agent.skills.get(self.category)
165
- if not config:
166
- config = getattr(agent, self.category + "_config", {})
167
- if not config:
168
- config = {}
183
+ configurable = runner_config["configurable"]
184
+ if not configurable:
185
+ raise ValueError("configurable in runnable config is empty")
169
186
  return SkillContext(
170
- agent=agent,
171
- config=config,
172
- user_id=runner_config["configurable"].get("user_id"),
173
- entrypoint=runner_config["configurable"].get("entrypoint"),
187
+ skill_category=self.category,
188
+ agent_id=configurable.get("agent_id"),
189
+ user_id=configurable.get("user_id"),
190
+ app_id=configurable.get("app_id"),
191
+ chat_id=configurable.get("chat_id"),
192
+ entrypoint=configurable.get("entrypoint"),
193
+ is_private=configurable.get("is_private"),
174
194
  )
@@ -5,10 +5,9 @@ from typing import TypedDict
5
5
  from coinbase_agentkit import (
6
6
  AgentKit,
7
7
  AgentKitConfig,
8
- CdpWalletProvider,
8
+ CdpEvmServerWalletProvider,
9
9
  basename_action_provider,
10
10
  cdp_api_action_provider,
11
- cdp_wallet_action_provider,
12
11
  erc20_action_provider,
13
12
  morpho_action_provider,
14
13
  pyth_action_provider,
@@ -26,9 +25,6 @@ from intentkit.skills.base import SkillConfig, SkillState
26
25
  from intentkit.skills.cdp.base import CDPBaseTool
27
26
  from intentkit.skills.cdp.get_balance import GetBalance
28
27
 
29
- # Cache skills at the system level, because they are stateless
30
- _cache: dict[str, CDPBaseTool] = {}
31
-
32
28
 
33
29
  class SkillStates(TypedDict):
34
30
  get_balance: SkillState
@@ -37,10 +33,6 @@ class SkillStates(TypedDict):
37
33
  WalletActionProvider_native_transfer: SkillState
38
34
  CdpApiActionProvider_address_reputation: SkillState
39
35
  CdpApiActionProvider_request_faucet_funds: SkillState
40
- CdpWalletActionProvider_deploy_contract: SkillState
41
- CdpWalletActionProvider_deploy_nft: SkillState
42
- CdpWalletActionProvider_deploy_token: SkillState
43
- CdpWalletActionProvider_trade: SkillState
44
36
  PythActionProvider_fetch_price: SkillState
45
37
  PythActionProvider_fetch_price_feed_id: SkillState
46
38
  BasenameActionProvider_register_basename: SkillState
@@ -97,15 +89,15 @@ async def get_skills(
97
89
 
98
90
  # Initialize CDP client
99
91
  cdp_client: CdpClient = await get_cdp_client(agent_id, store)
100
- cdp_wallet_provider: CdpWalletProvider = await cdp_client.get_wallet_provider()
101
- cdp_provider_config = await cdp_client.get_provider_config()
92
+ cdp_wallet_provider: CdpEvmServerWalletProvider = (
93
+ await cdp_client.get_wallet_provider()
94
+ )
102
95
  agent_kit = AgentKit(
103
96
  AgentKitConfig(
104
97
  wallet_provider=cdp_wallet_provider,
105
98
  action_providers=[
106
99
  wallet_action_provider(),
107
- cdp_api_action_provider(cdp_provider_config),
108
- cdp_wallet_action_provider(cdp_provider_config),
100
+ cdp_api_action_provider(),
109
101
  pyth_action_provider(),
110
102
  basename_action_provider(),
111
103
  erc20_action_provider(),
@@ -121,9 +113,9 @@ async def get_skills(
121
113
  tools = []
122
114
  for skill in available_skills:
123
115
  if skill == "get_balance":
116
+ # Get the account object for the custom GetBalance skill
124
117
  tools.append(
125
118
  GetBalance(
126
- wallet=cdp_wallet_provider._wallet,
127
119
  agent_id=agent_id,
128
120
  skill_store=store,
129
121
  )
@@ -0,0 +1,133 @@
1
+ from typing import Optional, Type
2
+
3
+ from cdp import EvmServerAccount
4
+ from pydantic import BaseModel, Field
5
+
6
+ from intentkit.abstracts.skill import SkillStoreABC
7
+ from intentkit.clients import get_cdp_client
8
+ from intentkit.skills.cdp.base import CDPBaseTool
9
+
10
+
11
+ class GetBalanceInput(BaseModel):
12
+ """Input for GetBalance tool."""
13
+
14
+ asset_id: Optional[str] = Field(
15
+ default=None,
16
+ description="The asset ID to get the balance for (e.g., 'eth', 'usdc', or a valid contract address). If not provided, returns all token balances.",
17
+ )
18
+
19
+
20
+ class GetBalance(CDPBaseTool):
21
+ """Tool for getting balance from CDP wallet.
22
+
23
+ This tool uses the CDP API to get balance for all addresses in a wallet for a given asset.
24
+
25
+ Attributes:
26
+ name: The name of the tool.
27
+ description: A description of what the tool does.
28
+ args_schema: The schema for the tool's input arguments.
29
+ """
30
+
31
+ agent_id: str
32
+ skill_store: SkillStoreABC
33
+
34
+ name: str = "cdp_get_balance"
35
+ description: str = (
36
+ "This tool will get the balance of all the addresses in the wallet. If asset_id is provided, it returns the balance for that specific asset. "
37
+ "If no asset_id is provided, it returns all token balances. "
38
+ "Always use 'eth' for the native asset ETH and 'usdc' for USDC. "
39
+ "Other valid asset IDs are: weth,dai,reth,brett,w,cbeth,axl,iotx,prime,aero,rsr,mog,tbtc,npc,yfi"
40
+ )
41
+ args_schema: Type[BaseModel] = GetBalanceInput
42
+
43
+ async def _arun(self, asset_id: Optional[str] = None) -> str:
44
+ """Async implementation of the tool to get balance.
45
+
46
+ Args:
47
+ asset_id (Optional[str]): The asset ID to get the balance for. If None, returns all token balances.
48
+
49
+ Returns:
50
+ str: A message containing the balance information or error message.
51
+ """
52
+ try:
53
+ # Get network information from CDP client
54
+ cdp_client = await get_cdp_client(self.agent_id, self.skill_store)
55
+ provider = await cdp_client.get_wallet_provider()
56
+ account: EvmServerAccount = provider._account
57
+ provider_config = await cdp_client.get_provider_config()
58
+ network_id = provider_config.network_id
59
+
60
+ # Map network_id to the format expected by the API
61
+ network_mapping = {
62
+ "base-mainnet": "base",
63
+ "ethereum-mainnet": "ethereum",
64
+ }
65
+ api_network = network_mapping.get(network_id, network_id)
66
+
67
+ # If no asset_id provided, return all token balances
68
+ if asset_id is None:
69
+ try:
70
+ # Get native ETH balance
71
+ balance_wei = provider.get_balance()
72
+ balance_eth = balance_wei / (10**18) # Convert from wei to ETH
73
+
74
+ # Get all token balances
75
+ token_balances = await account.list_token_balances(api_network)
76
+
77
+ result = [f"ETH balance: {balance_eth} ETH"]
78
+
79
+ for balance in token_balances.balances:
80
+ result.append(
81
+ f"{balance.token.symbol} balance: {balance.amount.decimals} {balance.token.name}"
82
+ )
83
+
84
+ return f"All balances for account {account.address}:\n" + "\n".join(
85
+ result
86
+ )
87
+
88
+ except Exception as e:
89
+ return f"Error getting all balances: {e!s}"
90
+
91
+ # For native ETH balance, use the account's balance directly
92
+ if asset_id.lower() == "eth":
93
+ try:
94
+ # Get native balance using Web3
95
+ balance_wei = provider.get_balance()
96
+ balance_eth = balance_wei / (10**18) # Convert from wei to ETH
97
+ return (
98
+ f"ETH balance for account {account.address}: {balance_eth} ETH"
99
+ )
100
+ except Exception as e:
101
+ return f"Error getting ETH balance: {e!s}"
102
+
103
+ # For other tokens, try the list_token_balances API
104
+ try:
105
+ # list_token_balances returns all token balances for the account
106
+ token_balances = await account.list_token_balances(api_network)
107
+
108
+ # Find the balance for the specific asset
109
+ target_balance = None
110
+ for balance in token_balances.balances:
111
+ if balance.token.symbol.lower() == asset_id.lower():
112
+ target_balance = balance
113
+ break
114
+
115
+ if target_balance:
116
+ return f"Balance for {asset_id} in account {account.address}: {target_balance.amount.decimals} {target_balance.token.name}"
117
+ else:
118
+ return f"No balance found for asset {asset_id} in account {account.address}"
119
+
120
+ except Exception as e:
121
+ return f"Error getting balance for account: {e!s}"
122
+
123
+ except Exception as e:
124
+ return f"Error getting balance: {str(e)}"
125
+
126
+ def _run(self, asset_id: Optional[str] = None) -> str:
127
+ """Sync implementation of the tool.
128
+
129
+ This method is deprecated since we now have native async implementation in _arun.
130
+ """
131
+ raise NotImplementedError(
132
+ "Use _arun instead, which is the async implementation"
133
+ )
@@ -193,70 +193,6 @@
193
193
  "description": "State for WalletActionProvider_native_transfer",
194
194
  "default": "private"
195
195
  },
196
- "CdpWalletActionProvider_trade": {
197
- "type": "string",
198
- "title": "CDP Wallet Trade",
199
- "enum": [
200
- "disabled",
201
- "public",
202
- "private"
203
- ],
204
- "x-enum-title": [
205
- "Disabled",
206
- "Agent Owner + All Users",
207
- "Agent Owner Only"
208
- ],
209
- "description": "State for CdpWalletActionProvider_trade",
210
- "default": "private"
211
- },
212
- "CdpWalletActionProvider_deploy_nft": {
213
- "type": "string",
214
- "title": "Cdp Wallet Deploy Nft",
215
- "enum": [
216
- "disabled",
217
- "public",
218
- "private"
219
- ],
220
- "x-enum-title": [
221
- "Disabled",
222
- "Agent Owner + All Users",
223
- "Agent Owner Only"
224
- ],
225
- "description": "State for CdpWalletActionProvider_deploy_nft",
226
- "default": "disabled"
227
- },
228
- "CdpWalletActionProvider_deploy_token": {
229
- "type": "string",
230
- "title": "CDP Wallet Deploy Token",
231
- "enum": [
232
- "disabled",
233
- "public",
234
- "private"
235
- ],
236
- "x-enum-title": [
237
- "Disabled",
238
- "Agent Owner + All Users",
239
- "Agent Owner Only"
240
- ],
241
- "description": "State for CdpWalletActionProvider_deploy_token",
242
- "default": "disabled"
243
- },
244
- "CdpWalletActionProvider_deploy_contract": {
245
- "type": "string",
246
- "title": "CDP Wallet Deploy Contract",
247
- "enum": [
248
- "disabled",
249
- "public",
250
- "private"
251
- ],
252
- "x-enum-title": [
253
- "Disabled",
254
- "Agent Owner + All Users",
255
- "Agent Owner Only"
256
- ],
257
- "description": "State for CdpWalletActionProvider_deploy_contract",
258
- "default": "disabled"
259
- },
260
196
  "CdpApiActionProvider_request_faucet_funds": {
261
197
  "type": "string",
262
198
  "title": "CDP Request Faucet Funds",
@@ -57,7 +57,7 @@ class CryptoCompareFetchNews(CryptoCompareBaseTool):
57
57
  context = self.context_from_config(config)
58
58
 
59
59
  # Check rate limit
60
- await self.check_rate_limit(context.agent.id, max_requests=5, interval=60)
60
+ await self.check_rate_limit(context.agent_id, max_requests=5, interval=60)
61
61
 
62
62
  # Get API key from context
63
63
  api_key = context.config.get("api_key")
@@ -93,4 +93,4 @@ class CryptoCompareFetchNews(CryptoCompareBaseTool):
93
93
 
94
94
  except Exception as e:
95
95
  logger.error("Error fetching news: %s", str(e))
96
- raise type(e)(f"[agent:{context.agent.id}]: {e}") from e
96
+ raise type(e)(f"[agent:{context.agent_id}]: {e}") from e
@@ -67,7 +67,7 @@ class CryptoCompareFetchPrice(CryptoCompareBaseTool):
67
67
  context = self.context_from_config(config)
68
68
 
69
69
  # Check rate limit
70
- await self.check_rate_limit(context.agent.id, max_requests=10, interval=60)
70
+ await self.check_rate_limit(context.agent_id, max_requests=10, interval=60)
71
71
 
72
72
  # Get API key from context
73
73
  api_key = context.config.get("api_key")
@@ -96,4 +96,4 @@ class CryptoCompareFetchPrice(CryptoCompareBaseTool):
96
96
 
97
97
  except Exception as e:
98
98
  logger.error("Error fetching price: %s", str(e))
99
- raise type(e)(f"[agent:{context.agent.id}]: {e}") from e
99
+ raise type(e)(f"[agent:{context.agent_id}]: {e}") from e
@@ -73,7 +73,7 @@ class CryptoCompareFetchTopExchanges(CryptoCompareBaseTool):
73
73
  context = self.context_from_config(config)
74
74
 
75
75
  # Check rate limit
76
- await self.check_rate_limit(context.agent.id, max_requests=5, interval=60)
76
+ await self.check_rate_limit(context.agent_id, max_requests=5, interval=60)
77
77
 
78
78
  # Get API key from context
79
79
  api_key = context.config.get("api_key")
@@ -110,4 +110,4 @@ class CryptoCompareFetchTopExchanges(CryptoCompareBaseTool):
110
110
 
111
111
  except Exception as e:
112
112
  logger.error("Error fetching top exchanges: %s", str(e))
113
- raise type(e)(f"[agent:{context.agent.id}]: {e}") from e
113
+ raise type(e)(f"[agent:{context.agent_id}]: {e}") from e
@@ -66,7 +66,7 @@ class CryptoCompareFetchTopMarketCap(CryptoCompareBaseTool):
66
66
  context = self.context_from_config(config)
67
67
 
68
68
  # Check rate limit
69
- await self.check_rate_limit(context.agent.id, max_requests=5, interval=60)
69
+ await self.check_rate_limit(context.agent_id, max_requests=5, interval=60)
70
70
 
71
71
  # Get API key from context
72
72
  api_key = context.config.get("api_key")
@@ -106,4 +106,4 @@ class CryptoCompareFetchTopMarketCap(CryptoCompareBaseTool):
106
106
 
107
107
  except Exception as e:
108
108
  logger.error("Error fetching top market cap: %s", str(e))
109
- raise type(e)(f"[agent:{context.agent.id}]: {e}") from e
109
+ raise type(e)(f"[agent:{context.agent_id}]: {e}") from e
@@ -65,7 +65,7 @@ class CryptoCompareFetchTopVolume(CryptoCompareBaseTool):
65
65
  context = self.context_from_config(config)
66
66
 
67
67
  # Check rate limit
68
- await self.check_rate_limit(context.agent.id, max_requests=5, interval=60)
68
+ await self.check_rate_limit(context.agent_id, max_requests=5, interval=60)
69
69
 
70
70
  # Get API key from context
71
71
  api_key = context.config.get("api_key")
@@ -105,4 +105,4 @@ class CryptoCompareFetchTopVolume(CryptoCompareBaseTool):
105
105
 
106
106
  except Exception as e:
107
107
  logger.error("Error fetching top volume: %s", str(e))
108
- raise type(e)(f"[agent:{context.agent.id}]: {e}") from e
108
+ raise type(e)(f"[agent:{context.agent_id}]: {e}") from e
@@ -68,7 +68,7 @@ class CryptoCompareFetchTradingSignals(CryptoCompareBaseTool):
68
68
  context = self.context_from_config(config)
69
69
 
70
70
  # Check rate limit
71
- await self.check_rate_limit(context.agent.id, max_requests=5, interval=60)
71
+ await self.check_rate_limit(context.agent_id, max_requests=5, interval=60)
72
72
 
73
73
  # Get API key from context
74
74
  api_key = context.config.get("api_key")
@@ -104,4 +104,4 @@ class CryptoCompareFetchTradingSignals(CryptoCompareBaseTool):
104
104
 
105
105
  except Exception as e:
106
106
  logger.error("Error fetching trading signals: %s", str(e))
107
- raise type(e)(f"[agent:{context.agent.id}]: {e}") from e
107
+ raise type(e)(f"[agent:{context.agent_id}]: {e}") from e
@@ -52,7 +52,7 @@ class DefiLlamaBaseTool(IntentKitSkill):
52
52
  Rate limit status and error message if limited
53
53
  """
54
54
  rate_limit = await self.skill_store.get_agent_skill_data(
55
- context.agent.id, self.name, "rate_limit"
55
+ context.agent_id, self.name, "rate_limit"
56
56
  )
57
57
  current_time = datetime.now(tz=timezone.utc)
58
58
 
@@ -67,7 +67,7 @@ class DefiLlamaBaseTool(IntentKitSkill):
67
67
 
68
68
  rate_limit["count"] += 1
69
69
  await self.skill_store.save_agent_skill_data(
70
- context.agent.id, self.name, "rate_limit", rate_limit
70
+ context.agent_id, self.name, "rate_limit", rate_limit
71
71
  )
72
72
  return False, None
73
73
 
@@ -76,7 +76,7 @@ class DefiLlamaBaseTool(IntentKitSkill):
76
76
  "reset_time": (current_time + timedelta(minutes=interval)).isoformat(),
77
77
  }
78
78
  await self.skill_store.save_agent_skill_data(
79
- context.agent.id, self.name, "rate_limit", new_rate_limit
79
+ context.agent_id, self.name, "rate_limit", new_rate_limit
80
80
  )
81
81
  return False, None
82
82
 
@@ -1,6 +1,7 @@
1
1
  from typing import Optional, Type
2
2
 
3
- from cdp import Wallet
3
+ from cdp import EvmServerAccount
4
+ from coinbase_agentkit import CdpEvmServerWalletProvider
4
5
  from pydantic import BaseModel, Field
5
6
 
6
7
  from intentkit.abstracts.skill import SkillStoreABC
@@ -22,9 +23,31 @@ class EnsoBaseTool(IntentKitSkill):
22
23
  description="The skill store for persisting data"
23
24
  )
24
25
 
25
- async def get_wallet(self, context: SkillContext) -> Optional[Wallet]:
26
- client: CdpClient = await get_cdp_client(context.agent.id, self.skill_store)
27
- return await client.get_wallet()
26
+ async def get_account(self, context: SkillContext) -> Optional[EvmServerAccount]:
27
+ """Get the account object from the CDP client.
28
+
29
+ Args:
30
+ context: The skill context containing agent information.
31
+
32
+ Returns:
33
+ Optional[EvmServerAccount]: The account object if available.
34
+ """
35
+ client: CdpClient = await get_cdp_client(context.agent_id, self.skill_store)
36
+ return await client.get_account()
37
+
38
+ async def get_wallet_provider(
39
+ self, context: SkillContext
40
+ ) -> Optional[CdpEvmServerWalletProvider]:
41
+ """Get the wallet provider from the CDP client.
42
+
43
+ Args:
44
+ context: The skill context containing agent information.
45
+
46
+ Returns:
47
+ Optional[CdpEvmServerWalletProvider]: The wallet provider if available.
48
+ """
49
+ client: CdpClient = await get_cdp_client(context.agent_id, self.skill_store)
50
+ return await client.get_wallet_provider()
28
51
 
29
52
  def get_chain_provider(self, context: SkillContext) -> Optional[ChainProvider]:
30
53
  return self.skill_store.get_system_config("chain_provider")
@@ -86,7 +86,7 @@ class EnsoGetNetworks(EnsoBaseTool):
86
86
  )
87
87
 
88
88
  await self.skill_store.save_agent_skill_data(
89
- context.agent.id,
89
+ context.agent_id,
90
90
  "enso_get_networks",
91
91
  "networks",
92
92
  networks_memory,
@@ -6,9 +6,7 @@ from langchain_core.runnables import RunnableConfig
6
6
  from pydantic import BaseModel, Field
7
7
 
8
8
  from intentkit.skills.base import SkillContext
9
- from intentkit.skills.enso.abi.route import ABI_ROUTE
10
9
  from intentkit.skills.enso.networks import EnsoGetNetworks
11
- from intentkit.utils.tx import EvmContractWrapper
12
10
 
13
11
  from .base import EnsoBaseTool, base_url, default_chain_id
14
12
 
@@ -186,10 +184,9 @@ class EnsoRouteShortcut(EnsoBaseTool):
186
184
  """
187
185
 
188
186
  context: SkillContext = self.context_from_config(config)
189
- agent_id = context.agent.id
187
+ agent_id = context.agent_id
190
188
  api_token = self.get_api_token(context)
191
- chain_provider = self.get_chain_provider(context)
192
- wallet = await self.get_wallet(context)
189
+ account = await self.get_account(context)
193
190
 
194
191
  async with httpx.AsyncClient() as client:
195
192
  try:
@@ -254,7 +251,7 @@ class EnsoRouteShortcut(EnsoBaseTool):
254
251
  tokenOut=tokenOut,
255
252
  ).model_dump(exclude_none=True)
256
253
 
257
- params["fromAddress"] = wallet.addresses[0].address_id
254
+ params["fromAddress"] = account.address
258
255
 
259
256
  response = await client.get(url, headers=headers, params=params)
260
257
  response.raise_for_status() # Raise HTTPError for non-2xx responses
@@ -268,23 +265,27 @@ class EnsoRouteShortcut(EnsoBaseTool):
268
265
  )
269
266
 
270
267
  if broadcast_requested:
271
- rpc_url = chain_provider.get_chain_config_by_id(chainId).rpc_url
272
- contract = EvmContractWrapper(
273
- rpc_url, ABI_ROUTE, json_dict.get("tx")
274
- )
275
-
276
- fn, fn_args = contract.fn_and_args
277
-
278
- fn_args["amountIn"] = str(fn_args["amountIn"])
279
-
280
- invocation = wallet.invoke_contract(
281
- contract_address=contract.dst_addr,
282
- method=fn.fn_name,
283
- abi=ABI_ROUTE,
284
- args=fn_args,
285
- ).wait()
286
-
287
- res.txHash = invocation.transaction.transaction_hash
268
+ # Use the wallet provider to send the transaction
269
+ wallet_provider = await self.get_wallet_provider(context)
270
+
271
+ # Extract transaction data from the Enso API response
272
+ tx_data = json_dict.get("tx", {})
273
+ if tx_data:
274
+ # Send the transaction using the wallet provider
275
+ tx_hash = wallet_provider.send_transaction(
276
+ {
277
+ "to": tx_data.get("to"),
278
+ "data": tx_data.get("data", "0x"),
279
+ "value": tx_data.get("value", 0),
280
+ }
281
+ )
282
+
283
+ # Wait for transaction confirmation
284
+ wallet_provider.wait_for_transaction_receipt(tx_hash)
285
+ res.txHash = tx_hash
286
+ else:
287
+ # For now, return a placeholder transaction hash if no tx data
288
+ res.txHash = "0x0000000000000000000000000000000000000000000000000000000000000000"
288
289
 
289
290
  return res
290
291
 
@@ -158,7 +158,7 @@ class EnsoGetTokens(EnsoBaseTool):
158
158
  url = f"{base_url}/api/v1/tokens"
159
159
 
160
160
  context: SkillContext = self.context_from_config(config)
161
- agent_id = context.agent.id
161
+ agent_id = context.agent_id
162
162
  api_token = self.get_api_token(context)
163
163
  main_tokens = self.get_main_tokens(context)
164
164
  headers = {