intentkit 0.8.16.dev1__py3-none-any.whl → 0.8.17.dev2__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 (274) 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 +6 -5
  5. intentkit/abstracts/skill.py +5 -5
  6. intentkit/abstracts/twitter.py +4 -5
  7. intentkit/clients/cdp.py +19 -77
  8. intentkit/clients/twitter.py +26 -34
  9. intentkit/clients/web3.py +1 -3
  10. intentkit/config/config.py +4 -0
  11. intentkit/core/agent.py +15 -15
  12. intentkit/core/asset.py +1 -2
  13. intentkit/core/client.py +1 -1
  14. intentkit/core/credit.py +19 -20
  15. intentkit/core/engine.py +2 -4
  16. intentkit/core/node.py +2 -1
  17. intentkit/core/prompt.py +3 -4
  18. intentkit/core/scheduler.py +1 -1
  19. intentkit/core/statistics.py +6 -7
  20. intentkit/models/agent.py +125 -92
  21. intentkit/models/agent_data.py +62 -36
  22. intentkit/models/app_setting.py +6 -6
  23. intentkit/models/chat.py +27 -24
  24. intentkit/models/conversation.py +8 -8
  25. intentkit/models/credit.py +62 -64
  26. intentkit/models/db.py +8 -7
  27. intentkit/models/db_mig.py +2 -2
  28. intentkit/models/llm.py +12 -14
  29. intentkit/models/redis.py +2 -3
  30. intentkit/models/skill.py +25 -27
  31. intentkit/models/skills.csv +29 -28
  32. intentkit/models/user.py +21 -22
  33. intentkit/skills/acolyt/ask.py +3 -4
  34. intentkit/skills/acolyt/base.py +1 -3
  35. intentkit/skills/aixbt/base.py +1 -3
  36. intentkit/skills/aixbt/projects.py +13 -13
  37. intentkit/skills/allora/base.py +1 -3
  38. intentkit/skills/allora/price.py +2 -3
  39. intentkit/skills/base.py +15 -22
  40. intentkit/skills/basename/__init__.py +3 -5
  41. intentkit/skills/carv/__init__.py +7 -8
  42. intentkit/skills/carv/base.py +6 -6
  43. intentkit/skills/carv/fetch_news.py +3 -3
  44. intentkit/skills/carv/onchain_query.py +4 -4
  45. intentkit/skills/carv/token_info_and_price.py +5 -5
  46. intentkit/skills/casino/base.py +1 -3
  47. intentkit/skills/casino/deck_draw.py +1 -2
  48. intentkit/skills/casino/deck_shuffle.py +1 -2
  49. intentkit/skills/casino/dice_roll.py +1 -2
  50. intentkit/skills/cdp/__init__.py +3 -5
  51. intentkit/skills/cdp/base.py +1 -3
  52. intentkit/skills/chainlist/base.py +1 -3
  53. intentkit/skills/chainlist/chain_lookup.py +18 -18
  54. intentkit/skills/common/base.py +1 -3
  55. intentkit/skills/common/current_time.py +1 -2
  56. intentkit/skills/cookiefun/base.py +1 -2
  57. intentkit/skills/cookiefun/get_account_details.py +7 -7
  58. intentkit/skills/cookiefun/get_account_feed.py +19 -19
  59. intentkit/skills/cookiefun/get_account_smart_followers.py +7 -7
  60. intentkit/skills/cookiefun/get_sectors.py +3 -3
  61. intentkit/skills/cookiefun/search_accounts.py +9 -9
  62. intentkit/skills/cryptocompare/api.py +2 -3
  63. intentkit/skills/cryptocompare/base.py +6 -6
  64. intentkit/skills/cryptocompare/fetch_news.py +3 -4
  65. intentkit/skills/cryptocompare/fetch_price.py +5 -6
  66. intentkit/skills/cryptocompare/fetch_top_exchanges.py +3 -4
  67. intentkit/skills/cryptocompare/fetch_top_market_cap.py +3 -4
  68. intentkit/skills/cryptocompare/fetch_top_volume.py +3 -4
  69. intentkit/skills/cryptocompare/fetch_trading_signals.py +4 -5
  70. intentkit/skills/cryptopanic/__init__.py +4 -4
  71. intentkit/skills/cryptopanic/base.py +1 -3
  72. intentkit/skills/cryptopanic/fetch_crypto_news.py +3 -5
  73. intentkit/skills/cryptopanic/fetch_crypto_sentiment.py +3 -3
  74. intentkit/skills/dapplooker/base.py +1 -3
  75. intentkit/skills/dapplooker/dapplooker_token_data.py +7 -7
  76. intentkit/skills/defillama/api.py +6 -9
  77. intentkit/skills/defillama/base.py +5 -6
  78. intentkit/skills/defillama/coins/fetch_batch_historical_prices.py +6 -8
  79. intentkit/skills/defillama/coins/fetch_block.py +4 -6
  80. intentkit/skills/defillama/coins/fetch_current_prices.py +6 -8
  81. intentkit/skills/defillama/coins/fetch_first_price.py +5 -7
  82. intentkit/skills/defillama/coins/fetch_historical_prices.py +7 -9
  83. intentkit/skills/defillama/coins/fetch_price_chart.py +7 -9
  84. intentkit/skills/defillama/coins/fetch_price_percentage.py +5 -7
  85. intentkit/skills/defillama/config/chains.py +1 -3
  86. intentkit/skills/defillama/fees/fetch_fees_overview.py +22 -24
  87. intentkit/skills/defillama/stablecoins/fetch_stablecoin_chains.py +14 -16
  88. intentkit/skills/defillama/stablecoins/fetch_stablecoin_charts.py +6 -8
  89. intentkit/skills/defillama/stablecoins/fetch_stablecoin_prices.py +3 -5
  90. intentkit/skills/defillama/stablecoins/fetch_stablecoins.py +5 -7
  91. intentkit/skills/defillama/tests/api_integration.test.py +1 -1
  92. intentkit/skills/defillama/tvl/fetch_chain_historical_tvl.py +2 -4
  93. intentkit/skills/defillama/tvl/fetch_chains.py +7 -9
  94. intentkit/skills/defillama/tvl/fetch_historical_tvl.py +2 -4
  95. intentkit/skills/defillama/tvl/fetch_protocol.py +30 -36
  96. intentkit/skills/defillama/tvl/fetch_protocol_current_tvl.py +1 -3
  97. intentkit/skills/defillama/tvl/fetch_protocols.py +35 -43
  98. intentkit/skills/defillama/volumes/fetch_dex_overview.py +40 -46
  99. intentkit/skills/defillama/volumes/fetch_dex_summary.py +33 -35
  100. intentkit/skills/defillama/volumes/fetch_options_overview.py +22 -26
  101. intentkit/skills/defillama/yields/fetch_pool_chart.py +8 -10
  102. intentkit/skills/defillama/yields/fetch_pools.py +24 -28
  103. intentkit/skills/dexscreener/__init__.py +2 -2
  104. intentkit/skills/dexscreener/base.py +3 -3
  105. intentkit/skills/dexscreener/get_pair_info.py +2 -2
  106. intentkit/skills/dexscreener/get_token_pairs.py +2 -2
  107. intentkit/skills/dexscreener/get_tokens_info.py +5 -5
  108. intentkit/skills/dexscreener/model/search_token_response.py +80 -82
  109. intentkit/skills/dexscreener/search_token.py +182 -182
  110. intentkit/skills/dexscreener/utils.py +15 -14
  111. intentkit/skills/dune_analytics/__init__.py +4 -4
  112. intentkit/skills/dune_analytics/base.py +1 -3
  113. intentkit/skills/dune_analytics/fetch_kol_buys.py +4 -4
  114. intentkit/skills/dune_analytics/fetch_nation_metrics.py +5 -5
  115. intentkit/skills/elfa/base.py +1 -3
  116. intentkit/skills/elfa/mention.py +19 -21
  117. intentkit/skills/elfa/stats.py +4 -4
  118. intentkit/skills/elfa/tokens.py +12 -12
  119. intentkit/skills/elfa/utils.py +25 -27
  120. intentkit/skills/enso/__init__.py +2 -2
  121. intentkit/skills/enso/base.py +5 -8
  122. intentkit/skills/enso/best_yield.py +4 -6
  123. intentkit/skills/enso/networks.py +1 -2
  124. intentkit/skills/enso/prices.py +1 -3
  125. intentkit/skills/enso/route.py +1 -3
  126. intentkit/skills/enso/tokens.py +1 -3
  127. intentkit/skills/enso/wallet.py +5 -5
  128. intentkit/skills/erc20/__init__.py +4 -6
  129. intentkit/skills/erc721/__init__.py +4 -6
  130. intentkit/skills/firecrawl/base.py +1 -3
  131. intentkit/skills/firecrawl/clear.py +1 -2
  132. intentkit/skills/firecrawl/crawl.py +9 -10
  133. intentkit/skills/firecrawl/query.py +1 -2
  134. intentkit/skills/firecrawl/scrape.py +7 -8
  135. intentkit/skills/firecrawl/utils.py +13 -13
  136. intentkit/skills/github/base.py +1 -3
  137. intentkit/skills/github/github_search.py +1 -2
  138. intentkit/skills/heurist/base.py +1 -3
  139. intentkit/skills/heurist/image_generation_animagine_xl.py +7 -8
  140. intentkit/skills/heurist/image_generation_arthemy_comics.py +7 -8
  141. intentkit/skills/heurist/image_generation_arthemy_real.py +7 -8
  142. intentkit/skills/heurist/image_generation_braindance.py +7 -8
  143. intentkit/skills/heurist/image_generation_cyber_realistic_xl.py +7 -8
  144. intentkit/skills/heurist/image_generation_flux_1_dev.py +7 -8
  145. intentkit/skills/heurist/image_generation_sdxl.py +7 -8
  146. intentkit/skills/http/base.py +1 -3
  147. intentkit/skills/http/get.py +7 -7
  148. intentkit/skills/http/post.py +9 -9
  149. intentkit/skills/http/put.py +9 -9
  150. intentkit/skills/lifi/__init__.py +4 -4
  151. intentkit/skills/lifi/base.py +1 -3
  152. intentkit/skills/lifi/token_execute.py +13 -13
  153. intentkit/skills/lifi/token_quote.py +6 -6
  154. intentkit/skills/lifi/utils.py +16 -16
  155. intentkit/skills/moralis/__init__.py +3 -3
  156. intentkit/skills/moralis/api.py +6 -7
  157. intentkit/skills/moralis/base.py +2 -4
  158. intentkit/skills/moralis/fetch_chain_portfolio.py +10 -11
  159. intentkit/skills/moralis/fetch_nft_portfolio.py +22 -22
  160. intentkit/skills/moralis/fetch_solana_portfolio.py +11 -12
  161. intentkit/skills/moralis/fetch_wallet_portfolio.py +8 -9
  162. intentkit/skills/morpho/__init__.py +4 -6
  163. intentkit/skills/nation/__init__.py +2 -2
  164. intentkit/skills/nation/base.py +1 -3
  165. intentkit/skills/nation/nft_check.py +3 -4
  166. intentkit/skills/onchain.py +2 -6
  167. intentkit/skills/openai/base.py +1 -3
  168. intentkit/skills/openai/dalle_image_generation.py +1 -3
  169. intentkit/skills/openai/gpt_image_generation.py +2 -3
  170. intentkit/skills/openai/gpt_image_to_image.py +2 -3
  171. intentkit/skills/openai/image_to_text.py +1 -2
  172. intentkit/skills/portfolio/base.py +6 -6
  173. intentkit/skills/portfolio/token_balances.py +21 -21
  174. intentkit/skills/portfolio/wallet_approvals.py +7 -7
  175. intentkit/skills/portfolio/wallet_defi_positions.py +3 -3
  176. intentkit/skills/portfolio/wallet_history.py +21 -21
  177. intentkit/skills/portfolio/wallet_net_worth.py +13 -13
  178. intentkit/skills/portfolio/wallet_nfts.py +19 -19
  179. intentkit/skills/portfolio/wallet_profitability.py +7 -7
  180. intentkit/skills/portfolio/wallet_profitability_summary.py +5 -5
  181. intentkit/skills/portfolio/wallet_stats.py +3 -3
  182. intentkit/skills/portfolio/wallet_swaps.py +19 -19
  183. intentkit/skills/pyth/__init__.py +3 -5
  184. intentkit/skills/slack/base.py +2 -4
  185. intentkit/skills/slack/get_channel.py +8 -8
  186. intentkit/skills/slack/get_message.py +9 -9
  187. intentkit/skills/slack/schedule_message.py +5 -5
  188. intentkit/skills/slack/send_message.py +3 -5
  189. intentkit/skills/supabase/base.py +1 -3
  190. intentkit/skills/supabase/delete_data.py +4 -4
  191. intentkit/skills/supabase/fetch_data.py +12 -12
  192. intentkit/skills/supabase/insert_data.py +4 -4
  193. intentkit/skills/supabase/invoke_function.py +6 -6
  194. intentkit/skills/supabase/update_data.py +6 -6
  195. intentkit/skills/supabase/upsert_data.py +4 -4
  196. intentkit/skills/superfluid/__init__.py +4 -6
  197. intentkit/skills/system/add_autonomous_task.py +8 -10
  198. intentkit/skills/system/edit_autonomous_task.py +12 -14
  199. intentkit/skills/system/list_autonomous_tasks.py +1 -3
  200. intentkit/skills/tavily/base.py +1 -3
  201. intentkit/skills/tavily/tavily_extract.py +1 -2
  202. intentkit/skills/tavily/tavily_search.py +1 -3
  203. intentkit/skills/token/base.py +5 -5
  204. intentkit/skills/token/erc20_transfers.py +19 -19
  205. intentkit/skills/token/token_analytics.py +3 -3
  206. intentkit/skills/token/token_price.py +13 -13
  207. intentkit/skills/token/token_search.py +9 -9
  208. intentkit/skills/twitter/base.py +3 -4
  209. intentkit/skills/twitter/follow_user.py +1 -2
  210. intentkit/skills/twitter/get_mentions.py +3 -4
  211. intentkit/skills/twitter/get_timeline.py +1 -2
  212. intentkit/skills/twitter/get_user_by_username.py +1 -2
  213. intentkit/skills/twitter/get_user_tweets.py +2 -3
  214. intentkit/skills/twitter/like_tweet.py +1 -2
  215. intentkit/skills/twitter/post_tweet.py +3 -4
  216. intentkit/skills/twitter/reply_tweet.py +3 -4
  217. intentkit/skills/twitter/retweet.py +1 -2
  218. intentkit/skills/twitter/search_tweets.py +1 -2
  219. intentkit/skills/unrealspeech/base.py +1 -3
  220. intentkit/skills/unrealspeech/text_to_speech.py +8 -8
  221. intentkit/skills/venice_audio/__init__.py +8 -9
  222. intentkit/skills/venice_audio/base.py +3 -4
  223. intentkit/skills/venice_audio/input.py +41 -41
  224. intentkit/skills/venice_audio/venice_audio.py +6 -6
  225. intentkit/skills/venice_image/__init__.py +5 -5
  226. intentkit/skills/venice_image/api.py +138 -138
  227. intentkit/skills/venice_image/base.py +3 -3
  228. intentkit/skills/venice_image/config.py +33 -35
  229. intentkit/skills/venice_image/image_enhance/image_enhance.py +2 -3
  230. intentkit/skills/venice_image/image_enhance/image_enhance_base.py +21 -23
  231. intentkit/skills/venice_image/image_enhance/image_enhance_input.py +38 -40
  232. intentkit/skills/venice_image/image_generation/image_generation_base.py +9 -9
  233. intentkit/skills/venice_image/image_generation/image_generation_fluently_xl.py +26 -26
  234. intentkit/skills/venice_image/image_generation/image_generation_flux_dev.py +27 -27
  235. intentkit/skills/venice_image/image_generation/image_generation_flux_dev_uncensored.py +26 -26
  236. intentkit/skills/venice_image/image_generation/image_generation_input.py +158 -158
  237. intentkit/skills/venice_image/image_generation/image_generation_lustify_sdxl.py +26 -26
  238. intentkit/skills/venice_image/image_generation/image_generation_pony_realism.py +26 -26
  239. intentkit/skills/venice_image/image_generation/image_generation_stable_diffusion_3_5.py +28 -28
  240. intentkit/skills/venice_image/image_generation/image_generation_venice_sd35.py +28 -28
  241. intentkit/skills/venice_image/image_upscale/image_upscale.py +3 -3
  242. intentkit/skills/venice_image/image_upscale/image_upscale_base.py +21 -23
  243. intentkit/skills/venice_image/image_upscale/image_upscale_input.py +22 -22
  244. intentkit/skills/venice_image/image_vision/image_vision.py +2 -2
  245. intentkit/skills/venice_image/image_vision/image_vision_base.py +17 -17
  246. intentkit/skills/venice_image/image_vision/image_vision_input.py +9 -9
  247. intentkit/skills/venice_image/utils.py +77 -78
  248. intentkit/skills/web_scraper/base.py +1 -3
  249. intentkit/skills/web_scraper/document_indexer.py +1 -2
  250. intentkit/skills/web_scraper/scrape_and_index.py +4 -5
  251. intentkit/skills/web_scraper/utils.py +25 -26
  252. intentkit/skills/web_scraper/website_indexer.py +10 -11
  253. intentkit/skills/weth/__init__.py +4 -6
  254. intentkit/skills/wow/__init__.py +4 -6
  255. intentkit/skills/x402/__init__.py +11 -3
  256. intentkit/skills/x402/ask_agent.py +12 -78
  257. intentkit/skills/x402/base.py +90 -0
  258. intentkit/skills/x402/http_request.py +117 -0
  259. intentkit/skills/x402/schema.json +15 -10
  260. intentkit/skills/xmtp/base.py +3 -3
  261. intentkit/skills/xmtp/price.py +2 -2
  262. intentkit/skills/xmtp/swap.py +2 -4
  263. intentkit/skills/xmtp/transfer.py +4 -6
  264. intentkit/utils/error.py +2 -2
  265. intentkit/utils/logging.py +2 -4
  266. intentkit/utils/s3.py +8 -9
  267. intentkit/utils/schema.py +5 -5
  268. intentkit/utils/slack_alert.py +7 -8
  269. {intentkit-0.8.16.dev1.dist-info → intentkit-0.8.17.dev2.dist-info}/METADATA +3 -4
  270. intentkit-0.8.17.dev2.dist-info/RECORD +464 -0
  271. intentkit/models/generator.py +0 -347
  272. intentkit-0.8.16.dev1.dist-info/RECORD +0 -464
  273. {intentkit-0.8.16.dev1.dist-info → intentkit-0.8.17.dev2.dist-info}/WHEEL +0 -0
  274. {intentkit-0.8.16.dev1.dist-info → intentkit-0.8.17.dev2.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
 
@@ -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,6 +45,7 @@ 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"
@@ -65,7 +68,7 @@ class ChatMessageAttachment(TypedDict):
65
68
  ),
