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,24 +1,19 @@
1
+ from __future__ import annotations
2
+
1
3
  import logging
2
- from datetime import datetime, timezone
4
+ from datetime import UTC, datetime
3
5
  from decimal import Decimal
4
- from typing import Annotated, Any, Dict, Optional
6
+ from typing import Annotated, Any
5
7
 
6
- from fastapi import HTTPException
7
- from intentkit.models.base import Base
8
- from intentkit.models.db import get_session
9
8
  from pydantic import BaseModel, ConfigDict
10
9
  from pydantic import Field as PydanticField
11
- from sqlalchemy import (
12
- BigInteger,
13
- Boolean,
14
- Column,
15
- DateTime,
16
- Numeric,
17
- String,
18
- func,
19
- select,
20
- )
10
+ from sqlalchemy import BigInteger, Boolean, DateTime, Numeric, String, func, select
21
11
  from sqlalchemy.dialects.postgresql import JSON, JSONB
12
+ from sqlalchemy.orm import Mapped, mapped_column
13
+
14
+ from intentkit.models.base import Base
15
+ from intentkit.models.db import get_session
16
+ from intentkit.utils.error import IntentKitAPIError
22
17
 
23
18
  logger = logging.getLogger(__name__)
24
19
 
@@ -28,56 +23,87 @@ class AgentDataTable(Base):
28
23
 
29
24
  __tablename__ = "agent_data"
30
25
 
