intentkit 0.7.5.dev3__py3-none-any.whl → 0.8.34.dev7__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.
Files changed (393) hide show
  1. intentkit/MANIFEST.in +14 -0
  2. intentkit/README.md +88 -0
  3. intentkit/__init__.py +6 -4
  4. intentkit/abstracts/agent.py +4 -5
  5. intentkit/abstracts/engine.py +5 -5
  6. intentkit/abstracts/graph.py +15 -8
  7. intentkit/abstracts/skill.py +6 -144
  8. intentkit/abstracts/twitter.py +4 -5
  9. intentkit/clients/__init__.py +9 -2
  10. intentkit/clients/cdp.py +129 -153
  11. intentkit/{utils → clients}/s3.py +109 -34
  12. intentkit/clients/twitter.py +83 -62
  13. intentkit/clients/web3.py +4 -7
  14. intentkit/config/config.py +123 -90
  15. intentkit/core/account_checking.py +802 -0
  16. intentkit/core/agent.py +313 -498
  17. intentkit/core/asset.py +267 -0
  18. intentkit/core/chat.py +5 -3
  19. intentkit/core/client.py +1 -1
  20. intentkit/core/credit.py +49 -41
  21. intentkit/core/draft.py +201 -0
  22. intentkit/core/draft_chat.py +118 -0
  23. intentkit/core/engine.py +378 -287
  24. intentkit/core/manager/__init__.py +25 -0
  25. intentkit/core/manager/engine.py +220 -0
  26. intentkit/core/manager/service.py +172 -0
  27. intentkit/core/manager/skills.py +178 -0
  28. intentkit/core/middleware.py +231 -0
  29. intentkit/core/prompt.py +74 -114
  30. intentkit/core/scheduler.py +143 -0
  31. intentkit/core/statistics.py +168 -0
  32. intentkit/models/agent.py +931 -518
  33. intentkit/models/agent_data.py +165 -106
  34. intentkit/models/agent_schema.json +38 -251
  35. intentkit/models/app_setting.py +15 -13
  36. intentkit/models/chat.py +86 -140
  37. intentkit/models/credit.py +182 -162
  38. intentkit/models/db.py +42 -23
  39. intentkit/models/db_mig.py +120 -3
  40. intentkit/models/draft.py +222 -0
  41. intentkit/models/llm.csv +31 -0
  42. intentkit/models/llm.py +262 -370
  43. intentkit/models/redis.py +6 -4
  44. intentkit/models/skill.py +222 -101
  45. intentkit/models/skills.csv +173 -0
  46. intentkit/models/team.py +189 -0
  47. intentkit/models/user.py +103 -31
  48. intentkit/skills/acolyt/__init__.py +2 -9
  49. intentkit/skills/acolyt/ask.py +3 -4
  50. intentkit/skills/acolyt/base.py +4 -9
  51. intentkit/skills/acolyt/schema.json +4 -3
  52. intentkit/skills/aixbt/__init__.py +2 -13
  53. intentkit/skills/aixbt/base.py +1 -7
  54. intentkit/skills/aixbt/projects.py +14 -15
  55. intentkit/skills/aixbt/schema.json +4 -4
  56. intentkit/skills/allora/__init__.py +2 -9
  57. intentkit/skills/allora/base.py +4 -9
  58. intentkit/skills/allora/price.py +3 -4
  59. intentkit/skills/allora/schema.json +3 -2
  60. intentkit/skills/base.py +241 -41
  61. intentkit/skills/basename/__init__.py +51 -0
  62. intentkit/skills/basename/base.py +11 -0
  63. intentkit/skills/basename/basename.svg +11 -0
  64. intentkit/skills/basename/schema.json +58 -0
  65. intentkit/skills/carv/__init__.py +115 -121
  66. intentkit/skills/carv/base.py +184 -185
  67. intentkit/skills/carv/fetch_news.py +3 -3
  68. intentkit/skills/carv/onchain_query.py +4 -4
  69. intentkit/skills/carv/schema.json +134 -137
  70. intentkit/skills/carv/token_info_and_price.py +6 -6
  71. intentkit/skills/casino/__init__.py +4 -15
  72. intentkit/skills/casino/base.py +1 -7
  73. intentkit/skills/casino/deck_draw.py +5 -8
  74. intentkit/skills/casino/deck_shuffle.py +6 -6
  75. intentkit/skills/casino/dice_roll.py +2 -4
  76. intentkit/skills/casino/schema.json +0 -1
  77. intentkit/skills/cdp/__init__.py +22 -84
  78. intentkit/skills/cdp/base.py +1 -7
  79. intentkit/skills/cdp/schema.json +11 -314
  80. intentkit/skills/chainlist/__init__.py +2 -7
  81. intentkit/skills/chainlist/base.py +1 -7
  82. intentkit/skills/chainlist/chain_lookup.py +18 -18
  83. intentkit/skills/chainlist/schema.json +3 -5
  84. intentkit/skills/common/__init__.py +2 -9
  85. intentkit/skills/common/base.py +1 -7
  86. intentkit/skills/common/current_time.py +1 -2
  87. intentkit/skills/common/schema.json +2 -2
  88. intentkit/skills/cookiefun/__init__.py +6 -9
  89. intentkit/skills/cookiefun/base.py +2 -7
  90. intentkit/skills/cookiefun/get_account_details.py +7 -7
  91. intentkit/skills/cookiefun/get_account_feed.py +19 -19
  92. intentkit/skills/cookiefun/get_account_smart_followers.py +7 -7
  93. intentkit/skills/cookiefun/get_sectors.py +3 -3
  94. intentkit/skills/cookiefun/schema.json +1 -3
  95. intentkit/skills/cookiefun/search_accounts.py +9 -9
  96. intentkit/skills/cryptocompare/__init__.py +7 -24
  97. intentkit/skills/cryptocompare/api.py +2 -3
  98. intentkit/skills/cryptocompare/base.py +10 -24
  99. intentkit/skills/cryptocompare/fetch_news.py +4 -5
  100. intentkit/skills/cryptocompare/fetch_price.py +6 -7
  101. intentkit/skills/cryptocompare/fetch_top_exchanges.py +4 -5
  102. intentkit/skills/cryptocompare/fetch_top_market_cap.py +4 -5
  103. intentkit/skills/cryptocompare/fetch_top_volume.py +4 -5
  104. intentkit/skills/cryptocompare/fetch_trading_signals.py +5 -6
  105. intentkit/skills/cryptocompare/schema.json +3 -3
  106. intentkit/skills/cryptopanic/__init__.py +7 -10
  107. intentkit/skills/cryptopanic/base.py +51 -55
  108. intentkit/skills/cryptopanic/fetch_crypto_news.py +4 -8
  109. intentkit/skills/cryptopanic/fetch_crypto_sentiment.py +5 -7
  110. intentkit/skills/cryptopanic/schema.json +105 -103
  111. intentkit/skills/dapplooker/__init__.py +2 -9
  112. intentkit/skills/dapplooker/base.py +4 -9
  113. intentkit/skills/dapplooker/dapplooker_token_data.py +7 -7
  114. intentkit/skills/dapplooker/schema.json +3 -5
  115. intentkit/skills/defillama/__init__.py +24 -74
  116. intentkit/skills/defillama/api.py +6 -9
  117. intentkit/skills/defillama/base.py +8 -19
  118. intentkit/skills/defillama/coins/fetch_batch_historical_prices.py +8 -10
  119. intentkit/skills/defillama/coins/fetch_block.py +6 -8
  120. intentkit/skills/defillama/coins/fetch_current_prices.py +8 -10
  121. intentkit/skills/defillama/coins/fetch_first_price.py +7 -9
  122. intentkit/skills/defillama/coins/fetch_historical_prices.py +9 -11
  123. intentkit/skills/defillama/coins/fetch_price_chart.py +9 -11
  124. intentkit/skills/defillama/coins/fetch_price_percentage.py +7 -9
  125. intentkit/skills/defillama/config/chains.py +1 -3
  126. intentkit/skills/defillama/fees/fetch_fees_overview.py +24 -26
  127. intentkit/skills/defillama/schema.json +5 -1
  128. intentkit/skills/defillama/stablecoins/fetch_stablecoin_chains.py +16 -18
  129. intentkit/skills/defillama/stablecoins/fetch_stablecoin_charts.py +8 -10
  130. intentkit/skills/defillama/stablecoins/fetch_stablecoin_prices.py +5 -7
  131. intentkit/skills/defillama/stablecoins/fetch_stablecoins.py +7 -9
  132. intentkit/skills/defillama/tests/api_integration.test.py +1 -1
  133. intentkit/skills/defillama/tvl/fetch_chain_historical_tvl.py +4 -6
  134. intentkit/skills/defillama/tvl/fetch_chains.py +9 -11
  135. intentkit/skills/defillama/tvl/fetch_historical_tvl.py +4 -6
  136. intentkit/skills/defillama/tvl/fetch_protocol.py +32 -38
  137. intentkit/skills/defillama/tvl/fetch_protocol_current_tvl.py +3 -5
  138. intentkit/skills/defillama/tvl/fetch_protocols.py +37 -45
  139. intentkit/skills/defillama/volumes/fetch_dex_overview.py +42 -48
  140. intentkit/skills/defillama/volumes/fetch_dex_summary.py +35 -37
  141. intentkit/skills/defillama/volumes/fetch_options_overview.py +24 -28
  142. intentkit/skills/defillama/yields/fetch_pool_chart.py +10 -12
  143. intentkit/skills/defillama/yields/fetch_pools.py +26 -30
  144. intentkit/skills/dexscreener/__init__.py +97 -102
  145. intentkit/skills/dexscreener/base.py +125 -130
  146. intentkit/skills/dexscreener/get_pair_info.py +4 -5
  147. intentkit/skills/dexscreener/get_token_pairs.py +4 -5
  148. intentkit/skills/dexscreener/get_tokens_info.py +7 -8
  149. intentkit/skills/dexscreener/model/search_token_response.py +80 -82
  150. intentkit/skills/dexscreener/schema.json +91 -93
  151. intentkit/skills/dexscreener/search_token.py +182 -184
  152. intentkit/skills/dexscreener/utils.py +15 -14
  153. intentkit/skills/dune_analytics/__init__.py +7 -9
  154. intentkit/skills/dune_analytics/base.py +48 -52
  155. intentkit/skills/dune_analytics/fetch_kol_buys.py +5 -7
  156. intentkit/skills/dune_analytics/fetch_nation_metrics.py +6 -8
  157. intentkit/skills/dune_analytics/schema.json +104 -99
  158. intentkit/skills/elfa/__init__.py +5 -18
  159. intentkit/skills/elfa/base.py +10 -14
  160. intentkit/skills/elfa/mention.py +19 -21
  161. intentkit/skills/elfa/schema.json +3 -2
  162. intentkit/skills/elfa/stats.py +4 -4
  163. intentkit/skills/elfa/tokens.py +12 -12
  164. intentkit/skills/elfa/utils.py +26 -28
  165. intentkit/skills/enso/__init__.py +11 -31
  166. intentkit/skills/enso/base.py +54 -35
  167. intentkit/skills/enso/best_yield.py +16 -24
  168. intentkit/skills/enso/networks.py +6 -11
  169. intentkit/skills/enso/prices.py +11 -13
  170. intentkit/skills/enso/route.py +34 -38
  171. intentkit/skills/enso/schema.json +3 -2
  172. intentkit/skills/enso/tokens.py +29 -38
  173. intentkit/skills/enso/wallet.py +76 -191
  174. intentkit/skills/erc20/__init__.py +50 -0
  175. intentkit/skills/erc20/base.py +11 -0
  176. intentkit/skills/erc20/erc20.svg +5 -0
  177. intentkit/skills/erc20/schema.json +74 -0
  178. intentkit/skills/erc721/__init__.py +53 -0
  179. intentkit/skills/erc721/base.py +11 -0
  180. intentkit/skills/erc721/erc721.svg +5 -0
  181. intentkit/skills/erc721/schema.json +90 -0
  182. intentkit/skills/firecrawl/__init__.py +5 -18
  183. intentkit/skills/firecrawl/base.py +4 -9
  184. intentkit/skills/firecrawl/clear.py +4 -8
  185. intentkit/skills/firecrawl/crawl.py +19 -19
  186. intentkit/skills/firecrawl/query.py +4 -3
  187. intentkit/skills/firecrawl/schema.json +2 -6
  188. intentkit/skills/firecrawl/scrape.py +17 -22
  189. intentkit/skills/firecrawl/utils.py +50 -42
  190. intentkit/skills/github/__init__.py +2 -7
  191. intentkit/skills/github/base.py +1 -7
  192. intentkit/skills/github/github_search.py +1 -2
  193. intentkit/skills/github/schema.json +3 -4
  194. intentkit/skills/heurist/__init__.py +8 -27
  195. intentkit/skills/heurist/base.py +4 -9
  196. intentkit/skills/heurist/image_generation_animagine_xl.py +13 -15
  197. intentkit/skills/heurist/image_generation_arthemy_comics.py +13 -15
  198. intentkit/skills/heurist/image_generation_arthemy_real.py +13 -15
  199. intentkit/skills/heurist/image_generation_braindance.py +13 -15
  200. intentkit/skills/heurist/image_generation_cyber_realistic_xl.py +13 -15
  201. intentkit/skills/heurist/image_generation_flux_1_dev.py +13 -15
  202. intentkit/skills/heurist/image_generation_sdxl.py +13 -15
  203. intentkit/skills/heurist/schema.json +2 -2
  204. intentkit/skills/http/__init__.py +4 -15
  205. intentkit/skills/http/base.py +1 -7
  206. intentkit/skills/http/get.py +21 -16
  207. intentkit/skills/http/post.py +23 -18
  208. intentkit/skills/http/put.py +23 -18
  209. intentkit/skills/http/schema.json +4 -5
  210. intentkit/skills/lifi/__init__.py +8 -13
  211. intentkit/skills/lifi/base.py +3 -9
  212. intentkit/skills/lifi/schema.json +17 -8
  213. intentkit/skills/lifi/token_execute.py +150 -60
  214. intentkit/skills/lifi/token_quote.py +8 -10
  215. intentkit/skills/lifi/utils.py +104 -51
  216. intentkit/skills/moralis/__init__.py +6 -10
  217. intentkit/skills/moralis/api.py +6 -7
  218. intentkit/skills/moralis/base.py +5 -10
  219. intentkit/skills/moralis/fetch_chain_portfolio.py +10 -11
  220. intentkit/skills/moralis/fetch_nft_portfolio.py +22 -22
  221. intentkit/skills/moralis/fetch_solana_portfolio.py +11 -12
  222. intentkit/skills/moralis/fetch_wallet_portfolio.py +8 -9
  223. intentkit/skills/moralis/schema.json +7 -2
  224. intentkit/skills/morpho/__init__.py +52 -0
  225. intentkit/skills/morpho/base.py +11 -0
  226. intentkit/skills/morpho/morpho.svg +12 -0
  227. intentkit/skills/morpho/schema.json +73 -0
  228. intentkit/skills/nation/__init__.py +4 -9
  229. intentkit/skills/nation/base.py +5 -10
  230. intentkit/skills/nation/nft_check.py +3 -4
  231. intentkit/skills/nation/schema.json +4 -3
  232. intentkit/skills/onchain.py +30 -0
  233. intentkit/skills/openai/__init__.py +17 -18
  234. intentkit/skills/openai/base.py +10 -14
  235. intentkit/skills/openai/dalle_image_generation.py +4 -9
  236. intentkit/skills/openai/gpt_avatar_generator.py +102 -0
  237. intentkit/skills/openai/gpt_image_generation.py +5 -9
  238. intentkit/skills/openai/gpt_image_mini_generator.py +92 -0
  239. intentkit/skills/openai/gpt_image_to_image.py +5 -9
  240. intentkit/skills/openai/image_to_text.py +3 -7
  241. intentkit/skills/openai/schema.json +34 -3
  242. intentkit/skills/portfolio/__init__.py +11 -35
  243. intentkit/skills/portfolio/base.py +33 -19
  244. intentkit/skills/portfolio/schema.json +3 -5
  245. intentkit/skills/portfolio/token_balances.py +21 -21
  246. intentkit/skills/portfolio/wallet_approvals.py +17 -18
  247. intentkit/skills/portfolio/wallet_defi_positions.py +3 -3
  248. intentkit/skills/portfolio/wallet_history.py +31 -31
  249. intentkit/skills/portfolio/wallet_net_worth.py +13 -13
  250. intentkit/skills/portfolio/wallet_nfts.py +19 -19
  251. intentkit/skills/portfolio/wallet_profitability.py +18 -18
  252. intentkit/skills/portfolio/wallet_profitability_summary.py +5 -5
  253. intentkit/skills/portfolio/wallet_stats.py +3 -3
  254. intentkit/skills/portfolio/wallet_swaps.py +19 -19
  255. intentkit/skills/pyth/__init__.py +50 -0
  256. intentkit/skills/pyth/base.py +11 -0
  257. intentkit/skills/pyth/pyth.svg +6 -0
  258. intentkit/skills/pyth/schema.json +75 -0
  259. intentkit/skills/skills.toml +36 -0
  260. intentkit/skills/slack/__init__.py +5 -17
  261. intentkit/skills/slack/base.py +3 -9
  262. intentkit/skills/slack/get_channel.py +8 -8
  263. intentkit/skills/slack/get_message.py +9 -9
  264. intentkit/skills/slack/schedule_message.py +5 -5
  265. intentkit/skills/slack/schema.json +2 -2
  266. intentkit/skills/slack/send_message.py +3 -5
  267. intentkit/skills/supabase/__init__.py +7 -23
  268. intentkit/skills/supabase/base.py +1 -7
  269. intentkit/skills/supabase/delete_data.py +4 -4
  270. intentkit/skills/supabase/fetch_data.py +12 -12
  271. intentkit/skills/supabase/insert_data.py +4 -4
  272. intentkit/skills/supabase/invoke_function.py +6 -6
  273. intentkit/skills/supabase/schema.json +2 -3
  274. intentkit/skills/supabase/update_data.py +6 -6
  275. intentkit/skills/supabase/upsert_data.py +4 -4
  276. intentkit/skills/superfluid/__init__.py +53 -0
  277. intentkit/skills/superfluid/base.py +11 -0
  278. intentkit/skills/superfluid/schema.json +89 -0
  279. intentkit/skills/superfluid/superfluid.svg +6 -0
  280. intentkit/skills/system/__init__.py +7 -24
  281. intentkit/skills/system/add_autonomous_task.py +10 -12
  282. intentkit/skills/system/delete_autonomous_task.py +2 -2
  283. intentkit/skills/system/edit_autonomous_task.py +14 -18
  284. intentkit/skills/system/list_autonomous_tasks.py +3 -5
  285. intentkit/skills/system/read_agent_api_key.py +6 -4
  286. intentkit/skills/system/regenerate_agent_api_key.py +6 -4
  287. intentkit/skills/system/schema.json +6 -8
  288. intentkit/skills/tavily/__init__.py +3 -12
  289. intentkit/skills/tavily/base.py +4 -9
  290. intentkit/skills/tavily/schema.json +3 -5
  291. intentkit/skills/tavily/tavily_extract.py +2 -4
  292. intentkit/skills/tavily/tavily_search.py +4 -6
  293. intentkit/skills/token/__init__.py +5 -10
  294. intentkit/skills/token/base.py +7 -11
  295. intentkit/skills/token/erc20_transfers.py +19 -19
  296. intentkit/skills/token/schema.json +3 -6
  297. intentkit/skills/token/token_analytics.py +3 -3
  298. intentkit/skills/token/token_price.py +13 -13
  299. intentkit/skills/token/token_search.py +9 -9
  300. intentkit/skills/twitter/__init__.py +11 -35
  301. intentkit/skills/twitter/base.py +22 -34
  302. intentkit/skills/twitter/follow_user.py +2 -6
  303. intentkit/skills/twitter/get_mentions.py +5 -12
  304. intentkit/skills/twitter/get_timeline.py +4 -12
  305. intentkit/skills/twitter/get_user_by_username.py +2 -6
  306. intentkit/skills/twitter/get_user_tweets.py +5 -13
  307. intentkit/skills/twitter/like_tweet.py +2 -6
  308. intentkit/skills/twitter/post_tweet.py +6 -9
  309. intentkit/skills/twitter/reply_tweet.py +6 -9
  310. intentkit/skills/twitter/retweet.py +2 -6
  311. intentkit/skills/twitter/schema.json +1 -0
  312. intentkit/skills/twitter/search_tweets.py +4 -12
  313. intentkit/skills/unrealspeech/__init__.py +2 -7
  314. intentkit/skills/unrealspeech/base.py +2 -8
  315. intentkit/skills/unrealspeech/schema.json +2 -5
  316. intentkit/skills/unrealspeech/text_to_speech.py +8 -8
  317. intentkit/skills/venice_audio/__init__.py +98 -106
  318. intentkit/skills/venice_audio/base.py +117 -121
  319. intentkit/skills/venice_audio/input.py +41 -41
  320. intentkit/skills/venice_audio/schema.json +151 -152
  321. intentkit/skills/venice_audio/venice_audio.py +38 -21
  322. intentkit/skills/venice_image/__init__.py +147 -154
  323. intentkit/skills/venice_image/api.py +138 -138
  324. intentkit/skills/venice_image/base.py +185 -192
  325. intentkit/skills/venice_image/config.py +33 -35
  326. intentkit/skills/venice_image/image_enhance/image_enhance.py +2 -3
  327. intentkit/skills/venice_image/image_enhance/image_enhance_base.py +21 -23
  328. intentkit/skills/venice_image/image_enhance/image_enhance_input.py +38 -40
  329. intentkit/skills/venice_image/image_generation/image_generation_base.py +11 -10
  330. intentkit/skills/venice_image/image_generation/image_generation_fluently_xl.py +26 -26
  331. intentkit/skills/venice_image/image_generation/image_generation_flux_dev.py +27 -27
  332. intentkit/skills/venice_image/image_generation/image_generation_flux_dev_uncensored.py +26 -26
  333. intentkit/skills/venice_image/image_generation/image_generation_input.py +158 -158
  334. intentkit/skills/venice_image/image_generation/image_generation_lustify_sdxl.py +26 -26
  335. intentkit/skills/venice_image/image_generation/image_generation_pony_realism.py +26 -26
  336. intentkit/skills/venice_image/image_generation/image_generation_stable_diffusion_3_5.py +28 -28
  337. intentkit/skills/venice_image/image_generation/image_generation_venice_sd35.py +28 -28
  338. intentkit/skills/venice_image/image_upscale/image_upscale.py +3 -3
  339. intentkit/skills/venice_image/image_upscale/image_upscale_base.py +21 -23
  340. intentkit/skills/venice_image/image_upscale/image_upscale_input.py +22 -22
  341. intentkit/skills/venice_image/image_vision/image_vision.py +2 -2
  342. intentkit/skills/venice_image/image_vision/image_vision_base.py +17 -17
  343. intentkit/skills/venice_image/image_vision/image_vision_input.py +9 -9
  344. intentkit/skills/venice_image/schema.json +267 -267
  345. intentkit/skills/venice_image/utils.py +77 -78
  346. intentkit/skills/web_scraper/__init__.py +5 -18
  347. intentkit/skills/web_scraper/base.py +21 -7
  348. intentkit/skills/web_scraper/document_indexer.py +7 -6
  349. intentkit/skills/web_scraper/schema.json +2 -6
  350. intentkit/skills/web_scraper/scrape_and_index.py +15 -15
  351. intentkit/skills/web_scraper/utils.py +62 -63
  352. intentkit/skills/web_scraper/website_indexer.py +17 -19
  353. intentkit/skills/weth/__init__.py +49 -0
  354. intentkit/skills/weth/base.py +11 -0
  355. intentkit/skills/weth/schema.json +58 -0
  356. intentkit/skills/weth/weth.svg +6 -0
  357. intentkit/skills/wow/__init__.py +51 -0
  358. intentkit/skills/wow/base.py +11 -0
  359. intentkit/skills/wow/schema.json +89 -0
  360. intentkit/skills/wow/wow.svg +7 -0
  361. intentkit/skills/x402/__init__.py +58 -0
  362. intentkit/skills/x402/base.py +99 -0
  363. intentkit/skills/x402/http_request.py +117 -0
  364. intentkit/skills/x402/schema.json +40 -0
  365. intentkit/skills/x402/x402.webp +0 -0
  366. intentkit/skills/xmtp/__init__.py +4 -15
  367. intentkit/skills/xmtp/base.py +5 -5
  368. intentkit/skills/xmtp/price.py +7 -6
  369. intentkit/skills/xmtp/schema.json +69 -71
  370. intentkit/skills/xmtp/swap.py +6 -8
  371. intentkit/skills/xmtp/transfer.py +4 -6
  372. intentkit/utils/__init__.py +4 -0
  373. intentkit/utils/chain.py +198 -96
  374. intentkit/utils/ens.py +135 -0
  375. intentkit/utils/error.py +5 -2
  376. intentkit/utils/logging.py +9 -11
  377. intentkit/utils/schema.py +100 -0
  378. intentkit/utils/slack_alert.py +8 -8
  379. intentkit/utils/tx.py +16 -8
  380. intentkit/uv.lock +3377 -0
  381. {intentkit-0.7.5.dev3.dist-info → intentkit-0.8.34.dev7.dist-info}/METADATA +13 -15
  382. intentkit-0.8.34.dev7.dist-info/RECORD +478 -0
  383. intentkit-0.8.34.dev7.dist-info/licenses/LICENSE +21 -0
  384. intentkit/core/node.py +0 -215
  385. intentkit/models/conversation.py +0 -286
  386. intentkit/models/generator.py +0 -347
  387. intentkit/skills/cdp/get_balance.py +0 -110
  388. intentkit/skills/cdp/swap.py +0 -121
  389. intentkit/skills/moralis/tests/__init__.py +0 -0
  390. intentkit/skills/moralis/tests/test_wallet.py +0 -511
  391. intentkit-0.7.5.dev3.dist-info/RECORD +0 -424
  392. {intentkit-0.7.5.dev3.dist-info/licenses → intentkit}/LICENSE +0 -0
  393. {intentkit-0.7.5.dev3.dist-info → intentkit-0.8.34.dev7.dist-info}/WHEEL +0 -0
