intentkit 0.8.6.dev2__py3-none-any.whl → 0.8.17__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of intentkit might be problematic. Click here for more details.

Files changed (312) hide show
  1. intentkit/__init__.py +1 -1
  2. intentkit/abstracts/agent.py +4 -5
  3. intentkit/abstracts/engine.py +5 -5
  4. intentkit/abstracts/graph.py +10 -5
  5. intentkit/abstracts/skill.py +6 -144
  6. intentkit/abstracts/twitter.py +4 -5
  7. intentkit/clients/__init__.py +3 -2
  8. intentkit/clients/cdp.py +53 -92
  9. intentkit/clients/twitter.py +56 -57
  10. intentkit/clients/web3.py +1 -3
  11. intentkit/config/config.py +5 -0
  12. intentkit/core/agent.py +16 -388
  13. intentkit/core/asset.py +64 -18
  14. intentkit/core/client.py +1 -1
  15. intentkit/core/credit.py +19 -20
  16. intentkit/core/engine.py +26 -11
  17. intentkit/core/node.py +2 -1
  18. intentkit/core/prompt.py +53 -15
  19. intentkit/core/scheduler.py +9 -9
  20. intentkit/core/statistics.py +6 -7
  21. intentkit/models/agent.py +256 -176
  22. intentkit/models/agent_data.py +62 -36
  23. intentkit/models/agent_schema.json +6 -9
  24. intentkit/models/app_setting.py +6 -6
  25. intentkit/models/chat.py +28 -24
  26. intentkit/models/conversation.py +8 -8
  27. intentkit/models/credit.py +62 -64
  28. intentkit/models/db.py +8 -7
  29. intentkit/models/db_mig.py +2 -2
  30. intentkit/models/llm.csv +15 -12
  31. intentkit/models/llm.py +18 -16
  32. intentkit/models/redis.py +2 -3
  33. intentkit/models/skill.py +62 -66
  34. intentkit/models/skills.csv +30 -26
  35. intentkit/models/user.py +46 -21
  36. intentkit/skills/acolyt/__init__.py +2 -9
  37. intentkit/skills/acolyt/ask.py +3 -4
  38. intentkit/skills/acolyt/base.py +4 -9
  39. intentkit/skills/aixbt/__init__.py +2 -13
  40. intentkit/skills/aixbt/base.py +1 -7
  41. intentkit/skills/aixbt/projects.py +14 -15
  42. intentkit/skills/allora/__init__.py +2 -9
  43. intentkit/skills/allora/base.py +4 -9
  44. intentkit/skills/allora/price.py +3 -4
  45. intentkit/skills/base.py +175 -52
  46. intentkit/skills/basename/__init__.py +4 -8
  47. intentkit/skills/carv/__init__.py +115 -121
  48. intentkit/skills/carv/base.py +184 -185
  49. intentkit/skills/carv/fetch_news.py +3 -3
  50. intentkit/skills/carv/onchain_query.py +4 -4
  51. intentkit/skills/carv/token_info_and_price.py +5 -5
  52. intentkit/skills/casino/__init__.py +4 -15
  53. intentkit/skills/casino/base.py +1 -7
  54. intentkit/skills/casino/deck_draw.py +5 -8
  55. intentkit/skills/casino/deck_shuffle.py +6 -6
  56. intentkit/skills/casino/dice_roll.py +2 -4
  57. intentkit/skills/cdp/__init__.py +3 -10
  58. intentkit/skills/cdp/base.py +1 -7
  59. intentkit/skills/cdp/schema.json +1 -17
  60. intentkit/skills/chainlist/__init__.py +2 -7
  61. intentkit/skills/chainlist/base.py +1 -7
  62. intentkit/skills/chainlist/chain_lookup.py +18 -18
  63. intentkit/skills/common/__init__.py +2 -9
  64. intentkit/skills/common/base.py +1 -7
  65. intentkit/skills/common/current_time.py +1 -2
  66. intentkit/skills/cookiefun/__init__.py +6 -9
  67. intentkit/skills/cookiefun/base.py +2 -7
  68. intentkit/skills/cookiefun/get_account_details.py +7 -7
  69. intentkit/skills/cookiefun/get_account_feed.py +19 -19
  70. intentkit/skills/cookiefun/get_account_smart_followers.py +7 -7
  71. intentkit/skills/cookiefun/get_sectors.py +3 -3
  72. intentkit/skills/cookiefun/search_accounts.py +9 -9
  73. intentkit/skills/cryptocompare/__init__.py +7 -24
  74. intentkit/skills/cryptocompare/api.py +2 -3
  75. intentkit/skills/cryptocompare/base.py +10 -24
  76. intentkit/skills/cryptocompare/fetch_news.py +4 -5
  77. intentkit/skills/cryptocompare/fetch_price.py +6 -7
  78. intentkit/skills/cryptocompare/fetch_top_exchanges.py +4 -5
  79. intentkit/skills/cryptocompare/fetch_top_market_cap.py +4 -5
  80. intentkit/skills/cryptocompare/fetch_top_volume.py +4 -5
  81. intentkit/skills/cryptocompare/fetch_trading_signals.py +5 -6
  82. intentkit/skills/cryptopanic/__init__.py +7 -10
  83. intentkit/skills/cryptopanic/base.py +51 -55
  84. intentkit/skills/cryptopanic/fetch_crypto_news.py +4 -8
  85. intentkit/skills/cryptopanic/fetch_crypto_sentiment.py +5 -7
  86. intentkit/skills/dapplooker/__init__.py +2 -9
  87. intentkit/skills/dapplooker/base.py +4 -9
  88. intentkit/skills/dapplooker/dapplooker_token_data.py +7 -7
  89. intentkit/skills/defillama/__init__.py +24 -74
  90. intentkit/skills/defillama/api.py +6 -9
  91. intentkit/skills/defillama/base.py +8 -19
  92. intentkit/skills/defillama/coins/fetch_batch_historical_prices.py +8 -10
  93. intentkit/skills/defillama/coins/fetch_block.py +6 -8
  94. intentkit/skills/defillama/coins/fetch_current_prices.py +8 -10
  95. intentkit/skills/defillama/coins/fetch_first_price.py +7 -9
  96. intentkit/skills/defillama/coins/fetch_historical_prices.py +9 -11
  97. intentkit/skills/defillama/coins/fetch_price_chart.py +9 -11
  98. intentkit/skills/defillama/coins/fetch_price_percentage.py +7 -9
  99. intentkit/skills/defillama/config/chains.py +1 -3
  100. intentkit/skills/defillama/fees/fetch_fees_overview.py +24 -26
  101. intentkit/skills/defillama/stablecoins/fetch_stablecoin_chains.py +16 -18
  102. intentkit/skills/defillama/stablecoins/fetch_stablecoin_charts.py +8 -10
  103. intentkit/skills/defillama/stablecoins/fetch_stablecoin_prices.py +5 -7
  104. intentkit/skills/defillama/stablecoins/fetch_stablecoins.py +7 -9
  105. intentkit/skills/defillama/tests/api_integration.test.py +1 -1
  106. intentkit/skills/defillama/tvl/fetch_chain_historical_tvl.py +4 -6
  107. intentkit/skills/defillama/tvl/fetch_chains.py +9 -11
  108. intentkit/skills/defillama/tvl/fetch_historical_tvl.py +4 -6
  109. intentkit/skills/defillama/tvl/fetch_protocol.py +32 -38
  110. intentkit/skills/defillama/tvl/fetch_protocol_current_tvl.py +3 -5
  111. intentkit/skills/defillama/tvl/fetch_protocols.py +37 -45
  112. intentkit/skills/defillama/volumes/fetch_dex_overview.py +42 -48
  113. intentkit/skills/defillama/volumes/fetch_dex_summary.py +35 -37
  114. intentkit/skills/defillama/volumes/fetch_options_overview.py +24 -28
  115. intentkit/skills/defillama/yields/fetch_pool_chart.py +10 -12
  116. intentkit/skills/defillama/yields/fetch_pools.py +26 -30
  117. intentkit/skills/dexscreener/__init__.py +97 -102
  118. intentkit/skills/dexscreener/base.py +125 -130
  119. intentkit/skills/dexscreener/get_pair_info.py +4 -5
  120. intentkit/skills/dexscreener/get_token_pairs.py +4 -5
  121. intentkit/skills/dexscreener/get_tokens_info.py +7 -8
  122. intentkit/skills/dexscreener/model/search_token_response.py +80 -82
  123. intentkit/skills/dexscreener/search_token.py +182 -184
  124. intentkit/skills/dexscreener/utils.py +15 -14
  125. intentkit/skills/dune_analytics/__init__.py +7 -9
  126. intentkit/skills/dune_analytics/base.py +48 -52
  127. intentkit/skills/dune_analytics/fetch_kol_buys.py +5 -7
  128. intentkit/skills/dune_analytics/fetch_nation_metrics.py +6 -8
  129. intentkit/skills/elfa/__init__.py +5 -18
  130. intentkit/skills/elfa/base.py +10 -14
  131. intentkit/skills/elfa/mention.py +19 -21
  132. intentkit/skills/elfa/stats.py +4 -4
  133. intentkit/skills/elfa/tokens.py +12 -12
  134. intentkit/skills/elfa/utils.py +26 -28
  135. intentkit/skills/enso/__init__.py +11 -31
  136. intentkit/skills/enso/base.py +9 -15
  137. intentkit/skills/enso/best_yield.py +5 -7
  138. intentkit/skills/enso/networks.py +3 -9
  139. intentkit/skills/enso/prices.py +2 -4
  140. intentkit/skills/enso/route.py +6 -12
  141. intentkit/skills/enso/tokens.py +4 -16
  142. intentkit/skills/enso/wallet.py +6 -6
  143. intentkit/skills/erc20/__init__.py +5 -11
  144. intentkit/skills/erc721/__init__.py +5 -9
  145. intentkit/skills/firecrawl/__init__.py +5 -18
  146. intentkit/skills/firecrawl/base.py +4 -9
  147. intentkit/skills/firecrawl/clear.py +4 -8
  148. intentkit/skills/firecrawl/crawl.py +19 -19
  149. intentkit/skills/firecrawl/query.py +4 -3
  150. intentkit/skills/firecrawl/scrape.py +17 -22
  151. intentkit/skills/firecrawl/utils.py +50 -42
  152. intentkit/skills/github/__init__.py +2 -7
  153. intentkit/skills/github/base.py +1 -7
  154. intentkit/skills/github/github_search.py +1 -2
  155. intentkit/skills/heurist/__init__.py +8 -27
  156. intentkit/skills/heurist/base.py +4 -9
  157. intentkit/skills/heurist/image_generation_animagine_xl.py +12 -13
  158. intentkit/skills/heurist/image_generation_arthemy_comics.py +12 -13
  159. intentkit/skills/heurist/image_generation_arthemy_real.py +12 -13
  160. intentkit/skills/heurist/image_generation_braindance.py +12 -13
  161. intentkit/skills/heurist/image_generation_cyber_realistic_xl.py +12 -13
  162. intentkit/skills/heurist/image_generation_flux_1_dev.py +12 -13
  163. intentkit/skills/heurist/image_generation_sdxl.py +12 -13
  164. intentkit/skills/http/__init__.py +4 -15
  165. intentkit/skills/http/base.py +1 -7
  166. intentkit/skills/http/get.py +21 -16
  167. intentkit/skills/http/post.py +23 -18
  168. intentkit/skills/http/put.py +23 -18
  169. intentkit/skills/lifi/__init__.py +5 -10
  170. intentkit/skills/lifi/base.py +1 -7
  171. intentkit/skills/lifi/token_execute.py +14 -17
  172. intentkit/skills/lifi/token_quote.py +7 -9
  173. intentkit/skills/lifi/utils.py +16 -16
  174. intentkit/skills/moralis/__init__.py +6 -10
  175. intentkit/skills/moralis/api.py +6 -7
  176. intentkit/skills/moralis/base.py +5 -10
  177. intentkit/skills/moralis/fetch_chain_portfolio.py +10 -11
  178. intentkit/skills/moralis/fetch_nft_portfolio.py +22 -22
  179. intentkit/skills/moralis/fetch_solana_portfolio.py +11 -12
  180. intentkit/skills/moralis/fetch_wallet_portfolio.py +8 -9
  181. intentkit/skills/morpho/__init__.py +5 -9
  182. intentkit/skills/nation/__init__.py +4 -9
  183. intentkit/skills/nation/base.py +5 -10
  184. intentkit/skills/nation/nft_check.py +3 -4
  185. intentkit/skills/onchain.py +23 -0
  186. intentkit/skills/openai/__init__.py +17 -18
  187. intentkit/skills/openai/base.py +10 -14
  188. intentkit/skills/openai/dalle_image_generation.py +3 -8
  189. intentkit/skills/openai/gpt_avatar_generator.py +102 -0
  190. intentkit/skills/openai/gpt_image_generation.py +4 -8
  191. intentkit/skills/openai/gpt_image_mini_generator.py +91 -0
  192. intentkit/skills/openai/gpt_image_to_image.py +4 -8
  193. intentkit/skills/openai/image_to_text.py +3 -7
  194. intentkit/skills/openai/schema.json +32 -0
  195. intentkit/skills/portfolio/__init__.py +11 -35
  196. intentkit/skills/portfolio/base.py +33 -19
  197. intentkit/skills/portfolio/token_balances.py +21 -21
  198. intentkit/skills/portfolio/wallet_approvals.py +17 -18
  199. intentkit/skills/portfolio/wallet_defi_positions.py +3 -3
  200. intentkit/skills/portfolio/wallet_history.py +31 -31
  201. intentkit/skills/portfolio/wallet_net_worth.py +13 -13
  202. intentkit/skills/portfolio/wallet_nfts.py +19 -19
  203. intentkit/skills/portfolio/wallet_profitability.py +18 -18
  204. intentkit/skills/portfolio/wallet_profitability_summary.py +5 -5
  205. intentkit/skills/portfolio/wallet_stats.py +3 -3
  206. intentkit/skills/portfolio/wallet_swaps.py +19 -19
  207. intentkit/skills/pyth/__init__.py +4 -10
  208. intentkit/skills/skills.toml +4 -0
  209. intentkit/skills/slack/__init__.py +5 -17
  210. intentkit/skills/slack/base.py +3 -9
  211. intentkit/skills/slack/get_channel.py +8 -8
  212. intentkit/skills/slack/get_message.py +9 -9
  213. intentkit/skills/slack/schedule_message.py +5 -5
  214. intentkit/skills/slack/send_message.py +3 -5
  215. intentkit/skills/supabase/__init__.py +7 -23
  216. intentkit/skills/supabase/base.py +1 -7
  217. intentkit/skills/supabase/delete_data.py +4 -4
  218. intentkit/skills/supabase/fetch_data.py +12 -12
  219. intentkit/skills/supabase/insert_data.py +4 -4
  220. intentkit/skills/supabase/invoke_function.py +6 -6
  221. intentkit/skills/supabase/update_data.py +6 -6
  222. intentkit/skills/supabase/upsert_data.py +4 -4
  223. intentkit/skills/superfluid/__init__.py +5 -9
  224. intentkit/skills/system/__init__.py +7 -24
  225. intentkit/skills/system/add_autonomous_task.py +10 -12
  226. intentkit/skills/system/delete_autonomous_task.py +2 -2
  227. intentkit/skills/system/edit_autonomous_task.py +14 -18
  228. intentkit/skills/system/list_autonomous_tasks.py +3 -5
  229. intentkit/skills/system/read_agent_api_key.py +6 -4
  230. intentkit/skills/system/regenerate_agent_api_key.py +6 -4
  231. intentkit/skills/tavily/__init__.py +3 -12
  232. intentkit/skills/tavily/base.py +4 -9
  233. intentkit/skills/tavily/tavily_extract.py +2 -4
  234. intentkit/skills/tavily/tavily_search.py +4 -6
  235. intentkit/skills/token/__init__.py +5 -10
  236. intentkit/skills/token/base.py +7 -11
  237. intentkit/skills/token/erc20_transfers.py +19 -19
  238. intentkit/skills/token/token_analytics.py +3 -3
  239. intentkit/skills/token/token_price.py +13 -13
  240. intentkit/skills/token/token_search.py +9 -9
  241. intentkit/skills/twitter/__init__.py +11 -35
  242. intentkit/skills/twitter/base.py +22 -34
  243. intentkit/skills/twitter/follow_user.py +2 -6
  244. intentkit/skills/twitter/get_mentions.py +5 -12
  245. intentkit/skills/twitter/get_timeline.py +4 -12
  246. intentkit/skills/twitter/get_user_by_username.py +2 -6
  247. intentkit/skills/twitter/get_user_tweets.py +5 -13
  248. intentkit/skills/twitter/like_tweet.py +2 -6
  249. intentkit/skills/twitter/post_tweet.py +6 -9
  250. intentkit/skills/twitter/reply_tweet.py +6 -9
  251. intentkit/skills/twitter/retweet.py +2 -6
  252. intentkit/skills/twitter/search_tweets.py +4 -12
  253. intentkit/skills/unrealspeech/__init__.py +2 -7
  254. intentkit/skills/unrealspeech/base.py +2 -8
  255. intentkit/skills/unrealspeech/text_to_speech.py +8 -8
  256. intentkit/skills/venice_audio/__init__.py +98 -106
  257. intentkit/skills/venice_audio/base.py +117 -121
  258. intentkit/skills/venice_audio/input.py +41 -41
  259. intentkit/skills/venice_audio/venice_audio.py +7 -11
  260. intentkit/skills/venice_image/__init__.py +147 -154
  261. intentkit/skills/venice_image/api.py +138 -138
  262. intentkit/skills/venice_image/base.py +185 -192
  263. intentkit/skills/venice_image/config.py +33 -35
  264. intentkit/skills/venice_image/image_enhance/image_enhance.py +2 -3
  265. intentkit/skills/venice_image/image_enhance/image_enhance_base.py +21 -23
  266. intentkit/skills/venice_image/image_enhance/image_enhance_input.py +38 -40
  267. intentkit/skills/venice_image/image_generation/image_generation_base.py +9 -9
  268. intentkit/skills/venice_image/image_generation/image_generation_fluently_xl.py +26 -26
  269. intentkit/skills/venice_image/image_generation/image_generation_flux_dev.py +27 -27
  270. intentkit/skills/venice_image/image_generation/image_generation_flux_dev_uncensored.py +26 -26
  271. intentkit/skills/venice_image/image_generation/image_generation_input.py +158 -158
  272. intentkit/skills/venice_image/image_generation/image_generation_lustify_sdxl.py +26 -26
  273. intentkit/skills/venice_image/image_generation/image_generation_pony_realism.py +26 -26
  274. intentkit/skills/venice_image/image_generation/image_generation_stable_diffusion_3_5.py +28 -28
  275. intentkit/skills/venice_image/image_generation/image_generation_venice_sd35.py +28 -28
  276. intentkit/skills/venice_image/image_upscale/image_upscale.py +3 -3
  277. intentkit/skills/venice_image/image_upscale/image_upscale_base.py +21 -23
  278. intentkit/skills/venice_image/image_upscale/image_upscale_input.py +22 -22
  279. intentkit/skills/venice_image/image_vision/image_vision.py +2 -2
  280. intentkit/skills/venice_image/image_vision/image_vision_base.py +17 -17
  281. intentkit/skills/venice_image/image_vision/image_vision_input.py +9 -9
  282. intentkit/skills/venice_image/utils.py +77 -78
  283. intentkit/skills/web_scraper/__init__.py +5 -18
  284. intentkit/skills/web_scraper/base.py +21 -7
  285. intentkit/skills/web_scraper/document_indexer.py +7 -6
  286. intentkit/skills/web_scraper/scrape_and_index.py +15 -15
  287. intentkit/skills/web_scraper/utils.py +62 -63
  288. intentkit/skills/web_scraper/website_indexer.py +17 -19
  289. intentkit/skills/weth/__init__.py +5 -11
  290. intentkit/skills/wow/__init__.py +5 -11
  291. intentkit/skills/x402/__init__.py +61 -0
  292. intentkit/skills/x402/ask_agent.py +98 -0
  293. intentkit/skills/x402/base.py +99 -0
  294. intentkit/skills/x402/http_request.py +117 -0
  295. intentkit/skills/x402/schema.json +45 -0
  296. intentkit/skills/x402/x402.webp +0 -0
  297. intentkit/skills/xmtp/__init__.py +4 -15
  298. intentkit/skills/xmtp/base.py +5 -5
  299. intentkit/skills/xmtp/price.py +6 -6
  300. intentkit/skills/xmtp/swap.py +6 -8
  301. intentkit/skills/xmtp/transfer.py +4 -6
  302. intentkit/utils/error.py +2 -2
  303. intentkit/utils/logging.py +2 -4
  304. intentkit/utils/s3.py +8 -9
  305. intentkit/utils/schema.py +100 -0
  306. intentkit/utils/slack_alert.py +7 -8
  307. {intentkit-0.8.6.dev2.dist-info → intentkit-0.8.17.dist-info}/METADATA +3 -4
  308. intentkit-0.8.17.dist-info/RECORD +466 -0
  309. intentkit/models/generator.py +0 -347
  310. intentkit-0.8.6.dev2.dist-info/RECORD +0 -457
  311. {intentkit-0.8.6.dev2.dist-info → intentkit-0.8.17.dist-info}/WHEEL +0 -0
  312. {intentkit-0.8.6.dev2.dist-info → intentkit-0.8.17.dist-info}/licenses/LICENSE +0 -0
