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/core/skill.py DELETED
@@ -1,200 +0,0 @@
1
- from typing import Any, Dict, List, Optional
2
-
3
- from intentkit.abstracts.skill import SkillStoreABC
4
- from intentkit.config.config import config
5
- from intentkit.core.agent import (
6
- add_autonomous_task as _add_autonomous_task,
7
- )
8
- from intentkit.core.agent import (
9
- delete_autonomous_task as _delete_autonomous_task,
10
- )
11
- from intentkit.core.agent import (
12
- list_autonomous_tasks as _list_autonomous_tasks,
13
- )
14
- from intentkit.core.agent import (
15
- update_autonomous_task as _update_autonomous_task,
16
- )
17
- from intentkit.models.agent import Agent, AgentAutonomous
18
- from intentkit.models.agent_data import AgentData, AgentQuota
19
- from intentkit.models.skill import (
20
- AgentSkillData,
21
- AgentSkillDataCreate,
22
- ThreadSkillData,
23
- ThreadSkillDataCreate,
24
- )
25
-
26
-
27
- class SkillStore(SkillStoreABC):
28
- """Implementation of skill data storage operations.
29
-
30
- This class provides concrete implementations for storing and retrieving
31
- skill-related data for both agents and threads.
32
- """
33
-
34
- @staticmethod
35
- def get_system_config(key: str) -> Any:
36
- # TODO: maybe need a whitelist here
37
- if hasattr(config, key):
38
- return getattr(config, key)
39
- return None
40
-
41
- @staticmethod
42
- async def get_agent_config(agent_id: str) -> Optional[Agent]:
43
- return await Agent.get(agent_id)
44
-
45
- @staticmethod
46
- async def get_agent_data(agent_id: str) -> AgentData:
47
- return await AgentData.get(agent_id)
48
-
49
- @staticmethod
50
- async def set_agent_data(agent_id: str, data: Dict) -> AgentData:
51
- return await AgentData.patch(agent_id, data)
52
-
53
- @staticmethod
54
- async def get_agent_quota(agent_id: str) -> AgentQuota:
55
- return await AgentQuota.get(agent_id)
56
-
57
- @staticmethod
58
- async def get_agent_skill_data(
59
- agent_id: str, skill: str, key: str
60
- ) -> Optional[Dict[str, Any]]:
61
- """Get skill data for an agent.
62
-
63
- Args:
64
- agent_id: ID of the agent
65
- skill: Name of the skill
66
- key: Data key
67
-
68
- Returns:
69
- Dictionary containing the skill data if found, None otherwise
70
- """
71
- return await AgentSkillData.get(agent_id, skill, key)
72
-
73
- @staticmethod
74
- async def save_agent_skill_data(
75
- agent_id: str, skill: str, key: str, data: Dict[str, Any]
76
- ) -> None:
77
- """Save or update skill data for an agent.
78
-
79
- Args:
80
- agent_id: ID of the agent
81
- skill: Name of the skill
82
- key: Data key
83
- data: JSON data to store
84
- """
85
- skill_data = AgentSkillDataCreate(
86
- agent_id=agent_id,
87
- skill=skill,
88
- key=key,
89
- data=data,
90
- )
91
- await skill_data.save()
92
-
93
- @staticmethod
94
- async def delete_agent_skill_data(agent_id: str, skill: str, key: str) -> None:
95
- """Delete skill data for an agent.
96
-
97
- Args:
98
- agent_id: ID of the agent
99
- skill: Name of the skill
100
- key: Data key
101
- """
102
- await AgentSkillData.delete(agent_id, skill, key)
103
-
104
- @staticmethod
105
- async def get_thread_skill_data(
106
- thread_id: str, skill: str, key: str
107
- ) -> Optional[Dict[str, Any]]:
108
- """Get skill data for a thread.
109
-
110
- Args:
111
- thread_id: ID of the thread
112
- skill: Name of the skill
113
- key: Data key
114
-
115
- Returns:
116
- Dictionary containing the skill data if found, None otherwise
117
- """
118
- return await ThreadSkillData.get(thread_id, skill, key)
119
-
120
- @staticmethod
121
- async def save_thread_skill_data(
122
- thread_id: str,
123
- agent_id: str,
124
- skill: str,
125
- key: str,
126
- data: Dict[str, Any],
127
- ) -> None:
128
- """Save or update skill data for a thread.
129
-
130
- Args:
131
- thread_id: ID of the thread
132
- agent_id: ID of the agent that owns this thread
133
- skill: Name of the skill
134
- key: Data key
135
- data: JSON data to store
136
- """
137
- skill_data = ThreadSkillDataCreate(
138
- thread_id=thread_id,
139
- agent_id=agent_id,
140
- skill=skill,
141
- key=key,
142
- data=data,
143
- )
144
- await skill_data.save()
145
-
146
- @staticmethod
147
- async def list_autonomous_tasks(agent_id: str) -> List[AgentAutonomous]:
148
- """List all autonomous tasks for an agent.
149
-
150
- Args:
151
- agent_id: ID of the agent
152
-
153
- Returns:
154
- List[AgentAutonomous]: List of autonomous task configurations
155
- """
156
- return await _list_autonomous_tasks(agent_id)
157
-
158
- @staticmethod
159
- async def add_autonomous_task(
160
- agent_id: str, task: AgentAutonomous
161
- ) -> AgentAutonomous:
162
- """Add a new autonomous task to an agent.
163
-
164
- Args:
165
- agent_id: ID of the agent
166
- task: Autonomous task configuration
167
-
168
- Returns:
169
- AgentAutonomous: The created task
170
- """
171
- return await _add_autonomous_task(agent_id, task)
172
-
173
- @staticmethod
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
- await _delete_autonomous_task(agent_id, task_id)
182
-
183
- @staticmethod
184
- async def update_autonomous_task(
185
- agent_id: str, task_id: str, task_updates: dict
186
- ) -> AgentAutonomous:
187
- """Update an autonomous task for an agent.
188
-
189
- Args:
190
- agent_id: ID of the agent
191
- task_id: ID of the task to update
192
- task_updates: Dictionary containing fields to update
193
-
194
- Returns:
195
- AgentAutonomous: The updated task
196
- """
197
- return await _update_autonomous_task(agent_id, task_id, task_updates)
198
-
199
-
200
- skill_store = SkillStore()
@@ -1,347 +0,0 @@
1
- """Agent Generation Log Model.
2
-
3
- This module defines the database models for logging agent generation operations,
4
- including token usage, prompts, AI responses, and generation metadata.
5
- """
6
-
7
- from datetime import datetime, timezone
8
- from typing import Annotated, Optional
9
-
10
- from epyxid import XID
11
- from intentkit.models.base import Base
12
- from pydantic import BaseModel, ConfigDict, Field
13
- from sqlalchemy import (
14
- Boolean,
15
- Column,
16
- DateTime,
17
- Integer,
18
- String,
19
- Text,
20
- func,
21
- select,
22
- )
23
- from sqlalchemy.dialects.postgresql import JSON, JSONB
24
- from sqlalchemy.ext.asyncio import AsyncSession
25
-
26
-
27
- class AgentGenerationLogTable(Base):
28
- """Agent generation log database table model."""
29
-
30
- __tablename__ = "agent_generation_logs"
31
-
32
- id = Column(
33
- String,
34
- primary_key=True,
35
- )
36
- user_id = Column(
37
- String,
38
- nullable=True,
39
- )
40
- prompt = Column(
41
- Text,
42
- nullable=False,
43
- )
44
- existing_agent_id = Column(
45
- String,
46
- nullable=True,
47
- )
48
- is_update = Column(
49
- Boolean,
50
- default=False,
51
- nullable=False,
52
- )
53
- generated_agent_schema = Column(
54
- JSON().with_variant(JSONB(), "postgresql"),
55
- nullable=True,
56
- )
57
- identified_skills = Column(
58
- JSON().with_variant(JSONB(), "postgresql"),
59
- nullable=True,
60
- )
61
- # LLM API response data
62
- llm_model = Column(
63
- String,
64
- nullable=True,
65
- )
66
- total_tokens = Column(
67
- Integer,
68
- default=0,
69
- )
70
- input_tokens = Column(
71
- Integer,
72
- default=0,
73
- )
74
- cached_input_tokens = Column(
75
- Integer,
76
- default=0,
77
- )
78
- output_tokens = Column(
79
- Integer,
80
- default=0,
81
- )
82
- input_tokens_details = Column(
83
- JSON().with_variant(JSONB(), "postgresql"),
84
- nullable=True,
85
- )
86
- completion_tokens_details = Column(
87
- JSON().with_variant(JSONB(), "postgresql"),
88
- nullable=True,
89
- )
90
- # Performance metrics
91
- generation_time_ms = Column(
92
- Integer,
93
- nullable=True,
94
- )
95
- retry_count = Column(
96
- Integer,
97
- default=0,
98
- )
99
- validation_errors = Column(
100
- JSON().with_variant(JSONB(), "postgresql"),
101
- nullable=True,
102
- )
103
- # Status and results
104
- success = Column(
105
- Boolean,
106
- default=False,
107
- nullable=False,
108
- )
109
- error_message = Column(
110
- Text,
111
- nullable=True,
112
- )
113
- # Timestamps
114
- created_at = Column(
115
- DateTime(timezone=True),
116
- nullable=False,
117
- server_default=func.now(),
118
- )
119
- completed_at = Column(
120
- DateTime(timezone=True),
121
- nullable=True,
122
- )
123
-
124
-
125
- class AgentGenerationLogCreate(BaseModel):
126
- """Model for creating agent generation log entries."""
127
-
128
- model_config = ConfigDict(
129
- use_enum_values=True,
130
- from_attributes=True,
131
- )
132
-
133
- id: Annotated[
134
- str,
135
- Field(
136
- default_factory=lambda: str(XID()),
137
- description="Unique identifier for the generation log",
138
- ),
139
- ]
140
- user_id: Optional[str] = Field(
141
- None,
142
- description="User ID who initiated the generation",
143
- )
144
- prompt: str = Field(
145
- ...,
146
- description="The original prompt used for generation",
147
- )
148
- existing_agent_id: Optional[str] = Field(
149
- None,
150
- description="ID of existing agent if this is an update operation",
151
- )
152
- is_update: bool = Field(
153
- False,
154
- description="Whether this is an update to existing agent",
155
- )
156
-
157
-
158
- class AgentGenerationLog(BaseModel):
159
- """Agent generation log model."""
160
-
161
- model_config = ConfigDict(
162
- use_enum_values=True,
163
- from_attributes=True,
164
- )
165
-
166
- id: str
167
- user_id: Optional[str] = None
168
- prompt: str
169
- existing_agent_id: Optional[str] = None
170
- is_update: bool = False
171
- generated_agent_schema: Optional[dict] = None
172
- identified_skills: Optional[dict] = None
173
- llm_model: Optional[str] = None
174
- total_tokens: int = 0
175
- input_tokens: int = 0
176
- cached_input_tokens: int = 0
177
- output_tokens: int = 0
178
- input_tokens_details: Optional[dict] = None
179
- completion_tokens_details: Optional[dict] = None
180
- generation_time_ms: Optional[int] = None
181
- retry_count: int = 0
182
- validation_errors: Optional[dict] = None
183
- success: bool = False
184
- error_message: Optional[str] = None
185
- created_at: datetime
186
- completed_at: Optional[datetime] = None
187
-
188
- @classmethod
189
- async def create(
190
- cls,
191
- session: AsyncSession,
192
- log_data: AgentGenerationLogCreate,
193
- ) -> "AgentGenerationLog":
194
- """Create a new agent generation log entry.
195
-
196
- Args:
197
- session: Database session
198
- log_data: Log data to create
199
-
200
- Returns:
201
- Created log instance
202
- """
203
- # Create database record
204
- log_record = AgentGenerationLogTable(
205
- id=log_data.id,
206
- user_id=log_data.user_id,
207
- prompt=log_data.prompt,
208
- existing_agent_id=log_data.existing_agent_id,
209
- is_update=log_data.is_update,
210
- )
211
-
212
- session.add(log_record)
213
- await session.commit()
214
- await session.refresh(log_record)
215
-
216
- return cls.model_validate(log_record)
217
-
218
- async def update_completion(
219
- self,
220
- session: AsyncSession,
221
- generated_agent_schema: Optional[dict] = None,
222
- identified_skills: Optional[dict] = None,
223
- llm_model: Optional[str] = None,
224
- total_tokens: int = 0,
225
- input_tokens: int = 0,
226
- cached_input_tokens: int = 0,
227
- output_tokens: int = 0,
228
- input_tokens_details: Optional[dict] = None,
229
- completion_tokens_details: Optional[dict] = None,
230
- generation_time_ms: Optional[int] = None,
231
- retry_count: int = 0,
232
- validation_errors: Optional[dict] = None,
233
- success: bool = False,
234
- error_message: Optional[str] = None,
235
- ) -> None:
236
- """Update the log entry with completion data.
237
-
238
- Args:
239
- session: Database session
240
- generated_agent_schema: The generated agent schema
241
- identified_skills: Skills identified during generation
242
- llm_model: LLM model used
243
- total_tokens: Total tokens used
244
- input_tokens: Input tokens used
245
- cached_input_tokens: Cached input tokens used (for cost calculation)
246
- output_tokens: Output tokens used
247
- input_tokens_details: Detailed input token breakdown
248
- completion_tokens_details: Detailed completion token breakdown
249
- generation_time_ms: Generation time in milliseconds
250
- retry_count: Number of retries attempted
251
- validation_errors: Any validation errors encountered
252
- success: Whether generation was successful
253
- error_message: Error message if generation failed
254
- """
255
- # Get the database record
256
- log_record = await session.get(AgentGenerationLogTable, self.id)
257
- if not log_record:
258
- return
259
-
260
- # Update fields
261
- log_record.generated_agent_schema = generated_agent_schema
262
- log_record.identified_skills = identified_skills
263
- log_record.llm_model = llm_model
264
- log_record.total_tokens = total_tokens
265
- log_record.input_tokens = input_tokens
266
- log_record.cached_input_tokens = cached_input_tokens
267
- log_record.output_tokens = output_tokens
268
- log_record.input_tokens_details = input_tokens_details
269
- log_record.completion_tokens_details = completion_tokens_details
270
- log_record.generation_time_ms = generation_time_ms
271
- log_record.retry_count = retry_count
272
- log_record.validation_errors = validation_errors
273
- log_record.success = success
274
- log_record.error_message = error_message
275
- log_record.completed_at = datetime.now(timezone.utc)
276
-
277
- session.add(log_record)
278
- await session.commit()
279
- await session.refresh(log_record)
280
-
281
- # Update this instance
282
- self.generated_agent_schema = log_record.generated_agent_schema
283
- self.identified_skills = log_record.identified_skills
284
- self.llm_model = log_record.llm_model
285
- self.total_tokens = log_record.total_tokens
286
- self.input_tokens = log_record.input_tokens
287
- self.cached_input_tokens = log_record.cached_input_tokens
288
- self.output_tokens = log_record.output_tokens
289
- self.input_tokens_details = log_record.input_tokens_details
290
- self.completion_tokens_details = log_record.completion_tokens_details
291
- self.generation_time_ms = log_record.generation_time_ms
292
- self.retry_count = log_record.retry_count
293
- self.validation_errors = log_record.validation_errors
294
- self.success = log_record.success
295
- self.error_message = log_record.error_message
296
- self.completed_at = log_record.completed_at
297
-
298
- @classmethod
299
- async def get_by_id(
300
- cls,
301
- session: AsyncSession,
302
- log_id: str,
303
- ) -> Optional["AgentGenerationLog"]:
304
- """Get an agent generation log by ID.
305
-
306
- Args:
307
- session: Database session
308
- log_id: Log ID
309
-
310
- Returns:
311
- Log instance if found, None otherwise
312
- """
313
- result = await session.execute(
314
- select(AgentGenerationLogTable).where(AgentGenerationLogTable.id == log_id)
315
- )
316
- log_record = result.scalar_one_or_none()
317
-
318
- if log_record:
319
- return cls.model_validate(log_record)
320
- return None
321
-
322
- @classmethod
323
- async def get_by_user(
324
- cls,
325
- session: AsyncSession,
326
- user_id: str,
327
- limit: int = 50,
328
- ) -> list["AgentGenerationLog"]:
329
- """Get agent generation logs for a user.
330
-
331
- Args:
332
- session: Database session
333
- user_id: User ID
334
- limit: Maximum number of logs to return
335
-
336
- Returns:
337
- List of log instances
338
- """
339
- result = await session.execute(
340
- select(AgentGenerationLogTable)
341
- .where(AgentGenerationLogTable.user_id == user_id)
342
- .order_by(AgentGenerationLogTable.created_at.desc())
343
- .limit(limit)
344
- )
345
- log_records = result.scalars().all()
346
-
347
- return [cls.model_validate(record) for record in log_records]
@@ -1,110 +0,0 @@
1
- from typing import Optional, Type
2
-
3
- from pydantic import BaseModel, Field
4
-
5
- from intentkit.abstracts.skill import SkillStoreABC
6
- from intentkit.clients import get_cdp_client
7
- from intentkit.skills.cdp.base import CDPBaseTool
8
-
9
-
10
- class GetBalanceInput(BaseModel):
11
- """Input for GetBalance tool."""
12
-
13
- asset_id: Optional[str] = Field(
14
- default=None,
15
- 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.",
16
- )
17
-
18
-
19
- class GetBalance(CDPBaseTool):
20
- """Tool for getting balance from CDP wallet.
21
-
22
- This tool uses the CDP API to get balance for all addresses in a wallet for a given asset.
23
-
24
- Attributes:
25
- name: The name of the tool.
26
- description: A description of what the tool does.
27
- args_schema: The schema for the tool's input arguments.
28
- """
29
-
30
- agent_id: str
31
- skill_store: SkillStoreABC
32
-
33
- name: str = "cdp_get_balance"
34
- description: str = (
35
- "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. "
36
- "If no asset_id is provided, it returns all token balances. "
37
- "Always use 'eth' for the native asset ETH and 'usdc' for USDC. "
38
- "Other valid asset IDs are: weth,dai,reth,brett,w,cbeth,axl,iotx,prime,aero,rsr,mog,tbtc,npc,yfi"
39
- )
40
- args_schema: Type[BaseModel] = GetBalanceInput
41
-
42
- async def _arun(self, asset_id: Optional[str] = None) -> str:
43
- """Async implementation of the tool to get balance.
44
-
45
- Args:
46
- asset_id (Optional[str]): The asset ID to get the balance for. If None, returns all token balances.
47
-
48
- Returns:
49
- str: A message containing the balance information or error message.
50
- """
51
- # Get network information from CDP client
52
- cdp_client = await get_cdp_client(self.agent_id, self.skill_store)
53
- provider = await cdp_client.get_wallet_provider()
54
- provider_config = await cdp_client.get_provider_config()
55
- network_id = provider_config.network_id
56
-
57
- # Map network_id to the format expected by the API
58
- network_mapping = {
59
- "base-mainnet": "base",
60
- "ethereum-mainnet": "ethereum",
61
- }
62
- api_network = network_mapping.get(network_id, network_id)
63
-
64
- # For native ETH balance, use the account's balance directly
65
- if asset_id and asset_id.lower() == "eth":
66
- try:
67
- # Get native balance using Web3
68
- balance_wei = provider.get_balance()
69
- balance_eth = balance_wei / (10**18) # Convert from wei to ETH
70
- return f"ETH balance: {balance_eth} ETH"
71
- except Exception as e:
72
- return f"Error getting ETH balance: {e!s}"
73
-
74
- client = provider.get_client()
75
- async with client:
76
- account = await client.evm.get_account(provider.get_address())
77
- # If no asset_id provided, return all token balances
78
- if asset_id is None:
79
- # Get native ETH balance
80
- balance_wei = provider.get_balance()
81
- balance_eth = balance_wei / (10**18) # Convert from wei to ETH
82
-
83
- # Get all token balances
84
- token_balances = await account.list_token_balances(api_network)
85
-
86
- result = [f"ETH balance: {balance_eth} ETH"]
87
-
88
- for balance in token_balances.balances:
89
- result.append(
90
- f"{balance.token.symbol} balance: {balance.amount.decimals} {balance.token.name}"
91
- )
92
-
93
- return f"All balances for account {account.address}:\n" + "\n".join(
94
- result
95
- )
96
-
97
- # For other tokens, try the list_token_balances API
98
- token_balances = await account.list_token_balances(api_network)
99
-
100
- # Find the balance for the specific asset
101
- target_balance = None
102
- for balance in token_balances.balances:
103
- if balance.token.symbol.lower() == asset_id.lower():
104
- target_balance = balance
105
- break
106
-
107
- if target_balance:
108
- return f"Balance for {asset_id} in account {account.address}: {target_balance.amount.decimals} {target_balance.token.name}"
109
- else:
110
- return f"No balance found for asset {asset_id} in account {account.address}"