31
- id = Column(String, primary_key=True, comment="Same as Agent.id")
32
- evm_wallet_address = Column(String, nullable=True, comment="EVM wallet address")
33
- solana_wallet_address = Column(
26
+ id: Mapped[str] = mapped_column(
27
+ String, primary_key=True, comment="Same as Agent.id"
28
+ )
29
+ evm_wallet_address: Mapped[str | None] = mapped_column(
30
+ String, nullable=True, comment="EVM wallet address"
31
+ )
32
+ solana_wallet_address: Mapped[str | None] = mapped_column(
34
33
  String, nullable=True, comment="Solana wallet address"
35
34
  )
36
- cdp_wallet_data = Column(String, nullable=True, comment="CDP wallet data")
37
- twitter_id = Column(String, nullable=True, comment="Twitter user ID")
38
- twitter_username = Column(String, nullable=True, comment="Twitter username")
39
- twitter_name = Column(String, nullable=True, comment="Twitter display name")
40
- twitter_access_token = Column(String, nullable=True, comment="Twitter access token")
41
- twitter_access_token_expires_at = Column(
35
+ cdp_wallet_data: Mapped[str | None] = mapped_column(
36
+ String, nullable=True, comment="CDP wallet data"
37
+ )
38
+ twitter_id: Mapped[str | None] = mapped_column(
39
+ String, nullable=True, comment="Twitter user ID"
40
+ )
41
+ twitter_username: Mapped[str | None] = mapped_column(
42
+ String, nullable=True, comment="Twitter username"
43
+ )
44
+ twitter_name: Mapped[str | None] = mapped_column(
45
+ String, nullable=True, comment="Twitter display name"
46
+ )
47
+ twitter_access_token: Mapped[str | None] = mapped_column(
48
+ String, nullable=True, comment="Twitter access token"
49
+ )
50
+ twitter_access_token_expires_at: Mapped[datetime | None] = mapped_column(
42
51
  DateTime(timezone=True),
43
52
  nullable=True,
44
53
  comment="Twitter access token expiration time",
45
54
  )
46
- twitter_refresh_token = Column(
55
+ twitter_refresh_token: Mapped[str | None] = mapped_column(
47
56
  String, nullable=True, comment="Twitter refresh token"
48
57
  )
49
- twitter_self_key_refreshed_at = Column(
58
+ twitter_self_key_refreshed_at: Mapped[datetime | None] = mapped_column(
50
59
  DateTime(timezone=True),
51
60
  nullable=True,
52
61
  comment="Twitter self-key userinfo last refresh time",
53
62
  )
54
- twitter_is_verified = Column(
63
+ twitter_is_verified: Mapped[bool] = mapped_column(
55
64
  Boolean,
56
65
  nullable=False,
57
66
  default=False,
58
67
  comment="Whether the Twitter account is verified",
59
68
  )
60
- telegram_id = Column(String, nullable=True, comment="Telegram user ID")
61
- telegram_username = Column(String, nullable=True, comment="Telegram username")
62
- telegram_name = Column(String, nullable=True, comment="Telegram display name")
63
- error_message = Column(String, nullable=True, comment="Last error message")
64
- api_key = Column(
69
+ telegram_id: Mapped[str | None] = mapped_column(
70
+ String, nullable=True, comment="Telegram user ID"
71
+ )
72
+ telegram_username: Mapped[str | None] = mapped_column(
73
+ String, nullable=True, comment="Telegram username"
74
+ )
75
+ telegram_name: Mapped[str | None] = mapped_column(
76
+ String, nullable=True, comment="Telegram display name"
77
+ )
78
+ discord_id: Mapped[str | None] = mapped_column(
79
+ String, nullable=True, comment="Discord user ID"
80
+ )
81
+ discord_username: Mapped[str | None] = mapped_column(
82
+ String, nullable=True, comment="Discord username"
83
+ )
84
+ discord_name: Mapped[str | None] = mapped_column(
85
+ String, nullable=True, comment="Discord display name"
86
+ )
87
+ error_message: Mapped[str | None] = mapped_column(
88
+ String, nullable=True, comment="Last error message"
89
+ )
90
+ api_key: Mapped[str | None] = mapped_column(
65
91
  String, nullable=True, unique=True, comment="API key for the agent"
66
92
  )
67
- api_key_public = Column(
93
+ api_key_public: Mapped[str | None] = mapped_column(
68
94
  String, nullable=True, unique=True, comment="Public API key for the agent"
69
95
  )
70
- created_at = Column(
96
+ created_at: Mapped[datetime] = mapped_column(
71
97
  DateTime(timezone=True),
72
98
  nullable=False,
73
99
  server_default=func.now(),
74
100
  comment="Timestamp when the agent data was created",
75
101
  )
76
- updated_at = Column(
102
+ updated_at: Mapped[datetime] = mapped_column(
77
103
  DateTime(timezone=True),
78
104
  nullable=False,
79
105
  server_default=func.now(),
80
- onupdate=lambda: datetime.now(timezone.utc),
106
+ onupdate=lambda: datetime.now(UTC),
81
107
  comment="Timestamp when the agent data was last updated",
82
108
  )
83
109
 
@@ -94,70 +120,70 @@ class AgentData(BaseModel):
94
120
  ),
95
121
  ]
96
122
  evm_wallet_address: Annotated[
97
- Optional[str],
123
+ str | None,
98
124
  PydanticField(
99
125
  default=None,
100
126
  description="EVM wallet address",
101
127
  ),
102
128
  ] = None
103
129
  solana_wallet_address: Annotated[
104
- Optional[str],
130
+ str | None,
105
131
  PydanticField(
106
132
  default=None,
107
133
  description="Solana wallet address",
108
134
  ),
109
135
  ] = None
110
136
  cdp_wallet_data: Annotated[
111
- Optional[str],
137
+ str | None,
112
138
  PydanticField(
113
139
  default=None,
114
140
  description="CDP wallet data",
115
141
  ),
116
142
  ] = None
117
143
  twitter_id: Annotated[
118
- Optional[str],
144
+ str | None,
119
145
  PydanticField(
120
146
  default=None,
121
147
  description="Twitter user ID",
122
148
  ),
123
149
  ] = None
124
150
  twitter_username: Annotated[
125
- Optional[str],
151
+ str | None,
126
152
  PydanticField(
127
153
  default=None,
128
154
  description="Twitter username",
129
155
  ),
130
156
  ] = None
131
157
  twitter_name: Annotated[
132
- Optional[str],
158
+ str | None,
133
159
  PydanticField(
134
160
  default=None,
135
161
  description="Twitter display name",
136
162
  ),
137
163
  ] = None
138
164
  twitter_access_token: Annotated[
139
- Optional[str],
165
+ str | None,
140
166
  PydanticField(
141
167
  default=None,
142
168
  description="Twitter access token",
143
169
  ),
144
170
  ] = None
145
171
  twitter_access_token_expires_at: Annotated[
146
- Optional[datetime],
172
+ datetime | None,
147
173
  PydanticField(
148
174
  default=None,
149
175
  description="Twitter access token expiration time",
150
176
  ),
151
177
  ] = None
152
178
  twitter_refresh_token: Annotated[
153
- Optional[str],
179
+ str | None,
154
180
  PydanticField(
155
181
  default=None,
156
182
  description="Twitter refresh token",
157
183
  ),
158
184
  ] = None
159
185
  twitter_self_key_refreshed_at: Annotated[
160
- Optional[datetime],
186
+ datetime | None,
161
187
  PydanticField(
162
188
  default=None,
163
189
  description="Twitter self-key userinfo last refresh time",
@@ -171,42 +197,63 @@ class AgentData(BaseModel):
171
197
  ),
172
198
  ] = None
173
199
  telegram_id: Annotated[
174
- Optional[str],
200
+ str | None,
175
201
  PydanticField(
176
202
  default=None,
177
203
  description="Telegram user ID",
178
204
  ),
179
205
  ] = None
180
206
  telegram_username: Annotated[
181
- Optional[str],
207
+ str | None,
182
208
  PydanticField(
183
209
  default=None,
184
210
  description="Telegram username",
185
211
  ),
186
212
  ] = None
187
213
  telegram_name: Annotated[
188
- Optional[str],
214
+ str | None,
189
215
  PydanticField(
190
216
  default=None,
191
217
  description="Telegram display name",
192
218
  ),
193
219
  ] = None
220
+ discord_id: Annotated[
221
+ str | None,
222
+ PydanticField(
223
+ default=None,
224
+ description="Discord user ID",
225
+ ),
226
+ ] = None
227
+ discord_username: Annotated[
228
+ str | None,
229
+ PydanticField(
230
+ default=None,
231
+ description="Discord username",
232
+ ),
233
+ ] = None
234
+ discord_name: Annotated[
235
+ str | None,
236
+ PydanticField(
237
+ default=None,
238
+ description="Discord display name",
239
+ ),
240
+ ] = None
194
241
  error_message: Annotated[
195
- Optional[str],
242
+ str | None,
196
243
  PydanticField(
197
244
  default=None,
198
245
  description="Last error message",
199
246
  ),
200
247
  ] = None
201
248
  api_key: Annotated[
202
- Optional[str],
249
+ str | None,
203
250
  PydanticField(
204
251
  default=None,
205
252
  description="API key for the agent",
206
253
  ),
207
254
  ] = None
208
255
  api_key_public: Annotated[
209
- Optional[str],
256
+ str | None,
210
257
  PydanticField(
211
258
  default=None,
212
259
  description="Public API key for the agent",
@@ -215,14 +262,14 @@ class AgentData(BaseModel):
215
262
  created_at: Annotated[
216
263
  datetime,
217
264
  PydanticField(
218
- default_factory=lambda: datetime.now(timezone.utc),
265
+ default_factory=lambda: datetime.now(UTC),
219
266
  description="Timestamp when the agent data was created",
220
267
  ),
221
268
  ]
222
269
  updated_at: Annotated[
223
270
  datetime,
224
271
  PydanticField(
225
- default_factory=lambda: datetime.now(timezone.utc),
272
+ default_factory=lambda: datetime.now(UTC),
226
273
  description="Timestamp when the agent data was last updated",
227
274
  ),
228
275
  ]
@@ -247,7 +294,7 @@ class AgentData(BaseModel):
247
294
  return cls.model_construct(id=agent_id)
248
295
 
249
296
  @classmethod
250
- async def get_by_api_key(cls, api_key: str) -> Optional["AgentData"]:
297
+ async def get_by_api_key(cls, api_key: str) -> AgentData | None:
251
298
  """Get agent data by API key.
252
299
 
253
300
  Args:
@@ -343,20 +390,22 @@ class AgentPluginDataTable(Base):
343
390
 
344
391
  __tablename__ = "agent_plugin_data"
345
392
 
346
- agent_id = Column(String, primary_key=True)
347
- plugin = Column(String, primary_key=True)
348
- key = Column(String, primary_key=True)
349
- data = Column(JSON().with_variant(JSONB(), "postgresql"), nullable=True)
350
- created_at = Column(
393
+ agent_id: Mapped[str] = mapped_column(String, primary_key=True)
394
+ plugin: Mapped[str] = mapped_column(String, primary_key=True)
395
+ key: Mapped[str] = mapped_column(String, primary_key=True)
396
+ data: Mapped[dict[str, Any] | None] = mapped_column(
397
+ JSON().with_variant(JSONB(), "postgresql"), nullable=True
398
+ )
399
+ created_at: Mapped[datetime] = mapped_column(
351
400
  DateTime(timezone=True),
352
401
  nullable=False,
353
402
  server_default=func.now(),
354
403
  )
355
- updated_at = Column(
404
+ updated_at: Mapped[datetime] = mapped_column(
356
405
  DateTime(timezone=True),
357
406
  nullable=False,
358
407
  server_default=func.now(),
359
- onupdate=lambda: datetime.now(timezone.utc),
408
+ onupdate=lambda: datetime.now(UTC),
360
409
  )
361
410
 
362
411
 
@@ -388,28 +437,28 @@ class AgentPluginData(BaseModel):
388
437
  PydanticField(description="Key for this specific piece of data"),
389
438
  ]
390
439
  data: Annotated[
391
- Dict[str, Any],
440
+ dict[str, Any],
392
441
  PydanticField(default=None, description="JSON data stored for this key"),
393
442
  ]
394
443
  created_at: Annotated[
395
444
  datetime,
396
445
  PydanticField(
397
446
  description="Timestamp when this data was created",
398
- default_factory=lambda: datetime.now(timezone.utc),
447
+ default_factory=lambda: datetime.now(UTC),
399
448
  ),
400
449
  ]
401
450
  updated_at: Annotated[
402
451
  datetime,
403
452
  PydanticField(
404
453
  description="Timestamp when this data was last updated",
405
- default_factory=lambda: datetime.now(timezone.utc),
454
+ default_factory=lambda: datetime.now(UTC),
406
455
  ),
407
456
  ]
408
457
 
409
458
  @classmethod
410
459
  async def get(
411
460
  cls, agent_id: str, plugin: str, key: str
412
- ) -> Optional["AgentPluginData"]:
461
+ ) -> "AgentPluginData" | None:
413
462
  """Get plugin data for an agent.
414
463
 
415
464
  Args:
@@ -476,44 +525,50 @@ class AgentQuotaTable(Base):
476
525
 
477
526
  __tablename__ = "agent_quotas"
478
527
 
479
- id = Column(String, primary_key=True)
480
- plan = Column(String, default="self-hosted")
481
- message_count_total = Column(BigInteger, default=0)
482
- message_limit_total = Column(BigInteger, default=99999999)
483
- message_count_monthly = Column(BigInteger, default=0)
484
- message_limit_monthly = Column(BigInteger, default=99999999)
485
- message_count_daily = Column(BigInteger, default=0)
486
- message_limit_daily = Column(BigInteger, default=99999999)
487
- last_message_time = Column(DateTime(timezone=True), default=None, nullable=True)
488
- autonomous_count_total = Column(BigInteger, default=0)
489
- autonomous_limit_total = Column(BigInteger, default=99999999)
490
- autonomous_count_monthly = Column(BigInteger, default=0)
491
- autonomous_limit_monthly = Column(BigInteger, default=99999999)
492
- last_autonomous_time = Column(DateTime(timezone=True), default=None, nullable=True)
493
- twitter_count_total = Column(BigInteger, default=0)
494
- twitter_limit_total = Column(BigInteger, default=99999999)
495
- twitter_count_monthly = Column(BigInteger, default=0)
496
- twitter_limit_monthly = Column(BigInteger, default=99999999)
497
- twitter_count_daily = Column(BigInteger, default=0)
498
- twitter_limit_daily = Column(BigInteger, default=99999999)
499
- last_twitter_time = Column(DateTime(timezone=True), default=None, nullable=True)
500
- free_income_daily = Column(Numeric(22, 4), default=0)
501
- avg_action_cost = Column(Numeric(22, 4), default=0)
502
- min_action_cost = Column(Numeric(22, 4), default=0)
503
- max_action_cost = Column(Numeric(22, 4), default=0)
504
- low_action_cost = Column(Numeric(22, 4), default=0)
505
- medium_action_cost = Column(Numeric(22, 4), default=0)
506
- high_action_cost = Column(Numeric(22, 4), default=0)
507
- created_at = Column(
528
+ id: Mapped[str] = mapped_column(String, primary_key=True)
529
+ plan: Mapped[str] = mapped_column(String, default="self-hosted")
530
+ message_count_total: Mapped[int] = mapped_column(BigInteger, default=0)
531
+ message_limit_total: Mapped[int] = mapped_column(BigInteger, default=99999999)
532
+ message_count_monthly: Mapped[int] = mapped_column(BigInteger, default=0)
533
+ message_limit_monthly: Mapped[int] = mapped_column(BigInteger, default=99999999)
534
+ message_count_daily: Mapped[int] = mapped_column(BigInteger, default=0)
535
+ message_limit_daily: Mapped[int] = mapped_column(BigInteger, default=99999999)
536
+ last_message_time: Mapped[datetime | None] = mapped_column(
537
+ DateTime(timezone=True), default=None, nullable=True
538
+ )
539
+ autonomous_count_total: Mapped[int] = mapped_column(BigInteger, default=0)
540
+ autonomous_limit_total: Mapped[int] = mapped_column(BigInteger, default=99999999)
541
+ autonomous_count_monthly: Mapped[int] = mapped_column(BigInteger, default=0)
542
+ autonomous_limit_monthly: Mapped[int] = mapped_column(BigInteger, default=99999999)
543
+ last_autonomous_time: Mapped[datetime | None] = mapped_column(
544
+ DateTime(timezone=True), default=None, nullable=True
545
+ )
546
+ twitter_count_total: Mapped[int] = mapped_column(BigInteger, default=0)
547
+ twitter_limit_total: Mapped[int] = mapped_column(BigInteger, default=99999999)
548
+ twitter_count_monthly: Mapped[int] = mapped_column(BigInteger, default=0)
549
+ twitter_limit_monthly: Mapped[int] = mapped_column(BigInteger, default=99999999)
550
+ twitter_count_daily: Mapped[int] = mapped_column(BigInteger, default=0)
551
+ twitter_limit_daily: Mapped[int] = mapped_column(BigInteger, default=99999999)
552
+ last_twitter_time: Mapped[datetime | None] = mapped_column(
553
+ DateTime(timezone=True), default=None, nullable=True
554
+ )
555
+ free_income_daily: Mapped[Decimal] = mapped_column(Numeric(22, 4), default=0)
556
+ avg_action_cost: Mapped[Decimal] = mapped_column(Numeric(22, 4), default=0)
557
+ min_action_cost: Mapped[Decimal] = mapped_column(Numeric(22, 4), default=0)
558
+ max_action_cost: Mapped[Decimal] = mapped_column(Numeric(22, 4), default=0)
559
+ low_action_cost: Mapped[Decimal] = mapped_column(Numeric(22, 4), default=0)
560
+ medium_action_cost: Mapped[Decimal] = mapped_column(Numeric(22, 4), default=0)
561
+ high_action_cost: Mapped[Decimal] = mapped_column(Numeric(22, 4), default=0)
562
+ created_at: Mapped[datetime] = mapped_column(
508
563
  DateTime(timezone=True),
509
564
  nullable=False,
510
565
  server_default=func.now(),
511
566
  )
512
- updated_at = Column(
567
+ updated_at: Mapped[datetime] = mapped_column(
513
568
  DateTime(timezone=True),
514
569
  nullable=False,
515
570
  server_default=func.now(),
516
- onupdate=lambda: datetime.now(timezone.utc),
571
+ onupdate=lambda: datetime.now(UTC),
517
572
  )
518
573
 
519
574
 
@@ -547,7 +602,7 @@ class AgentQuota(BaseModel):
547
602
  int, PydanticField(default=99999999, description="Daily message limit")
548
603
  ]
549
604
  last_message_time: Annotated[
550
- Optional[datetime],
605
+ datetime | None,
551
606
  PydanticField(default=None, description="Last message timestamp"),
552
607
  ]
553
608
  autonomous_count_total: Annotated[
@@ -578,7 +633,7 @@ class AgentQuota(BaseModel):
578
633
  ),
579
634
  ]
580
635
  last_autonomous_time: Annotated[
581
- Optional[datetime],
636
+ datetime | None,
582
637
  PydanticField(default=None, description="Last autonomous operation timestamp"),
583
638
  ]
584
639
  twitter_count_total: Annotated[
@@ -603,7 +658,7 @@ class AgentQuota(BaseModel):
603
658
  PydanticField(default=99999999, description="Daily Twitter operations limit"),
604
659
  ]
605
660
  last_twitter_time: Annotated[
606
- Optional[datetime],
661
+ datetime | None,
607
662
  PydanticField(default=None, description="Last Twitter operation timestamp"),
608
663
  ]
609
664
  free_income_daily: Annotated[
@@ -638,14 +693,14 @@ class AgentQuota(BaseModel):
638
693
  datetime,
639
694
  PydanticField(
640
695
  description="Timestamp when this quota was created",
641
- default_factory=lambda: datetime.now(timezone.utc),
696
+ default_factory=lambda: datetime.now(UTC),
642
697
  ),
643
698
  ]
644
699
  updated_at: Annotated[
645
700
  datetime,
646
701
  PydanticField(
647
702
  description="Timestamp when this quota was last updated",
648
- default_factory=lambda: datetime.now(timezone.utc),
703
+ default_factory=lambda: datetime.now(UTC),
649
704
  ),
650
705
  ]
651
706
 
@@ -754,7 +809,11 @@ class AgentQuota(BaseModel):
754
809
  await session.execute(stmt)
755
810
  except Exception as e:
756
811
  logger.error(f"Error adding free income: {str(e)}")
757
- raise HTTPException(status_code=500, detail=f"Database error: {str(e)}")
812
+ raise IntentKitAPIError(
813
+ status_code=500,
814
+ key="DatabaseError",
815
+ message=f"Database error: {str(e)}",
816
+ )
758
817
 
759
818
  async def add_message(self) -> None:
760
819
  """Add a message to the agent's message count."""
@@ -766,7 +825,7 @@ class AgentQuota(BaseModel):
766
825
  quota_record.message_count_total += 1
767
826
  quota_record.message_count_monthly += 1
768
827
  quota_record.message_count_daily += 1
769
- quota_record.last_message_time = datetime.now(timezone.utc)
828
+ quota_record.last_message_time = datetime.now(UTC)
770
829
  db.add(quota_record)
771
830
  await db.commit()
772
831
 
@@ -786,7 +845,7 @@ class AgentQuota(BaseModel):
786
845
  # Update record
787
846
  quota_record.autonomous_count_total += 1
788
847
  quota_record.autonomous_count_monthly += 1
789
- quota_record.last_autonomous_time = datetime.now(timezone.utc)
848
+ quota_record.last_autonomous_time = datetime.now(UTC)
790
849
  db.add(quota_record)
791
850
  await db.commit()
792
851
 
@@ -807,7 +866,7 @@ class AgentQuota(BaseModel):
807
866
  # Update record
808
867
  quota_record.twitter_count_total += 1
809
868
  quota_record.twitter_count_daily += 1
810
- quota_record.last_twitter_time = datetime.now(timezone.utc)
869
+ quota_record.last_twitter_time = datetime.now(UTC)
811
870
  db.add(quota_record)
812
871
  await db.commit()
813
872