@@ -1,7 +1,9 @@
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
8
  from intentkit.models.base import Base
7
9
  from intentkit.models.db import get_session
@@ -60,6 +62,9 @@ class AgentDataTable(Base):
60
62
  telegram_id = Column(String, nullable=True, comment="Telegram user ID")
61
63
  telegram_username = Column(String, nullable=True, comment="Telegram username")
62
64
  telegram_name = Column(String, nullable=True, comment="Telegram display name")
65
+ discord_id = Column(String, nullable=True, comment="Discord user ID")
66
+ discord_username = Column(String, nullable=True, comment="Discord username")
67
+ discord_name = Column(String, nullable=True, comment="Discord display name")
63
68
  error_message = Column(String, nullable=True, comment="Last error message")
64
69
  api_key = Column(
65
70
  String, nullable=True, unique=True, comment="API key for the agent"
@@ -77,7 +82,7 @@ class AgentDataTable(Base):
77
82
  DateTime(timezone=True),
78
83
  nullable=False,
79
84
  server_default=func.now(),
80
- onupdate=lambda: datetime.now(timezone.utc),
85
+ onupdate=lambda: datetime.now(UTC),
81
86
  comment="Timestamp when the agent data was last updated",
82
87
  )
83
88
 
@@ -94,70 +99,70 @@ class AgentData(BaseModel):
94
99
  ),