66
69
  ]
67
70
  url: Annotated[
68
- Optional[str],
71
+ str | None,
69
72
  Field(
70
73
  ...,
71
74
  description="URL of the attachment",
@@ -73,7 +76,7 @@ class ChatMessageAttachment(TypedDict):
73
76
  ),
74
77
  ]
75
78
  json: Annotated[
76
- Optional[dict],
79
+ dict | None,
77
80
  Field(
78
81
  None,
79
82
  description="JSON data of the attachment",
@@ -114,7 +117,7 @@ class ChatMessageRequest(BaseModel):
114
117
  ),
115
118
  ]
116
119
  app_id: Annotated[
117
- Optional[str],
120
+ str | None,
118
121
  Field(
119
122
  None,
120
123
  description="Optional application identifier",
@@ -141,21 +144,21 @@ class ChatMessageRequest(BaseModel):
141
144
  ),
142
145
  ]
143
146
  search_mode: Annotated[
144
- Optional[bool],
147
+ bool | None,
145
148
  Field(
146
149
  None,
147
150
  description="Optional flag to enable search mode",
148
151
  ),
149
152
  ]
150
153
  super_mode: Annotated[
151
- Optional[bool],
154
+ bool | None,
152
155
  Field(
153
156
  None,
154
157
  description="Optional flag to enable super mode",
155
158
  ),
156
159
  ]