@@ -1,12 +1,12 @@
1
1
  import logging
2
- from typing import Optional, Type
3
2
 
4
3
  import httpx
5
4
  from epyxid import XID
6
5
  from pydantic import BaseModel, Field
7
6
 
7
+ from intentkit.clients.s3 import store_image
8
+ from intentkit.config.config import config
8
9
  from intentkit.skills.heurist.base import HeuristBaseTool
9
- from intentkit.utils.s3 import store_image
10
10
 
11
11
  logger = logging.getLogger(__name__)
12
12
 
@@ -17,16 +17,16 @@ class ImageGenerationArthemyRealInput(BaseModel):
17
17
  prompt: str = Field(
18
18
  description="Text prompt describing the image to generate.",
19
19
  )
20
- neg_prompt: Optional[str] = Field(
20
+ neg_prompt: str | None = Field(
21
21
  default="(worst quality: 1.4), bad quality, nsfw",
22
22
  description="Negative prompt describing what to avoid in the generated image.",
23
23
  )
24
- width: Optional[int] = Field(
24
+ width: int | None = Field(
25
25
  default=1024,
26
26
  le=1024,
27
27
  description="Width of the generated image.",
28
28
  )
29
- height: Optional[int] = Field(
29
+ height: int | None = Field(
30
30
  default=1024,
31
31
  le=1024,
32
32
  description="Height of the generated image.",
@@ -52,14 +52,14 @@ class ImageGenerationArthemyReal(HeuristBaseTool):
52
52
  "ArthemyReal specializes in creating photorealistic, lifelike images with fine details.\n"
53
53
  "If you have height and width, remember to specify them.\n"
54
54
  )
55
- args_schema: Type[BaseModel] = ImageGenerationArthemyRealInput
55
+ args_schema: type[BaseModel] = ImageGenerationArthemyRealInput
56
56
 
57
57
  async def _arun(
58
58
  self,
59
59
  prompt: str,
60
- neg_prompt: Optional[str] = "(worst quality: 1.4), bad quality, nsfw",
61
- width: Optional[int] = 1024,
62
- height: Optional[int] = 680,
60
+ neg_prompt: str | None = "(worst quality: 1.4), bad quality, nsfw",
61
+ width: int | None = 1024,
62
+ height: int | None = 680,
63
63
  **kwargs,
64
64
  ) -> str:
65
65
  """Implementation of the tool to generate realistic images using Heurist AI's ArthemyReal model.
@@ -76,22 +76,20 @@ class ImageGenerationArthemyReal(HeuristBaseTool):
76
76
  """
77
77
  context = self.get_context()
78
78
  skill_config = context.agent.skill_config(self.category)
79
- skill_config = skill_config
80
79
 
81
- # Get the Heurist API key from the skill store
80
+ # Get the Heurist API key from configuration
82
81
  if "api_key" in skill_config and skill_config["api_key"]:
83
82
  api_key = skill_config["api_key"]
84
83
  if skill_config.get("rate_limit_number") and skill_config.get(
85
84
  "rate_limit_minutes"
86
85
  ):
87
86
  await self.user_rate_limit_by_category(
88
- context.user_id,
89
87
  skill_config["rate_limit_number"],
90
- skill_config["rate_limit_minutes"],
88
+ skill_config["rate_limit_minutes"] * 60,
91
89
  )
92
90
  else:
93
- api_key = self.skill_store.get_system_config("heurist_api_key")
94
- await self.user_rate_limit_by_category(context.user_id, 10, 1440)
91
+ api_key = config.heurist_api_key
92
+ await self.user_rate_limit_by_category(10, 1440 * 60)
95
93
 
96
94
  # Generate a unique job ID
97
95
  job_id = str(XID())
@@ -1,12 +1,12 @@
1
1
  import logging
2
- from typing import Optional, Type
3
2
 
4
3
  import httpx
5
4
  from epyxid import XID
6
5
  from pydantic import BaseModel, Field
7
6
 
7
+ from intentkit.clients.s3 import store_image
8
+ from intentkit.config.config import config
8
9
  from intentkit.skills.heurist.base import HeuristBaseTool
9
- from intentkit.utils.s3 import store_image
10
10
 
11
11
  logger = logging.getLogger(__name__)
12
12
 
@@ -17,16 +17,16 @@ class ImageGenerationBrainDanceInput(BaseModel):
17
17
  prompt: str = Field(
18
18
  description="Text prompt describing the image to generate.",
19
19
  )
20
- neg_prompt: Optional[str] = Field(
20
+ neg_prompt: str | None = Field(
21
21
  default="(worst quality: 1.4), bad quality, nsfw",
22
22
  description="Negative prompt describing what to avoid in the generated image.",
23
23
  )
24
- width: Optional[int] = Field(
24
+ width: int | None = Field(
25
25
  default=1024,
26
26
  le=1024,
27
27
  description="Width of the generated image.",
28
28
  )
29
- height: Optional[int] = Field(
29
+ height: int | None = Field(
30
30
  default=1024,
31
31
  le=1024,
32
32
  description="Height of the generated image.",
@@ -52,14 +52,14 @@ class ImageGenerationBrainDance(HeuristBaseTool):
52
52
  "BrainDance specializes in creating unique, artistic interpretations with creative flair.\n"
53
53
  "If you have height and width, remember to specify them.\n"
54
54
  )
55
- args_schema: Type[BaseModel] = ImageGenerationBrainDanceInput
55
+ args_schema: type[BaseModel] = ImageGenerationBrainDanceInput
56
56
 
57
57
  async def _arun(
58
58
  self,
59
59
  prompt: str,
60
- neg_prompt: Optional[str] = "(worst quality: 1.4), bad quality, nsfw",
61
- width: Optional[int] = 1024,
62
- height: Optional[int] = 680,
60
+ neg_prompt: str | None = "(worst quality: 1.4), bad quality, nsfw",
61
+ width: int | None = 1024,
62
+ height: int | None = 680,
63
63
  **kwargs,
64
64
  ) -> str:
65
65
  """Implementation of the tool to generate artistic images using Heurist AI's BrainDance model.
@@ -76,22 +76,20 @@ class ImageGenerationBrainDance(HeuristBaseTool):
76
76
  """
77
77
  context = self.get_context()
78
78
  skill_config = context.agent.skill_config(self.category)
79
- skill_config = skill_config
80
79
 
81
- # Get the Heurist API key from the skill store
80
+ # Get the Heurist API key from configuration
82
81
  if "api_key" in skill_config and skill_config["api_key"]:
83
82
  api_key = skill_config["api_key"]
84
83
  if skill_config.get("rate_limit_number") and skill_config.get(
85
84
  "rate_limit_minutes"
86
85
  ):
87
86
  await self.user_rate_limit_by_category(
88
- context.user_id,
89
87
  skill_config["rate_limit_number"],
90
- skill_config["rate_limit_minutes"],
88
+ skill_config["rate_limit_minutes"] * 60,
91
89
  )
92
90
  else:
93
- api_key = self.skill_store.get_system_config("heurist_api_key")
94
- await self.user_rate_limit_by_category(context.user_id, 10, 1440)
91
+ api_key = config.heurist_api_key
92
+ await self.user_rate_limit_by_category(10, 1440 * 60)
95
93
 
96
94
  # Generate a unique job ID
97
95
  job_id = str(XID())
@@ -1,12 +1,12 @@
1
1
  import logging
2
- from typing import Optional, Type
3
2
 
4
3
  import httpx
5
4
  from epyxid import XID
6
5
  from pydantic import BaseModel, Field
7
6
 
7
+ from intentkit.clients.s3 import store_image
8
+ from intentkit.config.config import config
8
9
  from intentkit.skills.heurist.base import HeuristBaseTool
9
- from intentkit.utils.s3 import store_image
10
10
 
11
11
  logger = logging.getLogger(__name__)
12
12
 
@@ -17,16 +17,16 @@ class ImageGenerationCyberRealisticXLInput(BaseModel):
17
17
  prompt: str = Field(
18
18
  description="Text prompt describing the image to generate.",
19
19
  )
20
- neg_prompt: Optional[str] = Field(
20
+ neg_prompt: str | None = Field(
21
21
  default="(worst quality: 1.4), bad quality, nsfw",
22
22
  description="Negative prompt describing what to avoid in the generated image.",
23
23
  )
24
- width: Optional[int] = Field(
24
+ width: int | None = Field(
25
25
  default=1024,
26
26
  le=1024,
27
27
  description="Width of the generated image.",
28
28
  )
29
- height: Optional[int] = Field(
29
+ height: int | None = Field(
30
30
  default=680,
31
31
  le=1024,
32
32
  description="Height of the generated image.",
@@ -52,14 +52,14 @@ class ImageGenerationCyberRealisticXL(HeuristBaseTool):
52
52
  "CyberRealisticXL specializes in creating high-quality hyperrealistic photographs with a cyberpunk aesthetic.\n"
53
53
  "If you have height and width, remember to specify them.\n"
54
54
  )
55
- args_schema: Type[BaseModel] = ImageGenerationCyberRealisticXLInput
55
+ args_schema: type[BaseModel] = ImageGenerationCyberRealisticXLInput
56
56
 
57
57
  async def _arun(
58
58
  self,
59
59
  prompt: str,
60
- neg_prompt: Optional[str] = "(worst quality: 1.4), bad quality, nsfw",
61
- width: Optional[int] = 1024,
62
- height: Optional[int] = 680,
60
+ neg_prompt: str | None = "(worst quality: 1.4), bad quality, nsfw",
61
+ width: int | None = 1024,
62
+ height: int | None = 680,
63
63
  **kwargs,
64
64
  ) -> str:
65
65
  """Implementation of the tool to generate hyperrealistic cyberpunk images using Heurist AI's CyberRealisticXL model.
@@ -76,22 +76,20 @@ class ImageGenerationCyberRealisticXL(HeuristBaseTool):
76
76
  """
77
77
  context = self.get_context()
78
78
  skill_config = context.agent.skill_config(self.category)
79
- skill_config = skill_config
80
79
 
81
- # Get the Heurist API key from the skill store
80
+ # Get the Heurist API key from configuration
82
81
  if "api_key" in skill_config and skill_config["api_key"]:
83
82
  api_key = skill_config["api_key"]
84
83
  if skill_config.get("rate_limit_number") and skill_config.get(
85
84
  "rate_limit_minutes"
86
85
  ):
87
86
  await self.user_rate_limit_by_category(
88
- context.user_id,
89
87
  skill_config["rate_limit_number"],
90
- skill_config["rate_limit_minutes"],
88
+ skill_config["rate_limit_minutes"] * 60,
91
89
  )
92
90
  else:
93
- api_key = self.skill_store.get_system_config("heurist_api_key")
94
- await self.user_rate_limit_by_category(context.user_id, 10, 1440)
91
+ api_key = config.heurist_api_key
92
+ await self.user_rate_limit_by_category(10, 1440 * 60)
95
93
 
96
94
  # Generate a unique job ID
97
95
  job_id = str(XID())
@@ -1,12 +1,12 @@
1
1
  import logging
2
- from typing import Optional, Type
3
2
 
4
3
  import httpx
5
4
  from epyxid import XID
6
5
  from pydantic import BaseModel, Field
7
6
 
7
+ from intentkit.clients.s3 import store_image
8
+ from intentkit.config.config import config
8
9
  from intentkit.skills.heurist.base import HeuristBaseTool
9
- from intentkit.utils.s3 import store_image
10
10
 
11
11
  logger = logging.getLogger(__name__)
12
12
 
@@ -17,16 +17,16 @@ class ImageGenerationFlux1DevInput(BaseModel):
17
17
  prompt: str = Field(
18
18
  description="Text prompt describing the image to generate.",
19
19
  )
20
- neg_prompt: Optional[str] = Field(
20
+ neg_prompt: str | None = Field(
21
21
  default="",
22
22
  description="Negative prompt describing what to avoid in the generated image.",
23
23
  )
24
- width: Optional[int] = Field(
24
+ width: int | None = Field(
25
25
  default=1024,
26
26
  le=2048,
27
27
  description="Width of the generated image.",
28
28
  )
29
- height: Optional[int] = Field(
29
+ height: int | None = Field(
30
30
  default=1024,
31
31
  le=2048,
32
32
  description="Height of the generated image.",
@@ -52,14 +52,14 @@ class ImageGenerationFlux1Dev(HeuristBaseTool):
52
52
  "Flux.1-dev is a versatile, general-purpose model capable of generating images in any style.\n"
53
53
  "If you have height and width, remember to specify them.\n"
54
54
  )
55
- args_schema: Type[BaseModel] = ImageGenerationFlux1DevInput
55
+ args_schema: type[BaseModel] = ImageGenerationFlux1DevInput
56
56
 
57
57
  async def _arun(
58
58
  self,
59
59
  prompt: str,
60
- neg_prompt: Optional[str] = "",
61
- width: Optional[int] = 1024,
62
- height: Optional[int] = 680,
60
+ neg_prompt: str | None = "",
61
+ width: int | None = 1024,
62
+ height: int | None = 680,
63
63
  **kwargs,
64
64
  ) -> str:
65
65
  """Implementation of the tool to generate images using Heurist AI's Flux.1-dev model.
@@ -76,22 +76,20 @@ class ImageGenerationFlux1Dev(HeuristBaseTool):
76
76
  """
77
77
  context = self.get_context()
78
78
  skill_config = context.agent.skill_config(self.category)
79
- skill_config = skill_config
80
79
 
81
- # Get the Heurist API key from the skill store
80
+ # Get the Heurist API key from configuration
82
81
  if "api_key" in skill_config and skill_config["api_key"]:
83
82
  api_key = skill_config["api_key"]
84
83
  if skill_config.get("rate_limit_number") and skill_config.get(
85
84
  "rate_limit_minutes"
86
85
  ):
87
86
  await self.user_rate_limit_by_category(
88
- context.user_id,
89
87
  skill_config["rate_limit_number"],
90
- skill_config["rate_limit_minutes"],
88
+ skill_config["rate_limit_minutes"] * 60,
91
89
  )
92
90
  else:
93
- api_key = self.skill_store.get_system_config("heurist_api_key")
94
- await self.user_rate_limit_by_category(context.user_id, 10, 1440)
91
+ api_key = config.heurist_api_key
92
+ await self.user_rate_limit_by_category(10, 1440 * 60)
95
93
 
96
94
  # Generate a unique job ID
97
95
  job_id = str(XID())
@@ -1,12 +1,12 @@
1
1
  import logging
2
- from typing import Optional, Type
3
2
 
4
3
  import httpx
5
4
  from epyxid import XID
6
5
  from pydantic import BaseModel, Field
7
6
 
7
+ from intentkit.clients.s3 import store_image
8
+ from intentkit.config.config import config
8
9
  from intentkit.skills.heurist.base import HeuristBaseTool
9
- from intentkit.utils.s3 import store_image
10
10
 
11
11
  logger = logging.getLogger(__name__)
12
12
 
@@ -17,16 +17,16 @@ class ImageGenerationSDXLInput(BaseModel):
17
17
  prompt: str = Field(
18
18
  description="Text prompt describing the image to generate.",
19
19
  )
20
- neg_prompt: Optional[str] = Field(
20
+ neg_prompt: str | None = Field(
21
21
  default="(worst quality: 1.4), bad quality, nsfw",
22
22
  description="Negative prompt describing what to avoid in the generated image.",
23
23
  )
24
- width: Optional[int] = Field(
24
+ width: int | None = Field(
25
25
  default=1024,
26
26
  le=1024,
27
27
  description="Width of the generated image.",
28
28
  )
29
- height: Optional[int] = Field(
29
+ height: int | None = Field(
30
30
  default=1024,
31
31
  le=1024,
32
32
  description="Height of the generated image.",
@@ -52,14 +52,14 @@ class ImageGenerationSDXL(HeuristBaseTool):
52
52
  "SDXL is a versatile, general-purpose model capable of generating high-quality images in any style.\n"
53
53
  "If you have height and width, remember to specify them.\n"
54
54
  )
55
- args_schema: Type[BaseModel] = ImageGenerationSDXLInput
55
+ args_schema: type[BaseModel] = ImageGenerationSDXLInput
56
56
 
57
57
  async def _arun(
58
58
  self,
59
59
  prompt: str,
60
- neg_prompt: Optional[str] = "(worst quality: 1.4), bad quality, nsfw",
61
- width: Optional[int] = 1024,
62
- height: Optional[int] = 680,
60
+ neg_prompt: str | None = "(worst quality: 1.4), bad quality, nsfw",
61
+ width: int | None = 1024,
62
+ height: int | None = 680,
63
63
  **kwargs,
64
64
  ) -> str:
65
65
  """Implementation of the tool to generate images using Heurist AI's SDXL model.
@@ -76,22 +76,20 @@ class ImageGenerationSDXL(HeuristBaseTool):
76
76
  """
77
77
  context = self.get_context()
78
78
  skill_config = context.agent.skill_config(self.category)
79
- skill_config = skill_config
80
79
 
81
- # Get the Heurist API key from the skill store
80
+ # Get the Heurist API key from configuration
82
81
  if "api_key" in skill_config and skill_config["api_key"]:
83
82
  api_key = skill_config["api_key"]
84
83
  if skill_config.get("rate_limit_number") and skill_config.get(
85
84
  "rate_limit_minutes"
86
85
  ):
87
86
  await self.user_rate_limit_by_category(
88
- context.user_id,
89
87
  skill_config["rate_limit_number"],
90
- skill_config["rate_limit_minutes"],
88
+ skill_config["rate_limit_minutes"] * 60,
91
89
  )
92
90
  else:
93
- api_key = self.skill_store.get_system_config("heurist_api_key")
94
- await self.user_rate_limit_by_category(context.user_id, 10, 1440)
91
+ api_key = config.heurist_api_key
92
+ await self.user_rate_limit_by_category(10, 1440 * 60)
95
93
 
96
94
  # Generate a unique job ID
97
95
  job_id = str(XID())
@@ -6,7 +6,7 @@
6
6
  "x-icon": "https://ai.service.crestal.dev/skills/heurist/heurist.png",
7
7
  "x-tags": [
8
8
  "AI",
9
- "Image Generation"
9
+ "Image"
10
10
  ],
11
11
  "properties": {
12
12
  "enabled": {
@@ -193,4 +193,4 @@
193
193
  }
194
194
  },
195
195
  "additionalProperties": true
196
- }
196
+ }
@@ -3,7 +3,6 @@
3
3
  import logging
4
4
  from typing import TypedDict
5
5
 
6
- from intentkit.abstracts.skill import SkillStoreABC
7
6
  from intentkit.skills.base import SkillConfig, SkillState
8
7
  from intentkit.skills.http.base import HttpBaseTool
9
8
  from intentkit.skills.http.get import HttpGet
@@ -33,7 +32,6 @@ class Config(SkillConfig):
33
32
  async def get_skills(
34
33
  config: "Config",
35
34
  is_private: bool,
36
- store: SkillStoreABC,
37
35
  **_,
38
36
  ) -> list[HttpBaseTool]:
39
37
  """Get all HTTP client skills.
@@ -41,7 +39,6 @@ async def get_skills(
41
39
  Args:
42
40
  config: The configuration for HTTP client skills.
43
41
  is_private: Whether to include private skills.
44
- store: The skill store for persisting data.
45
42
 
46
43
  Returns:
47
44
  A list of HTTP client skills.
@@ -58,7 +55,7 @@ async def get_skills(
58
55
  # Get each skill using the cached getter
59
56
  result = []
60
57
  for name in available_skills:
61
- skill = get_http_skill(name, store)
58
+ skill = get_http_skill(name)
62
59
  if skill:
63
60
  result.append(skill)
64
61
  return result
@@ -66,34 +63,26 @@ async def get_skills(
66
63
 
67
64
  def get_http_skill(
68
65
  name: str,
69
- store: SkillStoreABC,
70
66
  ) -> HttpBaseTool:
71
67
  """Get an HTTP client skill by name.
72
68
 
73
69
  Args:
74
70
  name: The name of the skill to get
75
- store: The skill store for persisting data
76
71
 
77
72
  Returns:
78
73
  The requested HTTP client skill
79
74
  """
80
75
  if name == "http_get":
81
76
  if name not in _cache:
82
- _cache[name] = HttpGet(
83
- skill_store=store,
84
- )
77
+ _cache[name] = HttpGet()
85
78
  return _cache[name]
86
79
  elif name == "http_post":
87
80
  if name not in _cache:
88
- _cache[name] = HttpPost(
89
- skill_store=store,
90
- )
81
+ _cache[name] = HttpPost()
91
82
  return _cache[name]
92
83
  elif name == "http_put":
93
84
  if name not in _cache:
94
- _cache[name] = HttpPut(
95
- skill_store=store,
96
- )
85
+ _cache[name] = HttpPut()
97
86
  return _cache[name]
98
87
  else:
99
88
  logger.warning(f"Unknown HTTP skill: {name}")
@@ -1,8 +1,5 @@
1
- from typing import Type
2
-
3
1
  from pydantic import BaseModel, Field
4
2
 
5
- from intentkit.abstracts.skill import SkillStoreABC
6
3
  from intentkit.skills.base import IntentKitSkill
7
4
 
8
5
 
@@ -11,10 +8,7 @@ class HttpBaseTool(IntentKitSkill):
11
8
 
12
9
  name: str = Field(description="The name of the tool")
13
10
  description: str = Field(description="A description of what the tool does")
14
- args_schema: Type[BaseModel]
15
- skill_store: SkillStoreABC = Field(
16
- description="The skill store for persisting data"
17
- )
11
+ args_schema: type[BaseModel]
18
12
 
19
13
  @property
20
14
  def category(self) -> str:
@@ -1,7 +1,8 @@
1
1
  import logging
2
- from typing import Any, Dict, Optional, Type
2
+ from typing import Any
3
3
 
4
4
  import httpx
5
+ from langchain_core.tools import ToolException
5
6
  from pydantic import BaseModel, Field
6
7
 
7
8
  from intentkit.skills.http.base import HttpBaseTool
@@ -13,15 +14,15 @@ class HttpGetInput(BaseModel):
13
14
  """Input for HTTP GET request."""
14
15
 
15
16
  url: str = Field(description="The URL to send the GET request to")
16
- headers: Optional[Dict[str, str]] = Field(
17
+ headers: dict[str, str] | None = Field(
17
18
  description="Optional headers to include in the request",
18
19
  default=None,
19
20
  )
20
- params: Optional[Dict[str, Any]] = Field(
21
+ params: dict[str, Any] | None = Field(
21
22
  description="Optional query parameters to include in the request",
22
23
  default=None,
23
24
  )
24
- timeout: Optional[float] = Field(
25
+ timeout: float | None = Field(
25
26
  description="Request timeout in seconds (default: 30)",
26
27
  default=30.0,
27
28
  )
@@ -46,13 +47,13 @@ class HttpGet(HttpBaseTool):
46
47
  "Returns the response content as text. "
47
48
  "Use this when you need to fetch data from web APIs or websites."
48
49
  )
49
- args_schema: Type[BaseModel] = HttpGetInput
50
+ args_schema: type[BaseModel] = HttpGetInput
50
51
 
51
52
  async def _arun(
52
53
  self,
53
54
  url: str,
54
- headers: Optional[Dict[str, str]] = None,
55
- params: Optional[Dict[str, Any]] = None,
55
+ headers: dict[str, str] | None = None,
56
+ params: dict[str, Any] | None = None,
56
57
  timeout: float = 30.0,
57
58
  **kwargs,
58
59
  ) -> str:
@@ -83,12 +84,16 @@ class HttpGet(HttpBaseTool):
83
84
  # Return response content
84
85
  return f"Status: {response.status_code}\nContent: {response.text}"
85
86
 
86
- except httpx.TimeoutException:
87
- return f"Error: Request to {url} timed out after {timeout} seconds"
88
- except httpx.HTTPStatusError as e:
89
- return f"Error: HTTP {e.response.status_code} - {e.response.text}"
90
- except httpx.RequestError as e:
91
- return f"Error: Failed to connect to {url} - {str(e)}"
92
- except Exception as e:
93
- logger.error(f"Unexpected error in HTTP GET request: {e}")
94
- return f"Error: Unexpected error occurred - {str(e)}"
87
+ except httpx.TimeoutException as exc:
88
+ raise ToolException(
89
+ f"Request to {url} timed out after {timeout} seconds"
90
+ ) from exc
91
+ except httpx.HTTPStatusError as exc:
92
+ raise ToolException(
93
+ f"HTTP {exc.response.status_code} - {exc.response.text}"
94
+ ) from exc
95
+ except httpx.RequestError as exc:
96
+ raise ToolException(f"Failed to connect to {url} - {str(exc)}") from exc
97
+ except Exception as exc: # noqa: BLE001
98
+ logger.error("Unexpected error in HTTP GET request", exc_info=exc)
99
+ raise ToolException(f"Unexpected error occurred - {str(exc)}") from exc
@@ -1,7 +1,8 @@
1
1
  import logging
2
- from typing import Any, Dict, Optional, Type, Union
2
+ from typing import Any
3
3
 
4
4
  import httpx
5
+ from langchain_core.tools import ToolException
5
6
  from pydantic import BaseModel, Field
6
7
 
7
8
  from intentkit.skills.http.base import HttpBaseTool
@@ -13,19 +14,19 @@ class HttpPostInput(BaseModel):
13
14
  """Input for HTTP POST request."""
14
15
 
15
16
  url: str = Field(description="The URL to send the POST request to")
16
- data: Optional[Union[Dict[str, Any], str]] = Field(
17
+ data: dict[str, Any] | str | None = Field(
17
18
  description="The data to send in the request body. Can be a dictionary (will be sent as JSON) or a string",
18
19
  default=None,
19
20
  )
20
- headers: Optional[Dict[str, str]] = Field(
21
+ headers: dict[str, str] | None = Field(
21
22
  description="Optional headers to include in the request",
22
23
  default=None,
23
24
  )
24
- params: Optional[Dict[str, Any]] = Field(
25
+ params: dict[str, Any] | None = Field(
25
26
  description="Optional query parameters to include in the request",
26
27
  default=None,
27
28
  )
28
- timeout: Optional[float] = Field(
29
+ timeout: float | None = Field(
29
30
  description="Request timeout in seconds (default: 30)",
30
31
  default=30.0,
31
32
  )
@@ -51,14 +52,14 @@ class HttpPost(HttpBaseTool):
51
52
  "Returns the response content as text. "
52
53
  "Use this when you need to send data to web APIs or submit forms."
53
54
  )
54
- args_schema: Type[BaseModel] = HttpPostInput
55
+ args_schema: type[BaseModel] = HttpPostInput
55
56
 
56
57
  async def _arun(
57
58
  self,
58
59
  url: str,
59
- data: Optional[Union[Dict[str, Any], str]] = None,
60
- headers: Optional[Dict[str, str]] = None,
61
- params: Optional[Dict[str, Any]] = None,
60
+ data: dict[str, Any] | str | None = None,
61
+ headers: dict[str, str] | None = None,
62
+ params: dict[str, Any] | None = None,
62
63
  timeout: float = 30.0,
63
64
  **kwargs,
64
65
  ) -> str:
@@ -100,12 +101,16 @@ class HttpPost(HttpBaseTool):
100
101
  # Return response content
101
102
  return f"Status: {response.status_code}\nContent: {response.text}"
102
103
 
103
- except httpx.TimeoutException:
104
- return f"Error: Request to {url} timed out after {timeout} seconds"
105
- except httpx.HTTPStatusError as e:
106
- return f"Error: HTTP {e.response.status_code} - {e.response.text}"
107
- except httpx.RequestError as e:
108
- return f"Error: Failed to connect to {url} - {str(e)}"
109
- except Exception as e:
110
- logger.error(f"Unexpected error in HTTP POST request: {e}")
111
- return f"Error: Unexpected error occurred - {str(e)}"
104
+ except httpx.TimeoutException as exc:
105
+ raise ToolException(
106
+ f"Request to {url} timed out after {timeout} seconds"
107
+ ) from exc
108
+ except httpx.HTTPStatusError as exc:
109
+ raise ToolException(
110
+ f"HTTP {exc.response.status_code} - {exc.response.text}"
111
+ ) from exc
112
+ except httpx.RequestError as exc:
113
+ raise ToolException(f"Failed to connect to {url} - {str(exc)}") from exc
114
+ except Exception as exc: # noqa: BLE001
115
+ logger.error("Unexpected error in HTTP POST request", exc_info=exc)
116
+ raise ToolException(f"Unexpected error occurred - {str(exc)}") from exc