95
100
  ]
96
101
  evm_wallet_address: Annotated[
97
- Optional[str],
102
+ str | None,
98
103
  PydanticField(
99
104
  default=None,
100
105
  description="EVM wallet address",
101
106
  ),
102
107
  ] = None
103
108
  solana_wallet_address: Annotated[
104
- Optional[str],
109
+ str | None,
105
110
  PydanticField(
106
111
  default=None,
107
112
  description="Solana wallet address",
108
113
  ),
109
114
  ] = None
110
115
  cdp_wallet_data: Annotated[
111
- Optional[str],
116
+ str | None,
112
117
  PydanticField(
113
118
  default=None,
114
119
  description="CDP wallet data",
115
120
  ),
116
121
  ] = None
117
122
  twitter_id: Annotated[
118
- Optional[str],
123
+ str | None,
119
124
  PydanticField(
120
125
  default=None,
121
126
  description="Twitter user ID",
122
127
  ),
123
128
  ] = None
124
129
  twitter_username: Annotated[
125
- Optional[str],
130
+ str | None,
126
131
  PydanticField(
127
132
  default=None,
128
133
  description="Twitter username",
129
134
  ),
130
135
  ] = None
131
136
  twitter_name: Annotated[
132
- Optional[str],
137
+ str | None,
133
138
  PydanticField(
134
139
  default=None,
135
140
  description="Twitter display name",
136
141
  ),
137
142
  ] = None
