intentkit 0.5.0__py3-none-any.whl → 0.5.2__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 (366) hide show
  1. intentkit/__init__.py +17 -0
  2. intentkit/abstracts/__init__.py +0 -0
  3. intentkit/abstracts/agent.py +60 -0
  4. intentkit/abstracts/api.py +4 -0
  5. intentkit/abstracts/engine.py +38 -0
  6. intentkit/abstracts/exception.py +9 -0
  7. intentkit/abstracts/graph.py +25 -0
  8. intentkit/abstracts/skill.py +129 -0
  9. intentkit/abstracts/twitter.py +54 -0
  10. intentkit/clients/__init__.py +14 -0
  11. intentkit/clients/cdp.py +53 -0
  12. intentkit/clients/twitter.py +445 -0
  13. intentkit/config/__init__.py +0 -0
  14. intentkit/config/config.py +164 -0
  15. intentkit/core/__init__.py +0 -0
  16. intentkit/core/agent.py +191 -0
  17. intentkit/core/api.py +40 -0
  18. intentkit/core/client.py +45 -0
  19. intentkit/core/credit.py +1767 -0
  20. intentkit/core/engine.py +1018 -0
  21. intentkit/core/node.py +223 -0
  22. intentkit/core/prompt.py +58 -0
  23. intentkit/core/skill.py +124 -0
  24. intentkit/models/agent.py +1689 -0
  25. intentkit/models/agent_data.py +810 -0
  26. intentkit/models/agent_schema.json +733 -0
  27. intentkit/models/app_setting.py +156 -0
  28. intentkit/models/base.py +9 -0
  29. intentkit/models/chat.py +581 -0
  30. intentkit/models/conversation.py +286 -0
  31. intentkit/models/credit.py +1406 -0
  32. intentkit/models/db.py +120 -0
  33. intentkit/models/db_mig.py +102 -0
  34. intentkit/models/generator.py +347 -0
  35. intentkit/models/llm.py +746 -0
  36. intentkit/models/redis.py +132 -0
  37. intentkit/models/skill.py +466 -0
  38. intentkit/models/user.py +243 -0
  39. intentkit/skills/__init__.py +12 -0
  40. intentkit/skills/acolyt/__init__.py +83 -0
  41. intentkit/skills/acolyt/acolyt.jpg +0 -0
  42. intentkit/skills/acolyt/ask.py +128 -0
  43. intentkit/skills/acolyt/base.py +28 -0
  44. intentkit/skills/acolyt/schema.json +89 -0
  45. intentkit/skills/aixbt/README.md +71 -0
  46. intentkit/skills/aixbt/__init__.py +73 -0
  47. intentkit/skills/aixbt/aixbt.jpg +0 -0
  48. intentkit/skills/aixbt/base.py +21 -0
  49. intentkit/skills/aixbt/projects.py +153 -0
  50. intentkit/skills/aixbt/schema.json +99 -0
  51. intentkit/skills/allora/__init__.py +83 -0
  52. intentkit/skills/allora/allora.jpeg +0 -0
  53. intentkit/skills/allora/base.py +28 -0
  54. intentkit/skills/allora/price.py +130 -0
  55. intentkit/skills/allora/schema.json +89 -0
  56. intentkit/skills/base.py +174 -0
  57. intentkit/skills/carv/README.md +95 -0
  58. intentkit/skills/carv/__init__.py +121 -0
  59. intentkit/skills/carv/base.py +183 -0
  60. intentkit/skills/carv/carv.webp +0 -0
  61. intentkit/skills/carv/fetch_news.py +92 -0
  62. intentkit/skills/carv/onchain_query.py +164 -0
  63. intentkit/skills/carv/schema.json +137 -0
  64. intentkit/skills/carv/token_info_and_price.py +110 -0
  65. intentkit/skills/cdp/__init__.py +137 -0
  66. intentkit/skills/cdp/base.py +21 -0
  67. intentkit/skills/cdp/cdp.png +0 -0
  68. intentkit/skills/cdp/get_balance.py +81 -0
  69. intentkit/skills/cdp/schema.json +473 -0
  70. intentkit/skills/chainlist/README.md +38 -0
  71. intentkit/skills/chainlist/__init__.py +54 -0
  72. intentkit/skills/chainlist/base.py +21 -0
  73. intentkit/skills/chainlist/chain_lookup.py +208 -0
  74. intentkit/skills/chainlist/chainlist.png +0 -0
  75. intentkit/skills/chainlist/schema.json +47 -0
  76. intentkit/skills/common/__init__.py +82 -0
  77. intentkit/skills/common/base.py +21 -0
  78. intentkit/skills/common/common.jpg +0 -0
  79. intentkit/skills/common/current_time.py +84 -0
  80. intentkit/skills/common/schema.json +57 -0
  81. intentkit/skills/cookiefun/README.md +121 -0
  82. intentkit/skills/cookiefun/__init__.py +78 -0
  83. intentkit/skills/cookiefun/base.py +41 -0
  84. intentkit/skills/cookiefun/constants.py +18 -0
  85. intentkit/skills/cookiefun/cookiefun.png +0 -0
  86. intentkit/skills/cookiefun/get_account_details.py +171 -0
  87. intentkit/skills/cookiefun/get_account_feed.py +282 -0
  88. intentkit/skills/cookiefun/get_account_smart_followers.py +181 -0
  89. intentkit/skills/cookiefun/get_sectors.py +128 -0
  90. intentkit/skills/cookiefun/schema.json +155 -0
  91. intentkit/skills/cookiefun/search_accounts.py +225 -0
  92. intentkit/skills/cryptocompare/__init__.py +130 -0
  93. intentkit/skills/cryptocompare/api.py +159 -0
  94. intentkit/skills/cryptocompare/base.py +303 -0
  95. intentkit/skills/cryptocompare/cryptocompare.png +0 -0
  96. intentkit/skills/cryptocompare/fetch_news.py +96 -0
  97. intentkit/skills/cryptocompare/fetch_price.py +99 -0
  98. intentkit/skills/cryptocompare/fetch_top_exchanges.py +113 -0
  99. intentkit/skills/cryptocompare/fetch_top_market_cap.py +109 -0
  100. intentkit/skills/cryptocompare/fetch_top_volume.py +108 -0
  101. intentkit/skills/cryptocompare/fetch_trading_signals.py +107 -0
  102. intentkit/skills/cryptocompare/schema.json +168 -0
  103. intentkit/skills/cryptopanic/__init__.py +108 -0
  104. intentkit/skills/cryptopanic/base.py +51 -0
  105. intentkit/skills/cryptopanic/cryptopanic.png +0 -0
  106. intentkit/skills/cryptopanic/fetch_crypto_news.py +153 -0
  107. intentkit/skills/cryptopanic/fetch_crypto_sentiment.py +136 -0
  108. intentkit/skills/cryptopanic/schema.json +103 -0
  109. intentkit/skills/dapplooker/README.md +92 -0
  110. intentkit/skills/dapplooker/__init__.py +83 -0
  111. intentkit/skills/dapplooker/base.py +26 -0
  112. intentkit/skills/dapplooker/dapplooker.jpg +0 -0
  113. intentkit/skills/dapplooker/dapplooker_token_data.py +476 -0
  114. intentkit/skills/dapplooker/schema.json +91 -0
  115. intentkit/skills/defillama/__init__.py +323 -0
  116. intentkit/skills/defillama/api.py +315 -0
  117. intentkit/skills/defillama/base.py +135 -0
  118. intentkit/skills/defillama/coins/__init__.py +0 -0
  119. intentkit/skills/defillama/coins/fetch_batch_historical_prices.py +116 -0
  120. intentkit/skills/defillama/coins/fetch_block.py +98 -0
  121. intentkit/skills/defillama/coins/fetch_current_prices.py +105 -0
  122. intentkit/skills/defillama/coins/fetch_first_price.py +100 -0
  123. intentkit/skills/defillama/coins/fetch_historical_prices.py +110 -0
  124. intentkit/skills/defillama/coins/fetch_price_chart.py +109 -0
  125. intentkit/skills/defillama/coins/fetch_price_percentage.py +93 -0
  126. intentkit/skills/defillama/config/__init__.py +0 -0
  127. intentkit/skills/defillama/config/chains.py +433 -0
  128. intentkit/skills/defillama/defillama.jpeg +0 -0
  129. intentkit/skills/defillama/fees/__init__.py +0 -0
  130. intentkit/skills/defillama/fees/fetch_fees_overview.py +130 -0
  131. intentkit/skills/defillama/schema.json +383 -0
  132. intentkit/skills/defillama/stablecoins/__init__.py +0 -0
  133. intentkit/skills/defillama/stablecoins/fetch_stablecoin_chains.py +100 -0
  134. intentkit/skills/defillama/stablecoins/fetch_stablecoin_charts.py +129 -0
  135. intentkit/skills/defillama/stablecoins/fetch_stablecoin_prices.py +83 -0
  136. intentkit/skills/defillama/stablecoins/fetch_stablecoins.py +126 -0
  137. intentkit/skills/defillama/tests/__init__.py +0 -0
  138. intentkit/skills/defillama/tests/api_integration.test.py +192 -0
  139. intentkit/skills/defillama/tests/api_unit.test.py +583 -0
  140. intentkit/skills/defillama/tvl/__init__.py +0 -0
  141. intentkit/skills/defillama/tvl/fetch_chain_historical_tvl.py +106 -0
  142. intentkit/skills/defillama/tvl/fetch_chains.py +107 -0
  143. intentkit/skills/defillama/tvl/fetch_historical_tvl.py +91 -0
  144. intentkit/skills/defillama/tvl/fetch_protocol.py +207 -0
  145. intentkit/skills/defillama/tvl/fetch_protocol_current_tvl.py +93 -0
  146. intentkit/skills/defillama/tvl/fetch_protocols.py +196 -0
  147. intentkit/skills/defillama/volumes/__init__.py +0 -0
  148. intentkit/skills/defillama/volumes/fetch_dex_overview.py +157 -0
  149. intentkit/skills/defillama/volumes/fetch_dex_summary.py +123 -0
  150. intentkit/skills/defillama/volumes/fetch_options_overview.py +131 -0
  151. intentkit/skills/defillama/yields/__init__.py +0 -0
  152. intentkit/skills/defillama/yields/fetch_pool_chart.py +100 -0
  153. intentkit/skills/defillama/yields/fetch_pools.py +126 -0
  154. intentkit/skills/dexscreener/__init__.py +93 -0
  155. intentkit/skills/dexscreener/base.py +133 -0
  156. intentkit/skills/dexscreener/dexscreener.png +0 -0
  157. intentkit/skills/dexscreener/model/__init__.py +0 -0
  158. intentkit/skills/dexscreener/model/search_token_response.py +82 -0
  159. intentkit/skills/dexscreener/schema.json +48 -0
  160. intentkit/skills/dexscreener/search_token.py +321 -0
  161. intentkit/skills/dune_analytics/__init__.py +103 -0
  162. intentkit/skills/dune_analytics/base.py +46 -0
  163. intentkit/skills/dune_analytics/dune.png +0 -0
  164. intentkit/skills/dune_analytics/fetch_kol_buys.py +128 -0
  165. intentkit/skills/dune_analytics/fetch_nation_metrics.py +237 -0
  166. intentkit/skills/dune_analytics/schema.json +99 -0
  167. intentkit/skills/elfa/README.md +100 -0
  168. intentkit/skills/elfa/__init__.py +123 -0
  169. intentkit/skills/elfa/base.py +28 -0
  170. intentkit/skills/elfa/elfa.jpg +0 -0
  171. intentkit/skills/elfa/mention.py +504 -0
  172. intentkit/skills/elfa/schema.json +153 -0
  173. intentkit/skills/elfa/stats.py +118 -0
  174. intentkit/skills/elfa/tokens.py +126 -0
  175. intentkit/skills/enso/README.md +75 -0
  176. intentkit/skills/enso/__init__.py +114 -0
  177. intentkit/skills/enso/abi/__init__.py +0 -0
  178. intentkit/skills/enso/abi/approval.py +279 -0
  179. intentkit/skills/enso/abi/erc20.py +14 -0
  180. intentkit/skills/enso/abi/route.py +129 -0
  181. intentkit/skills/enso/base.py +44 -0
  182. intentkit/skills/enso/best_yield.py +286 -0
  183. intentkit/skills/enso/enso.jpg +0 -0
  184. intentkit/skills/enso/networks.py +105 -0
  185. intentkit/skills/enso/prices.py +93 -0
  186. intentkit/skills/enso/route.py +300 -0
  187. intentkit/skills/enso/schema.json +212 -0
  188. intentkit/skills/enso/tokens.py +223 -0
  189. intentkit/skills/enso/wallet.py +381 -0
  190. intentkit/skills/github/README.md +63 -0
  191. intentkit/skills/github/__init__.py +54 -0
  192. intentkit/skills/github/base.py +21 -0
  193. intentkit/skills/github/github.jpg +0 -0
  194. intentkit/skills/github/github_search.py +183 -0
  195. intentkit/skills/github/schema.json +59 -0
  196. intentkit/skills/heurist/__init__.py +143 -0
  197. intentkit/skills/heurist/base.py +26 -0
  198. intentkit/skills/heurist/heurist.png +0 -0
  199. intentkit/skills/heurist/image_generation_animagine_xl.py +162 -0
  200. intentkit/skills/heurist/image_generation_arthemy_comics.py +162 -0
  201. intentkit/skills/heurist/image_generation_arthemy_real.py +162 -0
  202. intentkit/skills/heurist/image_generation_braindance.py +162 -0
  203. intentkit/skills/heurist/image_generation_cyber_realistic_xl.py +162 -0
  204. intentkit/skills/heurist/image_generation_flux_1_dev.py +162 -0
  205. intentkit/skills/heurist/image_generation_sdxl.py +161 -0
  206. intentkit/skills/heurist/schema.json +196 -0
  207. intentkit/skills/lifi/README.md +294 -0
  208. intentkit/skills/lifi/__init__.py +141 -0
  209. intentkit/skills/lifi/base.py +21 -0
  210. intentkit/skills/lifi/lifi.png +0 -0
  211. intentkit/skills/lifi/schema.json +89 -0
  212. intentkit/skills/lifi/token_execute.py +472 -0
  213. intentkit/skills/lifi/token_quote.py +190 -0
  214. intentkit/skills/lifi/utils.py +656 -0
  215. intentkit/skills/moralis/README.md +490 -0
  216. intentkit/skills/moralis/__init__.py +110 -0
  217. intentkit/skills/moralis/api.py +281 -0
  218. intentkit/skills/moralis/base.py +55 -0
  219. intentkit/skills/moralis/fetch_chain_portfolio.py +191 -0
  220. intentkit/skills/moralis/fetch_nft_portfolio.py +284 -0
  221. intentkit/skills/moralis/fetch_solana_portfolio.py +331 -0
  222. intentkit/skills/moralis/fetch_wallet_portfolio.py +301 -0
  223. intentkit/skills/moralis/moralis.png +0 -0
  224. intentkit/skills/moralis/schema.json +156 -0
  225. intentkit/skills/moralis/tests/__init__.py +0 -0
  226. intentkit/skills/moralis/tests/test_wallet.py +511 -0
  227. intentkit/skills/nation/__init__.py +62 -0
  228. intentkit/skills/nation/base.py +31 -0
  229. intentkit/skills/nation/nation.png +0 -0
  230. intentkit/skills/nation/nft_check.py +106 -0
  231. intentkit/skills/nation/schema.json +58 -0
  232. intentkit/skills/openai/__init__.py +107 -0
  233. intentkit/skills/openai/base.py +32 -0
  234. intentkit/skills/openai/dalle_image_generation.py +128 -0
  235. intentkit/skills/openai/gpt_image_generation.py +152 -0
  236. intentkit/skills/openai/gpt_image_to_image.py +186 -0
  237. intentkit/skills/openai/image_to_text.py +126 -0
  238. intentkit/skills/openai/openai.png +0 -0
  239. intentkit/skills/openai/schema.json +139 -0
  240. intentkit/skills/portfolio/README.md +55 -0
  241. intentkit/skills/portfolio/__init__.py +151 -0
  242. intentkit/skills/portfolio/base.py +107 -0
  243. intentkit/skills/portfolio/constants.py +9 -0
  244. intentkit/skills/portfolio/moralis.png +0 -0
  245. intentkit/skills/portfolio/schema.json +237 -0
  246. intentkit/skills/portfolio/token_balances.py +155 -0
  247. intentkit/skills/portfolio/wallet_approvals.py +102 -0
  248. intentkit/skills/portfolio/wallet_defi_positions.py +80 -0
  249. intentkit/skills/portfolio/wallet_history.py +155 -0
  250. intentkit/skills/portfolio/wallet_net_worth.py +112 -0
  251. intentkit/skills/portfolio/wallet_nfts.py +139 -0
  252. intentkit/skills/portfolio/wallet_profitability.py +101 -0
  253. intentkit/skills/portfolio/wallet_profitability_summary.py +91 -0
  254. intentkit/skills/portfolio/wallet_stats.py +79 -0
  255. intentkit/skills/portfolio/wallet_swaps.py +147 -0
  256. intentkit/skills/skills.toml +103 -0
  257. intentkit/skills/slack/__init__.py +98 -0
  258. intentkit/skills/slack/base.py +55 -0
  259. intentkit/skills/slack/get_channel.py +109 -0
  260. intentkit/skills/slack/get_message.py +136 -0
  261. intentkit/skills/slack/schedule_message.py +92 -0
  262. intentkit/skills/slack/schema.json +135 -0
  263. intentkit/skills/slack/send_message.py +81 -0
  264. intentkit/skills/slack/slack.jpg +0 -0
  265. intentkit/skills/system/__init__.py +90 -0
  266. intentkit/skills/system/base.py +22 -0
  267. intentkit/skills/system/read_agent_api_key.py +87 -0
  268. intentkit/skills/system/regenerate_agent_api_key.py +77 -0
  269. intentkit/skills/system/schema.json +53 -0
  270. intentkit/skills/system/system.svg +76 -0
  271. intentkit/skills/tavily/README.md +86 -0
  272. intentkit/skills/tavily/__init__.py +91 -0
  273. intentkit/skills/tavily/base.py +27 -0
  274. intentkit/skills/tavily/schema.json +119 -0
  275. intentkit/skills/tavily/tavily.jpg +0 -0
  276. intentkit/skills/tavily/tavily_extract.py +147 -0
  277. intentkit/skills/tavily/tavily_search.py +139 -0
  278. intentkit/skills/token/README.md +89 -0
  279. intentkit/skills/token/__init__.py +107 -0
  280. intentkit/skills/token/base.py +154 -0
  281. intentkit/skills/token/constants.py +9 -0
  282. intentkit/skills/token/erc20_transfers.py +145 -0
  283. intentkit/skills/token/moralis.png +0 -0
  284. intentkit/skills/token/schema.json +141 -0
  285. intentkit/skills/token/token_analytics.py +81 -0
  286. intentkit/skills/token/token_price.py +132 -0
  287. intentkit/skills/token/token_search.py +121 -0
  288. intentkit/skills/twitter/__init__.py +146 -0
  289. intentkit/skills/twitter/base.py +68 -0
  290. intentkit/skills/twitter/follow_user.py +69 -0
  291. intentkit/skills/twitter/get_mentions.py +124 -0
  292. intentkit/skills/twitter/get_timeline.py +111 -0
  293. intentkit/skills/twitter/get_user_by_username.py +84 -0
  294. intentkit/skills/twitter/get_user_tweets.py +123 -0
  295. intentkit/skills/twitter/like_tweet.py +65 -0
  296. intentkit/skills/twitter/post_tweet.py +90 -0
  297. intentkit/skills/twitter/reply_tweet.py +98 -0
  298. intentkit/skills/twitter/retweet.py +76 -0
  299. intentkit/skills/twitter/schema.json +258 -0
  300. intentkit/skills/twitter/search_tweets.py +115 -0
  301. intentkit/skills/twitter/twitter.png +0 -0
  302. intentkit/skills/unrealspeech/__init__.py +55 -0
  303. intentkit/skills/unrealspeech/base.py +21 -0
  304. intentkit/skills/unrealspeech/schema.json +100 -0
  305. intentkit/skills/unrealspeech/text_to_speech.py +177 -0
  306. intentkit/skills/unrealspeech/unrealspeech.jpg +0 -0
  307. intentkit/skills/venice_audio/__init__.py +106 -0
  308. intentkit/skills/venice_audio/base.py +119 -0
  309. intentkit/skills/venice_audio/input.py +41 -0
  310. intentkit/skills/venice_audio/schema.json +152 -0
  311. intentkit/skills/venice_audio/venice_audio.py +240 -0
  312. intentkit/skills/venice_audio/venice_logo.jpg +0 -0
  313. intentkit/skills/venice_image/README.md +119 -0
  314. intentkit/skills/venice_image/__init__.py +154 -0
  315. intentkit/skills/venice_image/api.py +138 -0
  316. intentkit/skills/venice_image/base.py +188 -0
  317. intentkit/skills/venice_image/config.py +35 -0
  318. intentkit/skills/venice_image/image_enhance/README.md +119 -0
  319. intentkit/skills/venice_image/image_enhance/__init__.py +0 -0
  320. intentkit/skills/venice_image/image_enhance/image_enhance.py +80 -0
  321. intentkit/skills/venice_image/image_enhance/image_enhance_base.py +23 -0
  322. intentkit/skills/venice_image/image_enhance/image_enhance_input.py +40 -0
  323. intentkit/skills/venice_image/image_generation/README.md +144 -0
  324. intentkit/skills/venice_image/image_generation/__init__.py +0 -0
  325. intentkit/skills/venice_image/image_generation/image_generation_base.py +117 -0
  326. intentkit/skills/venice_image/image_generation/image_generation_fluently_xl.py +26 -0
  327. intentkit/skills/venice_image/image_generation/image_generation_flux_dev.py +27 -0
  328. intentkit/skills/venice_image/image_generation/image_generation_flux_dev_uncensored.py +26 -0
  329. intentkit/skills/venice_image/image_generation/image_generation_input.py +158 -0
  330. intentkit/skills/venice_image/image_generation/image_generation_lustify_sdxl.py +26 -0
  331. intentkit/skills/venice_image/image_generation/image_generation_pony_realism.py +26 -0
  332. intentkit/skills/venice_image/image_generation/image_generation_stable_diffusion_3_5.py +28 -0
  333. intentkit/skills/venice_image/image_generation/image_generation_venice_sd35.py +28 -0
  334. intentkit/skills/venice_image/image_upscale/README.md +111 -0
  335. intentkit/skills/venice_image/image_upscale/__init__.py +0 -0
  336. intentkit/skills/venice_image/image_upscale/image_upscale.py +90 -0
  337. intentkit/skills/venice_image/image_upscale/image_upscale_base.py +23 -0
  338. intentkit/skills/venice_image/image_upscale/image_upscale_input.py +22 -0
  339. intentkit/skills/venice_image/image_vision/README.md +112 -0
  340. intentkit/skills/venice_image/image_vision/__init__.py +0 -0
  341. intentkit/skills/venice_image/image_vision/image_vision.py +100 -0
  342. intentkit/skills/venice_image/image_vision/image_vision_base.py +17 -0
  343. intentkit/skills/venice_image/image_vision/image_vision_input.py +9 -0
  344. intentkit/skills/venice_image/schema.json +267 -0
  345. intentkit/skills/venice_image/utils.py +78 -0
  346. intentkit/skills/venice_image/venice_image.jpg +0 -0
  347. intentkit/skills/web_scraper/README.md +82 -0
  348. intentkit/skills/web_scraper/__init__.py +92 -0
  349. intentkit/skills/web_scraper/base.py +21 -0
  350. intentkit/skills/web_scraper/langchain.png +0 -0
  351. intentkit/skills/web_scraper/schema.json +115 -0
  352. intentkit/skills/web_scraper/scrape_and_index.py +327 -0
  353. intentkit/utils/__init__.py +1 -0
  354. intentkit/utils/chain.py +436 -0
  355. intentkit/utils/error.py +134 -0
  356. intentkit/utils/logging.py +70 -0
  357. intentkit/utils/middleware.py +61 -0
  358. intentkit/utils/random.py +16 -0
  359. intentkit/utils/s3.py +267 -0
  360. intentkit/utils/slack_alert.py +79 -0
  361. intentkit/utils/tx.py +37 -0
  362. {intentkit-0.5.0.dist-info → intentkit-0.5.2.dist-info}/METADATA +1 -1
  363. intentkit-0.5.2.dist-info/RECORD +365 -0
  364. intentkit-0.5.0.dist-info/RECORD +0 -4
  365. {intentkit-0.5.0.dist-info → intentkit-0.5.2.dist-info}/WHEEL +0 -0
  366. {intentkit-0.5.0.dist-info → intentkit-0.5.2.dist-info}/licenses/LICENSE +0 -0
