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,191 @@
1
+ import logging
2
+ import time
3
+ from datetime import datetime, timedelta, timezone
4
+ from decimal import Decimal
5
+ from typing import Dict
6
+
7
+ from sqlalchemy import func, select, text
8
+
9
+ from intentkit.models.agent import Agent
10
+ from intentkit.models.credit import CreditEventTable, EventType, UpstreamType
11
+ from intentkit.models.db import get_session
12
+ from intentkit.utils.error import IntentKitAPIError
13
+
14
+ logger = logging.getLogger(__name__)
15
+
16
+
17
+ async def agent_action_cost(agent_id: str) -> Dict[str, Decimal]:
18
+ """
19
+ Calculate various action cost metrics for an agent based on past three days of credit events.
20
+
21
+ Metrics calculated:
22
+ - avg_action_cost: average cost per action
23
+ - min_action_cost: minimum cost per action
24
+ - max_action_cost: maximum cost per action
25
+ - low_action_cost: average cost of the lowest 20% of actions
26
+ - medium_action_cost: average cost of the middle 60% of actions
27
+ - high_action_cost: average cost of the highest 20% of actions
28
+
29
+ Args:
30
+ agent_id: ID of the agent
31
+
32
+ Returns:
33
+ Dict[str, Decimal]: Dictionary containing all calculated cost metrics
34
+ """
35
+ start_time = time.time()
36
+ default_value = Decimal("0")
37
+
38
+ agent = await Agent.get(agent_id)
39
+ if not agent:
40
+ raise IntentKitAPIError(
41
+ 400, "AgentNotFound", f"Agent with ID {agent_id} does not exist."
42
+ )
43
+
44
+ async with get_session() as session:
45
+ # Calculate the date 3 days ago from now
46
+ three_days_ago = datetime.now(timezone.utc) - timedelta(days=3)
47
+
48
+ # First, count the number of distinct start_message_ids to determine if we have enough data
49
+ count_query = select(
50
+ func.count(func.distinct(CreditEventTable.start_message_id))
51
+ ).where(
52
+ CreditEventTable.agent_id == agent_id,
53
+ CreditEventTable.created_at >= three_days_ago,
54
+ CreditEventTable.user_id != agent.owner,
55
+ CreditEventTable.upstream_type == UpstreamType.EXECUTOR,
56
+ CreditEventTable.event_type.in_([EventType.MESSAGE, EventType.SKILL_CALL]),
57
+ CreditEventTable.start_message_id.is_not(None),
58
+ )
59
+
60
+ result = await session.execute(count_query)
61
+ record_count = result.scalar_one()
62
+
63
+ # If we have fewer than 10 records, return default values
64
+ if record_count < 10:
65
+ time_cost = time.time() - start_time
66
+ logger.info(
67
+ f"agent_action_cost for {agent_id}: using default values (insufficient records: {record_count}) timeCost={time_cost:.3f}s"
68
+ )
69
+ return {
70
+ "avg_action_cost": default_value,
71
+ "min_action_cost": default_value,
72
+ "max_action_cost": default_value,
73
+ "low_action_cost": default_value,
74
+ "medium_action_cost": default_value,
75
+ "high_action_cost": default_value,
76
+ }
77
+
78
+ # Calculate the basic metrics (avg, min, max) directly in PostgreSQL
79
+ basic_metrics_query = text("""
80
+ WITH action_sums AS (
81
+ SELECT start_message_id, SUM(total_amount) AS action_cost
82
+ FROM credit_events
83
+ WHERE agent_id = :agent_id
84
+ AND created_at >= :three_days_ago
85
+ AND upstream_type = :upstream_type
86
+ AND event_type IN (:event_type_message, :event_type_skill_call)
87
+ AND start_message_id IS NOT NULL
88
+ GROUP BY start_message_id
89
+ )
90
+ SELECT
91
+ AVG(action_cost) AS avg_cost,
92
+ MIN(action_cost) AS min_cost,
93
+ MAX(action_cost) AS max_cost
94
+ FROM action_sums
95
+ """)
96
+
97
+ # Calculate the percentile-based metrics (low, medium, high) using window functions
98
+ percentile_metrics_query = text("""
99
+ WITH action_sums AS (
100
+ SELECT
101
+ start_message_id,
102
+ SUM(total_amount) AS action_cost,
103
+ NTILE(5) OVER (ORDER BY SUM(total_amount)) AS quintile
104
+ FROM credit_events
105
+ WHERE agent_id = :agent_id
106
+ AND created_at >= :three_days_ago
107
+ AND upstream_type = :upstream_type
108
+ AND event_type IN (:event_type_message, :event_type_skill_call)
109
+ AND start_message_id IS NOT NULL
110
+ GROUP BY start_message_id
111
+ )
112
+ SELECT
113
+ (SELECT AVG(action_cost) FROM action_sums WHERE quintile = 1) AS low_cost,
114
+ (SELECT AVG(action_cost) FROM action_sums WHERE quintile IN (2, 3, 4)) AS medium_cost,
115
+ (SELECT AVG(action_cost) FROM action_sums WHERE quintile = 5) AS high_cost
116
+ FROM action_sums
117
+ LIMIT 1
118
+ """)
119
+
120
+ # Bind parameters to prevent SQL injection and ensure correct types
121
+ params = {
122
+ "agent_id": agent_id,
123
+ "three_days_ago": three_days_ago,
124
+ "upstream_type": UpstreamType.EXECUTOR,
125
+ "event_type_message": EventType.MESSAGE,
126
+ "event_type_skill_call": EventType.SKILL_CALL,
127
+ }
128
+
129
+ # Execute the basic metrics query
130
+ basic_result = await session.execute(basic_metrics_query, params)
131
+ basic_row = basic_result.fetchone()
132
+
133
+ # Execute the percentile metrics query
134
+ percentile_result = await session.execute(percentile_metrics_query, params)
135
+ percentile_row = percentile_result.fetchone()
136
+
137
+ # If no results, return the default values
138
+ if not basic_row or basic_row[0] is None:
139
+ time_cost = time.time() - start_time
140
+ logger.info(
141
+ f"agent_action_cost for {agent_id}: using default values (no action costs found) timeCost={time_cost:.3f}s"
142
+ )
143
+ return {
144
+ "avg_action_cost": default_value,
145
+ "min_action_cost": default_value,
146
+ "max_action_cost": default_value,
147
+ "low_action_cost": default_value,
148
+ "medium_action_cost": default_value,
149
+ "high_action_cost": default_value,
150
+ }
151
+
152
+ # Extract and convert the values to Decimal for consistent precision
153
+ avg_cost = Decimal(str(basic_row[0] or 0)).quantize(Decimal("0.0001"))
154
+ min_cost = Decimal(str(basic_row[1] or 0)).quantize(Decimal("0.0001"))
155
+ max_cost = Decimal(str(basic_row[2] or 0)).quantize(Decimal("0.0001"))
156
+
157
+ # Extract percentile-based metrics
158
+ low_cost = (
159
+ Decimal(str(percentile_row[0] or 0)).quantize(Decimal("0.0001"))
160
+ if percentile_row and percentile_row[0] is not None
161
+ else default_value
162
+ )
163
+ medium_cost = (
164
+ Decimal(str(percentile_row[1] or 0)).quantize(Decimal("0.0001"))
165
+ if percentile_row and percentile_row[1] is not None
166
+ else default_value
167
+ )
168
+ high_cost = (
169
+ Decimal(str(percentile_row[2] or 0)).quantize(Decimal("0.0001"))
170
+ if percentile_row and percentile_row[2] is not None
171
+ else default_value
172
+ )
173
+
174
+ # Create the result dictionary
175
+ result = {
176
+ "avg_action_cost": avg_cost,
177
+ "min_action_cost": min_cost,
178
+ "max_action_cost": max_cost,
179
+ "low_action_cost": low_cost,
180
+ "medium_action_cost": medium_cost,
181
+ "high_action_cost": high_cost,
182
+ }
183
+
184
+ time_cost = time.time() - start_time
185
+ logger.info(
186
+ f"agent_action_cost for {agent_id}: avg={avg_cost}, min={min_cost}, max={max_cost}, "
187
+ f"low={low_cost}, medium={medium_cost}, high={high_cost} "
188
+ f"(records: {record_count}) timeCost={time_cost:.3f}s"
189
+ )
190
+
191
+ return result
intentkit/core/api.py ADDED
@@ -0,0 +1,40 @@
1
+ """Core API Router.
2
+
3
+ This module provides the core API endpoints for agent execution and management.
4
+ """
5
+
6
+ from typing import Annotated
7
+
8
+ from fastapi import APIRouter, Body
9
+ from pydantic import AfterValidator
10
+
11
+ from intentkit.core.engine import execute_agent
12
+ from intentkit.models.chat import ChatMessage, ChatMessageCreate
13
+
14
+ core_router = APIRouter(prefix="/core", tags=["Core"])
15
+
16
+
17
+ @core_router.post("/execute", response_model=list[ChatMessage])
18
+ async def execute(
19
+ message: Annotated[
20
+ ChatMessageCreate, AfterValidator(ChatMessageCreate.model_validate)
21
+ ] = Body(
22
+ ChatMessageCreate,
23
+ description="The chat message containing agent_id, chat_id and message content",
24
+ ),
25
+ ) -> list[ChatMessage]:
26
+ """Execute an agent with the given input and return response lines.
27
+
28
+ **Request Body:**
29
+ * `message` - The chat message containing agent_id, chat_id and message content
30
+
31
+ **Returns:**
32
+ * `list[ChatMessage]` - Formatted response lines from agent execution
33
+
34
+ **Raises:**
35
+ * `HTTPException`:
36
+ - 400: If input parameters are invalid
37
+ - 404: If agent not found
38
+ - 500: For other server-side errors
39
+ """
40
+ return await execute_agent(message)
@@ -0,0 +1,45 @@
1
+ """Core Client Module.
2
+
3
+ This module provides client functions for core API endpoints with environment-aware routing.
4
+ """
5
+
6
+ import httpx
7
+
8
+ from intentkit.config.config import config
9
+ from intentkit.core.engine import execute_agent as local_execute_agent
10
+ from intentkit.models.chat import ChatMessage, ChatMessageCreate
11
+
12
+
13
+ async def execute_agent(
14
+ message: ChatMessageCreate, debug: bool = False
15
+ ) -> list[ChatMessage]:
16
+ """Execute an agent with environment-aware routing.
17
+
18
+ In local environment, directly calls the local execute_agent function.
19
+ In other environments, makes HTTP request to the core API endpoint.
20
+
21
+ Args:
22
+ message (ChatMessage): The chat message containing agent_id, chat_id and message content
23
+ debug (bool): Enable debug mode
24
+
25
+ Returns:
26
+ list[ChatMessage]: Formatted response lines from agent execution
27
+
28
+ Raises:
29
+ HTTPException: For API errors (in non-local environment)
30
+ Exception: For other execution errors
31
+ """
32
+ if config.env == "local":
33
+ return await local_execute_agent(message, debug)
34
+
35
+ # Make HTTP request in non-local environment
36
+ url = f"{config.internal_base_url}/core/execute"
37
+ async with httpx.AsyncClient() as client:
38
+ response = await client.post(
39
+ url,
40
+ json=message.model_dump(mode="json"),
41
+ timeout=180,
42
+ )
43
+ response.raise_for_status()
44
+ json_data = response.json()
45
+ return [ChatMessage.model_validate(msg) for msg in json_data]