138
143
  twitter_access_token: Annotated[
139
- Optional[str],
144
+ str | None,
140
145
  PydanticField(
141
146
  default=None,
142
147
  description="Twitter access token",
143
148
  ),
144
149
  ] = None
145
150
  twitter_access_token_expires_at: Annotated[
146
- Optional[datetime],
151
+ datetime | None,
147
152
  PydanticField(
148
153
  default=None,
149
154
  description="Twitter access token expiration time",
150
155
  ),
151
156
  ] = None
152
157
  twitter_refresh_token: Annotated[
153
- Optional[str],
158
+ str | None,
154
159
  PydanticField(
155
160
  default=None,
156
161
  description="Twitter refresh token",
157
162
  ),
158
163
  ] = None
159
164
  twitter_self_key_refreshed_at: Annotated[
160
- Optional[datetime],
165
+ datetime | None,
161
166
  PydanticField(
162
167
  default=None,
163
168
  description="Twitter self-key userinfo last refresh time",
@@ -171,42 +176,63 @@ class AgentData(BaseModel):
171
176
  ),
172
177
  ] = None
173
178
  telegram_id: Annotated[
174
- Optional[str],
179
+ str | None,
175
180
  PydanticField(
176
181
  default=None,
177
182
  description="Telegram user ID",
178
183
  ),
179
184
  ] = None