157
160
  attachments: Annotated[
158
- Optional[List[ChatMessageAttachment]],
161
+ list[ChatMessageAttachment] | None,
159
162
  Field(
160
163
  None,
161
164
  description="Optional list of attachments (links, images, or files)",
@@ -309,29 +312,29 @@ class ChatMessageCreate(BaseModel):
309
312
  ]
310
313
  chat_id: Annotated[str, Field(description="ID of the chat this message belongs to")]
311
314
  user_id: Annotated[
312
- Optional[str],
315
+ str | None,
313
316
  Field(description="ID of the user this message belongs to or reply to"),
314
317
  ]
315
318
  author_id: Annotated[str, Field(description="ID of the message author")]
316
319
  author_type: Annotated[AuthorType, Field(description="Type of the message author")]
317
320
  model: Annotated[
318
- Optional[str], Field(None, description="LLM model used if applicable")
321
+ str | None, Field(None, description="LLM model used if applicable")
319
322
  ]
320
323
  thread_type: Annotated[
321
- Optional[AuthorType],
324
+ AuthorType | None,
322
325
  Field(None, description="Author Type of the message thread start"),
323
326
  ]
324
327
  reply_to: Annotated[
325
- Optional[str],
328
+ str | None,
326
329
  Field(None, description="ID of the message this message is a reply to"),
327
330
  ]
328
331
  message: Annotated[str, Field(description="Content of the message")]
329
332
  attachments: Annotated[
330
- Optional[List[ChatMessageAttachment]],
333
+ list[ChatMessageAttachment] | None,
331
334
  Field(None, description="List of attachments in the message"),
332
335
  ]
333
336
  skill_calls: Annotated[
334
- Optional[List[ChatMessageSkillCall]],
337
+ list[ChatMessageSkillCall] | None,
335
338
  Field(None, description="Skill call details"),
336
339
  ]
337
340
  input_tokens: Annotated[
@@ -344,11 +347,11 @@ class ChatMessageCreate(BaseModel):
344
347
  float, Field(0.0, description="Time cost for the message in seconds")
345
348
  ]
346
349
  credit_event_id: Annotated[
347
- Optional[str],
350
+ str | None,
348
351
  Field(None, description="ID of the credit event for this message"),
349
352
  ]
350
353
  credit_cost: Annotated[
351
- Optional[Decimal],
354
+ Decimal | None,
352
355
  Field(None, description="Credit cost for the message in credits"),
353
356
  ]
354
357
  cold_start_cost: Annotated[
@@ -356,19 +359,19 @@ class ChatMessageCreate(BaseModel):
356
359
  Field(0.0, description="Cost for the cold start of the message in seconds"),
357
360
  ]
358
361
  app_id: Annotated[
359
- Optional[str],
362
+ str | None,
360
363
  Field(None, description="Optional application identifier"),
361
364
  ]
362
365
  search_mode: Annotated[
363
- Optional[bool],
366
+ bool | None,
364
367
  Field(None, description="Optional flag to enable search mode"),
365
368
  ]
366
369
  super_mode: Annotated[
367
- Optional[bool],
370
+ bool | None,
368
371
  Field(None, description="Optional flag to enable super mode"),
369
372
  ]
370
373
  error_type: Annotated[
371
- Optional[SystemMessageType],
374
+ SystemMessageType | None,
372
375
  Field(None, description="Optional error type, used when author_type is system"),
373
376
  ]
374
377
 
@@ -527,7 +530,7 @@ class ChatMessage(ChatMessageCreate):
527
530
  return ChatMessage.model_validate(sanitized_data)
528
531
 
529
532
  @classmethod
530
- async def get(cls, message_id: str) -> Optional["ChatMessage"]:
533
+ async def get(cls, message_id: str) -> ChatMessage | None:
531
534
  async with get_session() as db:
532
535
  raw = await db.get(ChatMessageTable, message_id)
533
536
  if raw:
@@ -570,7 +573,7 @@ class ChatTable(Base):
570
573
  DateTime(timezone=True),
571
574
  nullable=False,
572
575
  server_default=func.now(),
573
- onupdate=lambda: datetime.now(timezone.utc),
576
+ onupdate=lambda: datetime.now(UTC),
574
577
  )
575
578
 
576
579
 
@@ -625,7 +628,7 @@ class Chat(ChatCreate):
625
628
  ]
626
629
 
627
630
  @classmethod
628
- async def get(cls, id: str) -> Optional["Chat"]:
631
+ async def get(cls, id: str) -> "Chat" | None:
629
632
  """Get a chat by its ID.
630
633
 
631
634
  Args:
@@ -689,7 +692,7 @@ class Chat(ChatCreate):
689
692
  return self
690
693
 
691
694
  @classmethod
692
- 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"]:
693
696
  """Get all chats for a specific agent and user.
694
697
 
695
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