@@ -0,0 +1,54 @@
1
+ from typing import TypedDict
2
+
3
+ from intentkit.abstracts.skill import SkillStoreABC
4
+ from intentkit.skills.base import SkillConfig, SkillState
5
+ from intentkit.skills.github.base import GitHubBaseTool
6
+ from intentkit.skills.github.github_search import GitHubSearch
7
+
8
+ # Cache skills at the system level, because they are stateless
9
+ _cache: dict[str, GitHubBaseTool] = {}
10
+
11
+
12
+ class SkillStates(TypedDict):
13
+ github_search: SkillState
14
+
15
+
16
+ class Config(SkillConfig):
17
+ """Configuration for GitHub skills."""
18
+
19
+ states: SkillStates
20
+
21
+
22
+ async def get_skills(
23
+ config: "Config",
24
+ is_private: bool,
25
+ store: SkillStoreABC,
26
+ **_,
27
+ ) -> list[GitHubBaseTool]:
28
+ """Get all GitHub skills."""
29
+ available_skills = []
30
+
31
+ # Include skills based on their state
32
+ for skill_name, state in config["states"].items():
33
+ if state == "disabled":
34
+ continue
35
+ elif state == "public" or (state == "private" and is_private):
36
+ available_skills.append(skill_name)
37
+
38
+ # Get each skill using the cached getter
39
+ return [get_github_skill(name, store) for name in available_skills]
40
+
41
+
42
+ def get_github_skill(
43
+ name: str,
44
+ store: SkillStoreABC,
45
+ ) -> GitHubBaseTool:
46
+ """Get a GitHub skill by name."""
47
+ if name == "github_search":
48
+ if name not in _cache:
49
+ _cache[name] = GitHubSearch(
50
+ skill_store=store,
51
+ )
52
+ return _cache[name]
53
+ else:
54
+ raise ValueError(f"Unknown GitHub skill: {name}")
@@ -0,0 +1,21 @@
1
+ from typing import Type
2
+
3
+ from pydantic import BaseModel, Field
4
+
5
+ from intentkit.abstracts.skill import SkillStoreABC
6
+ from intentkit.skills.base import IntentKitSkill
7
+
8
+
9
+ class GitHubBaseTool(IntentKitSkill):
10
+ """Base class for GitHub tools."""
11
+
12
+ name: str = Field(description="The name of the tool")
13
+ 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
+ )
18
+
19
+ @property
20
+ def category(self) -> str:
21
+ return "github"
Binary file
@@ -0,0 +1,183 @@
1
+ import logging
2
+ from enum import Enum
3
+ from typing import Type
4
+
5
+ import httpx
6
+ from langchain_core.runnables import RunnableConfig
7
+ from pydantic import BaseModel, Field
8
+
9
+ from intentkit.skills.github.base import GitHubBaseTool
10
+
11
+ logger = logging.getLogger(__name__)
12
+
13
+
14
+ class SearchType(str, Enum):
15
+ REPOSITORIES = "repositories"
16
+ USERS = "users"
17
+ CODE = "code"
18
+
19
+
20
+ class GitHubSearchInput(BaseModel):
21
+ """Input for GitHub search tool."""
22
+
23
+ query: str = Field(
24
+ description="The search query to look up on GitHub.",
25
+ )
26
+ search_type: SearchType = Field(
27
+ description="Type of GitHub search to perform (repositories, users, or code).",
28
+ default=SearchType.REPOSITORIES,
29
+ )
30
+ max_results: int = Field(
31
+ description="Maximum number of search results to return (1-30).",
32
+ default=5,
33
+ ge=1,
34
+ le=30,
35
+ )
36
+
37
+
38
+ class GitHubSearch(GitHubBaseTool):
39
+ """Tool for searching GitHub.
40
+
41
+ This tool uses GitHub's public REST API to search for repositories, users, and code.
42
+ No authentication is required as it uses public endpoints.
43
+
44
+ Attributes:
45
+ name: The name of the tool.
46
+ description: A description of what the tool does.
47
+ args_schema: The schema for the tool's input arguments.
48
+ """
49
+
50
+ name: str = "github_search"
51
+ description: str = (
52
+ "Search GitHub for repositories, users, or code. Use this tool when you need to find:\n"
53
+ "- GitHub repositories by name, description, or topics\n"
54
+ "- GitHub users by username or real name\n"
55
+ "- Code snippets across GitHub repositories\n"
56
+ "You must call this tool whenever the user asks about finding something on GitHub."
57
+ )
58
+ args_schema: Type[BaseModel] = GitHubSearchInput
59
+
60
+ async def _arun(
61
+ self,
62
+ query: str,
63
+ search_type: SearchType = SearchType.REPOSITORIES,
64
+ max_results: int = 5,
65
+ config: RunnableConfig = None,
66
+ **kwargs,
67
+ ) -> str:
68
+ """Implementation of the GitHub search tool.
69
+
70
+ Args:
71
+ query: The search query to look up.
72
+ search_type: Type of search to perform (repositories, users, or code).
73
+ max_results: Maximum number of search results to return (1-30).
74
+ config: The configuration for the tool call.
75
+
76
+ Returns:
77
+ str: Formatted search results based on the search type.
78
+ """
79
+ context = self.context_from_config(config)
80
+ logger.debug(f"github_search.py: Running GitHub search with context {context}")
81
+
82
+ # Limit max_results to a reasonable range
83
+ max_results = max(1, min(max_results, 30))
84
+
85
+ headers = {
86
+ "Accept": "application/vnd.github.v3+json",
87
+ }
88
+
89
+ # Build the search URL based on search type
90
+ base_url = "https://api.github.com/search"
91
+ search_url = f"{base_url}/{search_type.value}"
92
+ logger.debug(f"github_search.py: Searching GitHub at {search_url}")
93
+
94
+ try:
95
+ async with httpx.AsyncClient(timeout=30.0) as client:
96
+ response = await client.get(
97
+ search_url,
98
+ headers=headers,
99
+ params={"q": query, "per_page": max_results},
100
+ )
101
+
102
+ if response.status_code == 403:
103
+ rate_limit = response.headers.get(
104
+ "X-RateLimit-Remaining", "unknown"
105
+ )
106
+ reset_time = response.headers.get("X-RateLimit-Reset", "unknown")
107
+ logger.warning(
108
+ f"github_search.py: Rate limit reached. Remaining: {rate_limit}, Reset: {reset_time}"
109
+ )
110
+ return (
111
+ "GitHub API rate limit reached. Please try again in a few minutes. "
112
+ "The rate limit resets every hour for unauthenticated requests."
113
+ )
114
+ elif response.status_code != 200:
115
+ logger.error(
116
+ f"github_search.py: Error from GitHub API: {response.status_code} - {response.text}"
117
+ )
118
+ return f"Error searching GitHub: {response.status_code} - {response.text}"
119
+
120
+ data = response.json()
121
+ items = data.get("items", [])
122
+
123
+ if not items:
124
+ return f"No results found for query: '{query}'"
125
+
126
+ # Format results based on search type
127
+ formatted_results = (
128
+ f"GitHub search results for '{query}' ({search_type.value}):\n\n"
129
+ )
130
+
131
+ for i, item in enumerate(items, 1):
132
+ if search_type == SearchType.REPOSITORIES:
133
+ name = item.get("full_name", "No name")
134
+ description = item.get("description", "No description")
135
+ url = item.get("html_url", "No URL")
136
+ stars = item.get("stargazers_count", 0)
137
+ language = item.get("language", "Not specified")
138
+
139
+ formatted_results += f"{i}. {name}\n"
140
+ formatted_results += f"Description: {description}\n"
141
+ formatted_results += f"Language: {language} | Stars: {stars}\n"
142
+ formatted_results += f"URL: {url}\n\n"
143
+
144
+ elif search_type == SearchType.USERS:
145
+ login = item.get("login", "No username")
146
+ name = item.get("name", "No name")
147
+ bio = item.get("bio", "No bio")
148
+ url = item.get("html_url", "No URL")
149
+ followers = item.get("followers", 0)
150
+ public_repos = item.get("public_repos", 0)
151
+
152
+ formatted_results += f"{i}. {login}"
153
+ if name:
154
+ formatted_results += f" ({name})"
155
+ formatted_results += "\n"
156
+ if bio:
157
+ formatted_results += f"Bio: {bio}\n"
158
+ formatted_results += (
159
+ f"Followers: {followers} | Public Repos: {public_repos}\n"
160
+ )
161
+ formatted_results += f"URL: {url}\n\n"
162
+
163
+ elif search_type == SearchType.CODE:
164
+ repo = item.get("repository", {}).get(
165
+ "full_name", "No repository"
166
+ )
167
+ path = item.get("path", "No path")
168
+ url = item.get("html_url", "No URL")
169
+
170
+ formatted_results += f"{i}. Found in {repo}\n"
171
+ formatted_results += f"File: {path}\n"
172
+ formatted_results += f"URL: {url}\n\n"
173
+
174
+ return formatted_results.strip()
175
+
176
+ except httpx.TimeoutException:
177
+ logger.error("github_search.py: Request timed out")
178
+ return "The request to GitHub timed out. Please try again later."
179
+ except Exception as e:
180
+ logger.error(
181
+ f"github_search.py: Error searching GitHub: {e}", exc_info=True
182
+ )
183
+ return "An error occurred while searching GitHub. Please try again later."
@@ -0,0 +1,59 @@
1
+ {
2
+ "$schema": "http://json-schema.org/draft-07/schema#",
3
+ "type": "object",
4
+ "title": "GitHub",
5
+ "description": "Search capabilities for GitHub repositories, users, and code",
6
+ "x-icon": "https://ai.service.crestal.dev/skills/github/github.jpg",
7
+ "x-tags": [
8
+ "GitHub",
9
+ "Search",
10
+ "Code"
11
+ ],
12
+ "properties": {
13
+ "enabled": {
14
+ "type": "boolean",
15
+ "title": "Enabled",
16
+ "description": "Whether this skill is enabled",
17
+ "default": false
18
+ },
19
+ "states": {
20
+ "type": "object",
21
+ "properties": {
22
+ "github_search": {
23
+ "type": "string",
24
+ "title": "GitHub Search",
25
+ "enum": [
26
+ "disabled",
27
+ "public",
28
+ "private"
29
+ ],
30
+ "x-enum-title": [
31
+ "Disabled",
32
+ "Agent Owner + All Users",
33
+ "Agent Owner Only"
34
+ ],
35
+ "description": "Search GitHub for repositories, users, and code",
36
+ "default": "disabled"
37
+ }
38
+ },
39
+ "description": "States for each GitHub search skill (disabled, public, or private)"
40
+ },
41
+ "api_key_provider": {
42
+ "type": "string",
43
+ "title": "API Key Provider",
44
+ "description": "Who provides the API key",
45
+ "enum": [
46
+ "platform"
47
+ ],
48
+ "x-enum-title": [
49
+ "Nation Hosted"
50
+ ],
51
+ "default": "platform"
52
+ }
53
+ },
54
+ "required": [
55
+ "states",
56
+ "enabled"
57
+ ],
58
+ "additionalProperties": true
59
+ }
@@ -0,0 +1,143 @@
1
+ """Heurist AI skills."""
2
+
3
+ import logging
4
+ from typing import NotRequired, TypedDict
5
+
6
+ from intentkit.abstracts.skill import SkillStoreABC
7
+ from intentkit.skills.base import SkillConfig, SkillState
8
+ from intentkit.skills.heurist.base import HeuristBaseTool
9
+ from intentkit.skills.heurist.image_generation_animagine_xl import (
10
+ ImageGenerationAnimagineXL,
11
+ )
12
+ from intentkit.skills.heurist.image_generation_arthemy_comics import (
13
+ ImageGenerationArthemyComics,
14
+ )
15
+ from intentkit.skills.heurist.image_generation_arthemy_real import (
16
+ ImageGenerationArthemyReal,
17
+ )
18
+ from intentkit.skills.heurist.image_generation_braindance import (
19
+ ImageGenerationBrainDance,
20
+ )
21
+ from intentkit.skills.heurist.image_generation_cyber_realistic_xl import (
22
+ ImageGenerationCyberRealisticXL,
23
+ )
24
+ from intentkit.skills.heurist.image_generation_flux_1_dev import ImageGenerationFlux1Dev
25
+ from intentkit.skills.heurist.image_generation_sdxl import ImageGenerationSDXL
26
+
27
+ # Cache skills at the system level, because they are stateless
28
+ _cache: dict[str, HeuristBaseTool] = {}
29
+
30
+ logger = logging.getLogger(__name__)
31
+
32
+
33
+ class SkillStates(TypedDict):
34
+ image_generation_animagine_xl: SkillState
35
+ image_generation_arthemy_comics: SkillState
36
+ image_generation_arthemy_real: SkillState
37
+ image_generation_braindance: SkillState
38
+ image_generation_cyber_realistic_xl: SkillState
39
+ image_generation_flux_1_dev: SkillState
40
+ image_generation_sdxl: SkillState
41
+
42
+
43
+ class Config(SkillConfig):
44
+ """Configuration for Heurist AI skills."""
45
+
46
+ states: SkillStates
47
+ api_key: NotRequired[str]
48
+ rate_limit_number: NotRequired[int]
49
+ rate_limit_minutes: NotRequired[int]
50
+
51
+
52
+ async def get_skills(
53
+ config: "Config",
54
+ is_private: bool,
55
+ store: SkillStoreABC,
56
+ **_,
57
+ ) -> list[HeuristBaseTool]:
58
+ """Get all Heurist AI skills.
59
+
60
+ Args:
61
+ config: The configuration for Heurist AI skills.
62
+ is_private: Whether to include private skills.
63
+ store: The skill store for persisting data.
64
+
65
+ Returns:
66
+ A list of Heurist AI skills.
67
+ """
68
+ available_skills = []
69
+
70
+ # Include skills based on their state
71
+ for skill_name, state in config["states"].items():
72
+ if state == "disabled":
73
+ continue
74
+ elif state == "public" or (state == "private" and is_private):
75
+ available_skills.append(skill_name)
76
+
77
+ # Get each skill using the cached getter
78
+ result = []
79
+ for name in available_skills:
80
+ skill = get_heurist_skill(name, store)
81
+ if skill:
82
+ result.append(skill)
83
+ return result
84
+
85
+
86
+ def get_heurist_skill(
87
+ name: str,
88
+ store: SkillStoreABC,
89
+ ) -> HeuristBaseTool:
90
+ """Get a Heurist AI skill by name.
91
+
92
+ Args:
93
+ name: The name of the skill to get
94
+ store: The skill store for persisting data
95
+
96
+ Returns:
97
+ The requested Heurist AI skill
98
+ """
99
+ if name == "image_generation_animagine_xl":
100
+ if name not in _cache:
101
+ _cache[name] = ImageGenerationAnimagineXL(
102
+ skill_store=store,
103
+ )
104
+ return _cache[name]
105
+ elif name == "image_generation_arthemy_comics":
106
+ if name not in _cache:
107
+ _cache[name] = ImageGenerationArthemyComics(
108
+ skill_store=store,
109
+ )
110
+ return _cache[name]
111
+ elif name == "image_generation_arthemy_real":
112
+ if name not in _cache:
113
+ _cache[name] = ImageGenerationArthemyReal(
114
+ skill_store=store,
115
+ )
116
+ return _cache[name]
117
+ elif name == "image_generation_braindance":
118
+ if name not in _cache:
119
+ _cache[name] = ImageGenerationBrainDance(
120
+ skill_store=store,
121
+ )
122
+ return _cache[name]
123
+ elif name == "image_generation_cyber_realistic_xl":
124
+ if name not in _cache:
125
+ _cache[name] = ImageGenerationCyberRealisticXL(
126
+ skill_store=store,
127
+ )
128
+ return _cache[name]
129
+ elif name == "image_generation_flux_1_dev":
130
+ if name not in _cache:
131
+ _cache[name] = ImageGenerationFlux1Dev(
132
+ skill_store=store,
133
+ )
134
+ return _cache[name]
135
+ elif name == "image_generation_sdxl":
136
+ if name not in _cache:
137
+ _cache[name] = ImageGenerationSDXL(
138
+ skill_store=store,
139
+ )
140
+ return _cache[name]
141
+ else:
142
+ logger.warning(f"Unknown Heurist skill: {name}")
143
+ return None
@@ -0,0 +1,26 @@
1
+ """Base class for Heurist AI skills."""
2
+
3
+ from typing import Type
4
+
5
+ from pydantic import BaseModel, Field
6
+
7
+ from intentkit.abstracts.skill import SkillStoreABC
8
+ from intentkit.skills.base import IntentKitSkill
9
+
10
+
11
+ class HeuristBaseTool(IntentKitSkill):
12
+ """Base class for all Heurist AI skills.
13
+
14
+ This class provides common functionality for all Heurist AI skills.
15
+ """
16
+
17
+ name: str = Field(description="The name of the tool")
18
+ description: str = Field(description="A description of what the tool does")
19
+ args_schema: Type[BaseModel]
20
+ skill_store: SkillStoreABC = Field(
21
+ description="The skill store for persisting data"
22
+ )
23
+
24
+ @property
25
+ def category(self) -> str:
26
+ return "heurist"
Binary file
@@ -0,0 +1,162 @@
1
+ import logging
2
+ from typing import Optional, Type
3
+
4
+ import httpx
5
+ from epyxid import XID
6
+ from langchain_core.runnables import RunnableConfig
7
+ from pydantic import BaseModel, Field
8
+
9
+ from intentkit.skills.heurist.base import HeuristBaseTool
10
+ from intentkit.utils.s3 import store_image
11
+
12
+ logger = logging.getLogger(__name__)
13
+
14
+
15
+ class ImageGenerationAnimagineXLInput(BaseModel):
16
+ """Input for ImageGenerationAnimagineXL tool."""
17
+
18
+ prompt: str = Field(
19
+ description="Text prompt describing the image to generate.",
20
+ )
21
+ neg_prompt: Optional[str] = Field(
22
+ default="(worst quality: 1.4), bad quality, nsfw",
23
+ description="Negative prompt describing what to avoid in the generated image.",
24
+ )
25
+ width: Optional[int] = Field(
26
+ default=1024,
27
+ le=1024,
28
+ description="Width of the generated image.",
29
+ )
30
+ height: Optional[int] = Field(
31
+ default=680,
32
+ le=1024,
33
+ description="Height of the generated image.",
34
+ )
35
+
36
+
37
+ class ImageGenerationAnimagineXL(HeuristBaseTool):
38
+ """Tool for generating Japanese anime-style images using Heurist AI's AnimagineXL model.
39
+
40
+ This tool takes a text prompt and uses Heurist's API to generate
41
+ a Japanese anime-style image based on the description.
42
+
43
+ Attributes:
44
+ name: The name of the tool.
45
+ description: A description of what the tool does.
46
+ args_schema: The schema for the tool's input arguments.
47
+ """
48
+
49
+ name: str = "heurist_image_generation_animagine_xl"
50
+ description: str = (
51
+ "Generate Japanese anime-style images using Heurist AI's AnimagineXL model.\n"
52
+ "Provide a text prompt describing the anime-style image you want to generate.\n"
53
+ "AnimagineXL specializes in creating high-quality Japanese anime-style illustrations.\n"
54
+ "If you have height and width, remember to specify them.\n"
55
+ )
56
+ args_schema: Type[BaseModel] = ImageGenerationAnimagineXLInput
57
+
58
+ async def _arun(
59
+ self,
60
+ prompt: str,
61
+ neg_prompt: Optional[str] = "(worst quality: 1.4), bad quality, nsfw",
62
+ width: Optional[int] = 1024,
63
+ height: Optional[int] = 680,
64
+ config: RunnableConfig = None,
65
+ **kwargs,
66
+ ) -> str:
67
+ """Implementation of the tool to generate Japanese anime-style images using Heurist AI's AnimagineXL model.
68
+
69
+ Args:
70
+ prompt: Text prompt describing the image to generate.
71
+ neg_prompt: Negative prompt describing what to avoid in the generated image.
72
+ width: Width of the generated image.
73
+ height: Height of the generated image.
74
+ config: Configuration for the runnable.
75
+ tool_call_id: The ID of the tool call, can be used for tracking or correlation.
76
+
77
+ Returns:
78
+ str: URL of the generated image.
79
+ """
80
+ context = self.context_from_config(config)
81
+ skill_config = context.config
82
+
83
+ # Get the Heurist API key from the skill store
84
+ if "api_key" in skill_config and skill_config["api_key"]:
85
+ api_key = skill_config["api_key"]
86
+ if skill_config.get("rate_limit_number") and skill_config.get(
87
+ "rate_limit_minutes"
88
+ ):
89
+ await self.user_rate_limit_by_category(
90
+ context.user_id,
91
+ skill_config["rate_limit_number"],
92
+ skill_config["rate_limit_minutes"],
93
+ )
94
+ else:
95
+ api_key = self.skill_store.get_system_config("heurist_api_key")
96
+ await self.user_rate_limit_by_category(context.user_id, 10, 1440)
97
+
98
+ # Generate a unique job ID
99
+ job_id = str(XID())
100
+
101
+ # Prepare the request payload
102
+ payload = {
103
+ "job_id": job_id,
104
+ "model_input": {
105
+ "SD": {
106
+ "prompt": prompt,
107
+ "neg_prompt": neg_prompt,
108
+ "num_iterations": 25,
109
+ "width": width,
110
+ "height": height,
111
+ "guidance_scale": 5,
112
+ "seed": -1,
113
+ }
114
+ },
115
+ "model_id": "AnimagineXL",
116
+ "deadline": 180,
117
+ "priority": 1,
118
+ }
119
+
120
+ headers = {
121
+ "Authorization": f"Bearer {api_key}",
122
+ "Content-Type": "application/json",
123
+ }
124
+
125
+ try:
126
+ # Make the API request
127
+ async with httpx.AsyncClient() as client:
128
+ response = await client.post(
129
+ "http://sequencer.heurist.xyz/submit_job",
130
+ json=payload,
131
+ headers=headers,
132
+ timeout=180,
133
+ )
134
+ logger.debug(f"Heurist API response: {response.text}")
135
+ response.raise_for_status()
136
+
137
+ # Store the image URL
138
+ image_url = response.text.strip('"')
139
+ # Generate a key with agent ID as prefix
140
+ image_key = f"{context.agent.id}/heurist/{job_id}"
141
+ # Store the image and get the CDN URL
142
+ stored_url = await store_image(image_url, image_key)
143
+
144
+ # Return the stored image URL
145
+ return stored_url
146
+
147
+ except httpx.HTTPStatusError as e:
148
+ # Extract error details from response
149
+ try:
150
+ error_json = e.response.json()
151
+ error_code = error_json.get("error", "")
152
+ error_message = error_json.get("message", "")
153
+ full_error = f"Heurist API error: Error code: {error_code}, Message: {error_message}"
154
+ except Exception:
155
+ full_error = f"Heurist API error: {e}"
156
+
157
+ logger.error(full_error)
158
+ raise Exception(full_error)
159
+
160
+ except Exception as e:
161
+ logger.error(f"Error generating image with Heurist: {e}")
162
+ raise Exception(f"Error generating image with Heurist: {str(e)}")