180
185
  telegram_username: Annotated[
181
- Optional[str],
186
+ str | None,
182
187
  PydanticField(
183
188
  default=None,
184
189
  description="Telegram username",
185
190
  ),
186
191
  ] = None
187
192
  telegram_name: Annotated[
188
- Optional[str],
193
+ str | None,
189
194
  PydanticField(
190
195
  default=None,
191
196
  description="Telegram display name",
192
197
  ),
193
198
  ] = None
199
+ discord_id: Annotated[
200
+ str | None,
201
+ PydanticField(
202
+ default=None,
203
+ description="Discord user ID",
204
+ ),
205
+ ] = None
206
+ discord_username: Annotated[
207
+ str | None,
208
+ PydanticField(
209
+ default=None,
210
+ description="Discord username",
211
+ ),
212
+ ] = None
213
+ discord_name: Annotated[
214
+ str | None,
215
+ PydanticField(
216
+ default=None,
217
+ description="Discord display name",
218
+ ),
219
+ ] = None
194
220
  error_message: Annotated[
195
- Optional[str],
221
+ str | None,
196
222
  PydanticField(
197
223
  default=None,
198
224
  description="Last error message",
199
225
  ),
200
226
  ] = None
201
227
  api_key: Annotated[
202
- Optional[str],
228
+ str | None,
203
229
  PydanticField(
204
230
  default=None,
205
231
  description="API key for the agent",
206
232
  ),
207
233
  ] = None
208
234
  api_key_public: Annotated[
209
- Optional[str],
235
+ str | None,
210
236
  PydanticField(
211
237
  default=None,
212
238
  description="Public API key for the agent",
@@ -215,14 +241,14 @@ class AgentData(BaseModel):
215
241
  created_at: Annotated[
216
242
  datetime,
217
243
  PydanticField(
218
- default_factory=lambda: datetime.now(timezone.utc),
244
+ default_factory=lambda: datetime.now(UTC),
219
245
  description="Timestamp when the agent data was created",
220
246
  ),
221
247
  ]
222
248
  updated_at: Annotated[
223
249
  datetime,
224
250
  PydanticField(
225
- default_factory=lambda: datetime.now(timezone.utc),
251
+ default_factory=lambda: datetime.now(UTC),
226
252
  description="Timestamp when the agent data was last updated",
227
253
  ),
228
254
  ]
@@ -247,7 +273,7 @@ class AgentData(BaseModel):
247
273
  return cls.model_construct(id=agent_id)
248
274
 
249
275
  @classmethod
250
- async def get_by_api_key(cls, api_key: str) -> Optional["AgentData"]:
276
+ async def get_by_api_key(cls, api_key: str) -> AgentData | None:
251
277
  """Get agent data by API key.
252
278
 
253
279
  Args:
@@ -356,7 +382,7 @@ class AgentPluginDataTable(Base):
356
382
  DateTime(timezone=True),
357
383
  nullable=False,
358
384
  server_default=func.now(),
359
- onupdate=lambda: datetime.now(timezone.utc),
385
+ onupdate=lambda: datetime.now(UTC),
360
386
  )
361
387
 
362
388
 
@@ -388,28 +414,28 @@ class AgentPluginData(BaseModel):
388
414
  PydanticField(description="Key for this specific piece of data"),
389
415
  ]
390
416
  data: Annotated[
391
- Dict[str, Any],
417
+ dict[str, Any],
392
418
  PydanticField(default=None, description="JSON data stored for this key"),
393
419
  ]
394
420
  created_at: Annotated[
395
421
  datetime,
396
422
  PydanticField(
397
423
  description="Timestamp when this data was created",
398
- default_factory=lambda: datetime.now(timezone.utc),
424
+ default_factory=lambda: datetime.now(UTC),
399
425
  ),
400
426
  ]
401
427
  updated_at: Annotated[
402
428
  datetime,
403
429
  PydanticField(
404
430
  description="Timestamp when this data was last updated",
405
- default_factory=lambda: datetime.now(timezone.utc),
431
+ default_factory=lambda: datetime.now(UTC),
406
432
  ),
407
433
  ]
408
434
 
409
435
  @classmethod
410
436
  async def get(
411
437
  cls, agent_id: str, plugin: str, key: str
412
- ) -> Optional["AgentPluginData"]:
438
+ ) -> "AgentPluginData" | None:
413
439
  """Get plugin data for an agent.
414
440
 
415
441
  Args:
@@ -513,7 +539,7 @@ class AgentQuotaTable(Base):
513
539
  DateTime(timezone=True),
514
540
  nullable=False,
515
541
  server_default=func.now(),
516
- onupdate=lambda: datetime.now(timezone.utc),
542
+ onupdate=lambda: datetime.now(UTC),
517
543
  )
518
544
 
519
545
 
@@ -547,7 +573,7 @@ class AgentQuota(BaseModel):
547
573
  int, PydanticField(default=99999999, description="Daily message limit")
548
574
  ]
549
575
  last_message_time: Annotated[
550
- Optional[datetime],
576
+ datetime | None,
551
577
  PydanticField(default=None, description="Last message timestamp"),
552
578
  ]
553
579
  autonomous_count_total: Annotated[
@@ -578,7 +604,7 @@ class AgentQuota(BaseModel):
578
604
  ),
579
605
  ]
580
606
  last_autonomous_time: Annotated[
581
- Optional[datetime],
607
+ datetime | None,
582
608
  PydanticField(default=None, description="Last autonomous operation timestamp"),
583
609
  ]
584
610
  twitter_count_total: Annotated[
@@ -603,7 +629,7 @@ class AgentQuota(BaseModel):
603
629
  PydanticField(default=99999999, description="Daily Twitter operations limit"),
604
630
  ]
605
631
  last_twitter_time: Annotated[
606
- Optional[datetime],
632
+ datetime | None,
607
633
  PydanticField(default=None, description="Last Twitter operation timestamp"),
608
634
  ]
609
635
  free_income_daily: Annotated[
@@ -638,14 +664,14 @@ class AgentQuota(BaseModel):
638
664
  datetime,
639
665
  PydanticField(
640
666
  description="Timestamp when this quota was created",
641
- default_factory=lambda: datetime.now(timezone.utc),
667
+ default_factory=lambda: datetime.now(UTC),
642
668
  ),
643
669
  ]
644
670
  updated_at: Annotated[
645
671
  datetime,
646
672
  PydanticField(
647
673
  description="Timestamp when this quota was last updated",
648
- default_factory=lambda: datetime.now(timezone.utc),
674
+ default_factory=lambda: datetime.now(UTC),
649
675
  ),
650
676
  ]
651
677
 
@@ -770,7 +796,7 @@ class AgentQuota(BaseModel):
770
796
  quota_record.message_count_total += 1
771
797
  quota_record.message_count_monthly += 1
772
798
  quota_record.message_count_daily += 1
773
- quota_record.last_message_time = datetime.now(timezone.utc)
799
+ quota_record.last_message_time = datetime.now(UTC)
774
800
  db.add(quota_record)
775
801
  await db.commit()
776
802
 
@@ -790,7 +816,7 @@ class AgentQuota(BaseModel):
790
816
  # Update record
791
817
  quota_record.autonomous_count_total += 1
792
818
  quota_record.autonomous_count_monthly += 1
793
- quota_record.last_autonomous_time = datetime.now(timezone.utc)
819
+ quota_record.last_autonomous_time = datetime.now(UTC)
794
820
  db.add(quota_record)
795
821
  await db.commit()
796
822
 
@@ -811,7 +837,7 @@ class AgentQuota(BaseModel):
811
837
  # Update record
812
838
  quota_record.twitter_count_total += 1
813
839
  quota_record.twitter_count_daily += 1
814
- quota_record.last_twitter_time = datetime.now(timezone.utc)
840
+ quota_record.last_twitter_time = datetime.now(UTC)
815
841
  db.add(quota_record)
816
842
  await db.commit()
817
843
 
@@ -158,7 +158,8 @@
158
158
  "trim",
159
159
  "summarize"
160
160
  ],
161
- "x-group": "llm"
161
+ "x-group": "llm",
162
+ "x-advanced": true
162
163
  },
163
164
  "temperature": {
164
165
  "title": "Temperature",
@@ -168,7 +169,8 @@
168
169
  "minimum": 0.0,
169
170
  "maximum": 1.5,
170
171
  "x-group": "llm",
171
- "x-step": 0.1
172
+ "x-step": 0.1,
173
+ "x-advanced": true
172
174
  },
173
175
  "frequency_penalty": {
174
176
  "title": "Frequency Penalty",
@@ -346,16 +348,11 @@
346
348
  "description": "Default Network, please note that some CDP Wallet native skills like swap only support the base network.",
347
349
  "default": "base-mainnet",
348
350
  "enum": [
351
+ "base-mainnet",
349
352
  "ethereum-mainnet",
350
- "ethereum-sepolia",
351
353
  "polygon-mainnet",
352
- "polygon-mumbai",
353
- "base-mainnet",
354
- "base-sepolia",
355
354
  "arbitrum-mainnet",
356
- "arbitrum-sepolia",
357
- "optimism-mainnet",
358
- "optimism-sepolia"
355
+ "optimism-mainnet"
359
356
  ],
360
357
  "x-group": "onchain"
361
358
  }
@@ -1,8 +1,8 @@
1
1
  import time
2
- from datetime import datetime, timezone
2
+ from datetime import UTC, datetime
3
3
  from decimal import ROUND_HALF_UP, Decimal
4
4
  from enum import Enum
5
- from typing import Annotated, Any, Dict, List
5
+ from typing import Annotated, Any
6
6
 
7
7
  from intentkit.models.base import Base
8
8
  from intentkit.models.db import get_session
@@ -33,7 +33,7 @@ DEFAULT_SYSTEM_MESSAGES = {
33
33
  }
34
34
 
35
35
  # In-memory cache for app settings
36
- _cache: Dict[str, Dict[str, Any]] = {}
36
+ _cache: dict[str, dict[str, Any]] = {}
37
37
  _cache_ttl = 180 # 3 minutes in seconds
38
38
 
39
39
 
@@ -59,7 +59,7 @@ class AppSettingTable(Base):
59
59
  DateTime(timezone=True),
60
60
  nullable=False,
61
61
  server_default=func.now(),
62
- onupdate=lambda: datetime.now(timezone.utc),
62
+ onupdate=lambda: datetime.now(UTC),
63
63
  )
64
64
 
65
65
 
@@ -117,7 +117,7 @@ class PaymentSettings(BaseModel):
117
117
  Field(default=False, description="Whether agent whitelist is enabled"),
118
118
  ]
119
119
  agent_whitelist: Annotated[
120
- List[str],
120
+ list[str],
121
121
  Field(default_factory=list, description="List of whitelisted agent IDs"),
122
122
  ]
123
123
 
@@ -133,7 +133,7 @@ class PaymentSettings(BaseModel):
133
133
  """Round decimal values to 4 decimal places."""
134
134
  if isinstance(v, Decimal):
135
135
  return v.quantize(Decimal("0.0001"), rounding=ROUND_HALF_UP)
136
- elif isinstance(v, (int, float)):
136
+ elif isinstance(v, int | float):
137
137
  return Decimal(str(v)).quantize(Decimal("0.0001"), rounding=ROUND_HALF_UP)
138
138
  return v
139
139
 
intentkit/models/chat.py CHANGED
@@ -1,7 +1,9 @@
1
- from datetime import datetime, timezone
1
+ from __future__ import annotations
2
+
3
+ from datetime import UTC, datetime
2
4
  from decimal import Decimal
3
5
  from enum import Enum
4
- from typing import Annotated, List, NotRequired, Optional, TypedDict
6
+ from typing import Annotated, NotRequired, TypedDict
5
7
 
6
8
  from epyxid import XID
7
9
  from intentkit.models.app_setting import AppSetting, SystemMessageType
@@ -43,10 +45,12 @@ class AuthorType(str, Enum):
43
45
  SKILL = "skill"
44
46
  TELEGRAM = "telegram"
45
47
  TWITTER = "twitter"
48
+ DISCORD = "discord"
46
49
  WEB = "web"
47
50
  SYSTEM = "system"
48
51
  API = "api"
49
52
  XMTP = "xmtp"
53
+ X402 = "x402"
50
54
 
51
55
 
52
56
  class ChatMessageAttachment(TypedDict):
@@ -64,7 +68,7 @@ class ChatMessageAttachment(TypedDict):
64
68
  ),
65
69
  ]
66
70
  url: Annotated[
67
- Optional[str],
71
+ str | None,
68
72
  Field(
69
73
  ...,
70
74
  description="URL of the attachment",
@@ -72,7 +76,7 @@ class ChatMessageAttachment(TypedDict):
72
76
  ),
73
77
  ]
74
78
  json: Annotated[
75
- Optional[dict],
79
+ dict | None,
76
80
  Field(
77
81
  None,
78
82
  description="JSON data of the attachment",
@@ -113,7 +117,7 @@ class ChatMessageRequest(BaseModel):
113
117
  ),
114
118
  ]
115
119
  app_id: Annotated[
116
- Optional[str],
120
+ str | None,
117
121
  Field(
118
122
  None,
119
123
  description="Optional application identifier",
@@ -140,21 +144,21 @@ class ChatMessageRequest(BaseModel):
140
144
  ),
141
145
  ]
142
146
  search_mode: Annotated[
143
- Optional[bool],
147
+ bool | None,
144
148
  Field(
145
149
  None,
146
150
  description="Optional flag to enable search mode",
147
151
  ),
148
152
  ]
149
153
  super_mode: Annotated[
150
- Optional[bool],
154
+ bool | None,
151
155
  Field(
152
156
  None,
153
157
  description="Optional flag to enable super mode",
154
158
  ),
155
159
  ]
156
160
  attachments: Annotated[
157
- Optional[List[ChatMessageAttachment]],
161
+ list[ChatMessageAttachment] | None,
158
162
  Field(
159
163
  None,
160
164
  description="Optional list of attachments (links, images, or files)",
@@ -308,29 +312,29 @@ class ChatMessageCreate(BaseModel):
308
312
  ]
309
313
  chat_id: Annotated[str, Field(description="ID of the chat this message belongs to")]
310
314
  user_id: Annotated[
311
- Optional[str],
315
+ str | None,
312
316
  Field(description="ID of the user this message belongs to or reply to"),
313
317
  ]
314
318
  author_id: Annotated[str, Field(description="ID of the message author")]
315
319
  author_type: Annotated[AuthorType, Field(description="Type of the message author")]
316
320
  model: Annotated[
317
- Optional[str], Field(None, description="LLM model used if applicable")
321
+ str | None, Field(None, description="LLM model used if applicable")
318
322
  ]
319
323
  thread_type: Annotated[
320
- Optional[AuthorType],
324
+ AuthorType | None,
321
325
  Field(None, description="Author Type of the message thread start"),
322
326
  ]
323
327
  reply_to: Annotated[
324
- Optional[str],
328
+ str | None,
325
329
  Field(None, description="ID of the message this message is a reply to"),
326
330
  ]
327
331
  message: Annotated[str, Field(description="Content of the message")]
328
332
  attachments: Annotated[
329
- Optional[List[ChatMessageAttachment]],
333
+ list[ChatMessageAttachment] | None,
330
334
  Field(None, description="List of attachments in the message"),
331
335
  ]
332
336
  skill_calls: Annotated[
333
- Optional[List[ChatMessageSkillCall]],
337
+ list[ChatMessageSkillCall] | None,
334
338
  Field(None, description="Skill call details"),
335
339
  ]
336
340
  input_tokens: Annotated[
@@ -343,11 +347,11 @@ class ChatMessageCreate(BaseModel):
343
347
  float, Field(0.0, description="Time cost for the message in seconds")
344
348
  ]
345
349
  credit_event_id: Annotated[
346
- Optional[str],
350
+ str | None,
347
351
  Field(None, description="ID of the credit event for this message"),
348
352
  ]
349
353
  credit_cost: Annotated[
350
- Optional[Decimal],
354
+ Decimal | None,
351
355
  Field(None, description="Credit cost for the message in credits"),
352
356
  ]
353
357
  cold_start_cost: Annotated[
@@ -355,19 +359,19 @@ class ChatMessageCreate(BaseModel):
355
359
  Field(0.0, description="Cost for the cold start of the message in seconds"),
356
360
  ]
357
361
  app_id: Annotated[
358
- Optional[str],
362
+ str | None,
359
363
  Field(None, description="Optional application identifier"),
360
364
  ]
361
365
  search_mode: Annotated[
362
- Optional[bool],
366
+ bool | None,
363
367
  Field(None, description="Optional flag to enable search mode"),
364
368
  ]
365
369
  super_mode: Annotated[
366
- Optional[bool],
370
+ bool | None,
367
371
  Field(None, description="Optional flag to enable super mode"),
368
372
  ]
369
373
  error_type: Annotated[
370
- Optional[SystemMessageType],
374
+ SystemMessageType | None,
371
375
  Field(None, description="Optional error type, used when author_type is system"),
372
376
  ]
373
377
 
@@ -526,7 +530,7 @@ class ChatMessage(ChatMessageCreate):
526
530
  return ChatMessage.model_validate(sanitized_data)
527
531
 
528
532
  @classmethod
529
- async def get(cls, message_id: str) -> Optional["ChatMessage"]:
533
+ async def get(cls, message_id: str) -> ChatMessage | None:
530
534
  async with get_session() as db:
531
535
  raw = await db.get(ChatMessageTable, message_id)
532
536
  if raw:
@@ -569,7 +573,7 @@ class ChatTable(Base):
569
573
  DateTime(timezone=True),
570
574
  nullable=False,
571
575
  server_default=func.now(),
572
- onupdate=lambda: datetime.now(timezone.utc),
576
+ onupdate=lambda: datetime.now(UTC),
573
577
  )
574
578
 
575
579
 
@@ -624,7 +628,7 @@ class Chat(ChatCreate):
624
628
  ]
625
629
 
626
630
  @classmethod
627
- async def get(cls, id: str) -> Optional["Chat"]:
631
+ async def get(cls, id: str) -> "Chat" | None:
628
632
  """Get a chat by its ID.
629
633
 
630
634
  Args:
@@ -688,7 +692,7 @@ class Chat(ChatCreate):
688
692
  return self
689
693
 
690
694
  @classmethod
691
- async def get_by_agent_user(cls, agent_id: str, user_id: str) -> List["Chat"]:
695
+ async def get_by_agent_user(cls, agent_id: str, user_id: str) -> list["Chat"]:
692
696
  """Get all chats for a specific agent and user.
693
697
 
694
698
  Args:
@@ -5,7 +5,7 @@ related to agent generation sessions.
5
5
  """
6
6
 
7
7
  from datetime import datetime
8
- from typing import Annotated, List, Optional
8
+ from typing import Annotated
9
9
 
10
10
  from epyxid import XID
11
11
  from intentkit.models.base import Base
@@ -103,7 +103,7 @@ class ConversationProjectCreate(BaseModel):
103
103
  ),
104
104
  ]
105
105
  user_id: Annotated[
106
- Optional[str],
106
+ str | None,
107
107
  Field(None, description="User ID associated with this project"),
108
108
  ]
109
109
 
@@ -144,7 +144,7 @@ class ConversationProject(ConversationProjectCreate):
144
144
  ]
145
145
 
146
146
  @classmethod
147
- async def get(cls, project_id: str) -> Optional["ConversationProject"]:
147
+ async def get(cls, project_id: str) -> "ConversationProject" | None:
148
148
  """Get a conversation project by ID."""
149
149
  async with get_session() as db:
150
150
  result = await db.execute(
@@ -179,8 +179,8 @@ class ConversationProject(ConversationProjectCreate):
179
179
 
180
180
  @classmethod
181
181
  async def get_by_user(
182
- cls, user_id: Optional[str] = None, limit: int = 50
183
- ) -> List["ConversationProject"]:
182
+ cls, user_id: str | None = None, limit: int = 50
183
+ ) -> list["ConversationProject"]:
184
184
  """Get conversation projects by user ID."""
185
185
  async with get_session() as db:
186
186
  query = select(ConversationProjectTable).order_by(
@@ -213,7 +213,7 @@ class ConversationMessageCreate(BaseModel):
213
213
  role: Annotated[str, Field(description="Role of the message sender")]
214
214
  content: Annotated[str, Field(description="Content of the message")]
215
215
  message_metadata: Annotated[
216
- Optional[dict],
216
+ dict | None,
217
217
  Field(None, description="Additional metadata for the message"),
218
218
  ]
219
219
 
@@ -255,8 +255,8 @@ class ConversationMessage(ConversationMessageCreate):
255
255
 
256
256
  @classmethod
257
257
  async def get_by_project(
258
- cls, project_id: str, user_id: Optional[str] = None
259
- ) -> List["ConversationMessage"]:
258
+ cls, project_id: str, user_id: str | None = None
259
+ ) -> list["ConversationMessage"]:
260
260
  """Get conversation messages for a project."""
261
261
  async with get_session() as db:
262
262
  # First check if project exists and user has access