intentkit 0.5.0__py3-none-any.whl → 0.5.1__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 (365) hide show
  1. abstracts/__init__.py +0 -0
  2. abstracts/agent.py +60 -0
  3. abstracts/api.py +4 -0
  4. abstracts/engine.py +38 -0
  5. abstracts/exception.py +9 -0
  6. abstracts/graph.py +25 -0
  7. abstracts/skill.py +129 -0
  8. abstracts/twitter.py +54 -0
  9. clients/__init__.py +14 -0
  10. clients/cdp.py +53 -0
  11. clients/twitter.py +445 -0
  12. config/__init__.py +0 -0
  13. config/config.py +164 -0
  14. core/__init__.py +0 -0
  15. core/agent.py +191 -0
  16. core/api.py +40 -0
  17. core/client.py +45 -0
  18. core/credit.py +1767 -0
  19. core/engine.py +1018 -0
  20. core/node.py +223 -0
  21. core/prompt.py +58 -0
  22. core/skill.py +124 -0
  23. {intentkit-0.5.0.dist-info → intentkit-0.5.1.dist-info}/METADATA +1 -1
  24. intentkit-0.5.1.dist-info/RECORD +364 -0
  25. models/agent.py +1689 -0
  26. models/agent_data.py +810 -0
  27. models/agent_schema.json +733 -0
  28. models/app_setting.py +156 -0
  29. models/base.py +9 -0
  30. models/chat.py +581 -0
  31. models/conversation.py +286 -0
  32. models/credit.py +1406 -0
  33. models/db.py +120 -0
  34. models/db_mig.py +102 -0
  35. models/generator.py +347 -0
  36. models/llm.py +746 -0
  37. models/redis.py +132 -0
  38. models/skill.py +466 -0
  39. models/user.py +243 -0
  40. skills/__init__.py +12 -0
  41. skills/acolyt/__init__.py +83 -0
  42. skills/acolyt/acolyt.jpg +0 -0
  43. skills/acolyt/ask.py +128 -0
  44. skills/acolyt/base.py +28 -0
  45. skills/acolyt/schema.json +89 -0
  46. skills/aixbt/README.md +71 -0
  47. skills/aixbt/__init__.py +73 -0
  48. skills/aixbt/aixbt.jpg +0 -0
  49. skills/aixbt/base.py +21 -0
  50. skills/aixbt/projects.py +153 -0
  51. skills/aixbt/schema.json +99 -0
  52. skills/allora/__init__.py +83 -0
  53. skills/allora/allora.jpeg +0 -0
  54. skills/allora/base.py +28 -0
  55. skills/allora/price.py +130 -0
  56. skills/allora/schema.json +89 -0
  57. skills/base.py +174 -0
  58. skills/carv/README.md +95 -0
  59. skills/carv/__init__.py +121 -0
  60. skills/carv/base.py +183 -0
  61. skills/carv/carv.webp +0 -0
  62. skills/carv/fetch_news.py +92 -0
  63. skills/carv/onchain_query.py +164 -0
  64. skills/carv/schema.json +137 -0
  65. skills/carv/token_info_and_price.py +110 -0
  66. skills/cdp/__init__.py +137 -0
  67. skills/cdp/base.py +21 -0
  68. skills/cdp/cdp.png +0 -0
  69. skills/cdp/get_balance.py +81 -0
  70. skills/cdp/schema.json +473 -0
  71. skills/chainlist/README.md +38 -0
  72. skills/chainlist/__init__.py +54 -0
  73. skills/chainlist/base.py +21 -0
  74. skills/chainlist/chain_lookup.py +208 -0
  75. skills/chainlist/chainlist.png +0 -0
  76. skills/chainlist/schema.json +47 -0
  77. skills/common/__init__.py +82 -0
  78. skills/common/base.py +21 -0
  79. skills/common/common.jpg +0 -0
  80. skills/common/current_time.py +84 -0
  81. skills/common/schema.json +57 -0
  82. skills/cookiefun/README.md +121 -0
  83. skills/cookiefun/__init__.py +78 -0
  84. skills/cookiefun/base.py +41 -0
  85. skills/cookiefun/constants.py +18 -0
  86. skills/cookiefun/cookiefun.png +0 -0
  87. skills/cookiefun/get_account_details.py +171 -0
  88. skills/cookiefun/get_account_feed.py +282 -0
  89. skills/cookiefun/get_account_smart_followers.py +181 -0
  90. skills/cookiefun/get_sectors.py +128 -0
  91. skills/cookiefun/schema.json +155 -0
  92. skills/cookiefun/search_accounts.py +225 -0
  93. skills/cryptocompare/__init__.py +130 -0
  94. skills/cryptocompare/api.py +159 -0
  95. skills/cryptocompare/base.py +303 -0
  96. skills/cryptocompare/cryptocompare.png +0 -0
  97. skills/cryptocompare/fetch_news.py +96 -0
  98. skills/cryptocompare/fetch_price.py +99 -0
  99. skills/cryptocompare/fetch_top_exchanges.py +113 -0
  100. skills/cryptocompare/fetch_top_market_cap.py +109 -0
  101. skills/cryptocompare/fetch_top_volume.py +108 -0
  102. skills/cryptocompare/fetch_trading_signals.py +107 -0
  103. skills/cryptocompare/schema.json +168 -0
  104. skills/cryptopanic/__init__.py +108 -0
  105. skills/cryptopanic/base.py +51 -0
  106. skills/cryptopanic/cryptopanic.png +0 -0
  107. skills/cryptopanic/fetch_crypto_news.py +153 -0
  108. skills/cryptopanic/fetch_crypto_sentiment.py +136 -0
  109. skills/cryptopanic/schema.json +103 -0
  110. skills/dapplooker/README.md +92 -0
  111. skills/dapplooker/__init__.py +83 -0
  112. skills/dapplooker/base.py +26 -0
  113. skills/dapplooker/dapplooker.jpg +0 -0
  114. skills/dapplooker/dapplooker_token_data.py +476 -0
  115. skills/dapplooker/schema.json +91 -0
  116. skills/defillama/__init__.py +323 -0
  117. skills/defillama/api.py +315 -0
  118. skills/defillama/base.py +135 -0
  119. skills/defillama/coins/__init__.py +0 -0
  120. skills/defillama/coins/fetch_batch_historical_prices.py +116 -0
  121. skills/defillama/coins/fetch_block.py +98 -0
  122. skills/defillama/coins/fetch_current_prices.py +105 -0
  123. skills/defillama/coins/fetch_first_price.py +100 -0
  124. skills/defillama/coins/fetch_historical_prices.py +110 -0
  125. skills/defillama/coins/fetch_price_chart.py +109 -0
  126. skills/defillama/coins/fetch_price_percentage.py +93 -0
  127. skills/defillama/config/__init__.py +0 -0
  128. skills/defillama/config/chains.py +433 -0
  129. skills/defillama/defillama.jpeg +0 -0
  130. skills/defillama/fees/__init__.py +0 -0
  131. skills/defillama/fees/fetch_fees_overview.py +130 -0
  132. skills/defillama/schema.json +383 -0
  133. skills/defillama/stablecoins/__init__.py +0 -0
  134. skills/defillama/stablecoins/fetch_stablecoin_chains.py +100 -0
  135. skills/defillama/stablecoins/fetch_stablecoin_charts.py +129 -0
  136. skills/defillama/stablecoins/fetch_stablecoin_prices.py +83 -0
  137. skills/defillama/stablecoins/fetch_stablecoins.py +126 -0
  138. skills/defillama/tests/__init__.py +0 -0
  139. skills/defillama/tests/api_integration.test.py +192 -0
  140. skills/defillama/tests/api_unit.test.py +583 -0
  141. skills/defillama/tvl/__init__.py +0 -0
  142. skills/defillama/tvl/fetch_chain_historical_tvl.py +106 -0
  143. skills/defillama/tvl/fetch_chains.py +107 -0
  144. skills/defillama/tvl/fetch_historical_tvl.py +91 -0
  145. skills/defillama/tvl/fetch_protocol.py +207 -0
  146. skills/defillama/tvl/fetch_protocol_current_tvl.py +93 -0
  147. skills/defillama/tvl/fetch_protocols.py +196 -0
  148. skills/defillama/volumes/__init__.py +0 -0
  149. skills/defillama/volumes/fetch_dex_overview.py +157 -0
  150. skills/defillama/volumes/fetch_dex_summary.py +123 -0
  151. skills/defillama/volumes/fetch_options_overview.py +131 -0
  152. skills/defillama/yields/__init__.py +0 -0
  153. skills/defillama/yields/fetch_pool_chart.py +100 -0
  154. skills/defillama/yields/fetch_pools.py +126 -0
  155. skills/dexscreener/__init__.py +93 -0
  156. skills/dexscreener/base.py +133 -0
  157. skills/dexscreener/dexscreener.png +0 -0
  158. skills/dexscreener/model/__init__.py +0 -0
  159. skills/dexscreener/model/search_token_response.py +82 -0
  160. skills/dexscreener/schema.json +48 -0
  161. skills/dexscreener/search_token.py +321 -0
  162. skills/dune_analytics/__init__.py +103 -0
  163. skills/dune_analytics/base.py +46 -0
  164. skills/dune_analytics/dune.png +0 -0
  165. skills/dune_analytics/fetch_kol_buys.py +128 -0
  166. skills/dune_analytics/fetch_nation_metrics.py +237 -0
  167. skills/dune_analytics/schema.json +99 -0
  168. skills/elfa/README.md +100 -0
  169. skills/elfa/__init__.py +123 -0
  170. skills/elfa/base.py +28 -0
  171. skills/elfa/elfa.jpg +0 -0
  172. skills/elfa/mention.py +504 -0
  173. skills/elfa/schema.json +153 -0
  174. skills/elfa/stats.py +118 -0
  175. skills/elfa/tokens.py +126 -0
  176. skills/enso/README.md +75 -0
  177. skills/enso/__init__.py +114 -0
  178. skills/enso/abi/__init__.py +0 -0
  179. skills/enso/abi/approval.py +279 -0
  180. skills/enso/abi/erc20.py +14 -0
  181. skills/enso/abi/route.py +129 -0
  182. skills/enso/base.py +44 -0
  183. skills/enso/best_yield.py +286 -0
  184. skills/enso/enso.jpg +0 -0
  185. skills/enso/networks.py +105 -0
  186. skills/enso/prices.py +93 -0
  187. skills/enso/route.py +300 -0
  188. skills/enso/schema.json +212 -0
  189. skills/enso/tokens.py +223 -0
  190. skills/enso/wallet.py +381 -0
  191. skills/github/README.md +63 -0
  192. skills/github/__init__.py +54 -0
  193. skills/github/base.py +21 -0
  194. skills/github/github.jpg +0 -0
  195. skills/github/github_search.py +183 -0
  196. skills/github/schema.json +59 -0
  197. skills/heurist/__init__.py +143 -0
  198. skills/heurist/base.py +26 -0
  199. skills/heurist/heurist.png +0 -0
  200. skills/heurist/image_generation_animagine_xl.py +162 -0
  201. skills/heurist/image_generation_arthemy_comics.py +162 -0
  202. skills/heurist/image_generation_arthemy_real.py +162 -0
  203. skills/heurist/image_generation_braindance.py +162 -0
  204. skills/heurist/image_generation_cyber_realistic_xl.py +162 -0
  205. skills/heurist/image_generation_flux_1_dev.py +162 -0
  206. skills/heurist/image_generation_sdxl.py +161 -0
  207. skills/heurist/schema.json +196 -0
  208. skills/lifi/README.md +294 -0
  209. skills/lifi/__init__.py +141 -0
  210. skills/lifi/base.py +21 -0
  211. skills/lifi/lifi.png +0 -0
  212. skills/lifi/schema.json +89 -0
  213. skills/lifi/token_execute.py +472 -0
  214. skills/lifi/token_quote.py +190 -0
  215. skills/lifi/utils.py +656 -0
  216. skills/moralis/README.md +490 -0
  217. skills/moralis/__init__.py +110 -0
  218. skills/moralis/api.py +281 -0
  219. skills/moralis/base.py +55 -0
  220. skills/moralis/fetch_chain_portfolio.py +191 -0
  221. skills/moralis/fetch_nft_portfolio.py +284 -0
  222. skills/moralis/fetch_solana_portfolio.py +331 -0
  223. skills/moralis/fetch_wallet_portfolio.py +301 -0
  224. skills/moralis/moralis.png +0 -0
  225. skills/moralis/schema.json +156 -0
  226. skills/moralis/tests/__init__.py +0 -0
  227. skills/moralis/tests/test_wallet.py +511 -0
  228. skills/nation/__init__.py +62 -0
  229. skills/nation/base.py +31 -0
  230. skills/nation/nation.png +0 -0
  231. skills/nation/nft_check.py +106 -0
  232. skills/nation/schema.json +58 -0
  233. skills/openai/__init__.py +107 -0
  234. skills/openai/base.py +32 -0
  235. skills/openai/dalle_image_generation.py +128 -0
  236. skills/openai/gpt_image_generation.py +152 -0
  237. skills/openai/gpt_image_to_image.py +186 -0
  238. skills/openai/image_to_text.py +126 -0
  239. skills/openai/openai.png +0 -0
  240. skills/openai/schema.json +139 -0
  241. skills/portfolio/README.md +55 -0
  242. skills/portfolio/__init__.py +151 -0
  243. skills/portfolio/base.py +107 -0
  244. skills/portfolio/constants.py +9 -0
  245. skills/portfolio/moralis.png +0 -0
  246. skills/portfolio/schema.json +237 -0
  247. skills/portfolio/token_balances.py +155 -0
  248. skills/portfolio/wallet_approvals.py +102 -0
  249. skills/portfolio/wallet_defi_positions.py +80 -0
  250. skills/portfolio/wallet_history.py +155 -0
  251. skills/portfolio/wallet_net_worth.py +112 -0
  252. skills/portfolio/wallet_nfts.py +139 -0
  253. skills/portfolio/wallet_profitability.py +101 -0
  254. skills/portfolio/wallet_profitability_summary.py +91 -0
  255. skills/portfolio/wallet_stats.py +79 -0
  256. skills/portfolio/wallet_swaps.py +147 -0
  257. skills/skills.toml +103 -0
  258. skills/slack/__init__.py +98 -0
  259. skills/slack/base.py +55 -0
  260. skills/slack/get_channel.py +109 -0
  261. skills/slack/get_message.py +136 -0
  262. skills/slack/schedule_message.py +92 -0
  263. skills/slack/schema.json +135 -0
  264. skills/slack/send_message.py +81 -0
  265. skills/slack/slack.jpg +0 -0
  266. skills/system/__init__.py +90 -0
  267. skills/system/base.py +22 -0
  268. skills/system/read_agent_api_key.py +87 -0
  269. skills/system/regenerate_agent_api_key.py +77 -0
  270. skills/system/schema.json +53 -0
  271. skills/system/system.svg +76 -0
  272. skills/tavily/README.md +86 -0
  273. skills/tavily/__init__.py +91 -0
  274. skills/tavily/base.py +27 -0
  275. skills/tavily/schema.json +119 -0
  276. skills/tavily/tavily.jpg +0 -0
  277. skills/tavily/tavily_extract.py +147 -0
  278. skills/tavily/tavily_search.py +139 -0
  279. skills/token/README.md +89 -0
  280. skills/token/__init__.py +107 -0
  281. skills/token/base.py +154 -0
  282. skills/token/constants.py +9 -0
  283. skills/token/erc20_transfers.py +145 -0
  284. skills/token/moralis.png +0 -0
  285. skills/token/schema.json +141 -0
  286. skills/token/token_analytics.py +81 -0
  287. skills/token/token_price.py +132 -0
  288. skills/token/token_search.py +121 -0
  289. skills/twitter/__init__.py +146 -0
  290. skills/twitter/base.py +68 -0
  291. skills/twitter/follow_user.py +69 -0
  292. skills/twitter/get_mentions.py +124 -0
  293. skills/twitter/get_timeline.py +111 -0
  294. skills/twitter/get_user_by_username.py +84 -0
  295. skills/twitter/get_user_tweets.py +123 -0
  296. skills/twitter/like_tweet.py +65 -0
  297. skills/twitter/post_tweet.py +90 -0
  298. skills/twitter/reply_tweet.py +98 -0
  299. skills/twitter/retweet.py +76 -0
  300. skills/twitter/schema.json +258 -0
  301. skills/twitter/search_tweets.py +115 -0
  302. skills/twitter/twitter.png +0 -0
  303. skills/unrealspeech/__init__.py +55 -0
  304. skills/unrealspeech/base.py +21 -0
  305. skills/unrealspeech/schema.json +100 -0
  306. skills/unrealspeech/text_to_speech.py +177 -0
  307. skills/unrealspeech/unrealspeech.jpg +0 -0
  308. skills/venice_audio/__init__.py +106 -0
  309. skills/venice_audio/base.py +119 -0
  310. skills/venice_audio/input.py +41 -0
  311. skills/venice_audio/schema.json +152 -0
  312. skills/venice_audio/venice_audio.py +240 -0
  313. skills/venice_audio/venice_logo.jpg +0 -0
  314. skills/venice_image/README.md +119 -0
  315. skills/venice_image/__init__.py +154 -0
  316. skills/venice_image/api.py +138 -0
  317. skills/venice_image/base.py +188 -0
  318. skills/venice_image/config.py +35 -0
  319. skills/venice_image/image_enhance/README.md +119 -0
  320. skills/venice_image/image_enhance/__init__.py +0 -0
  321. skills/venice_image/image_enhance/image_enhance.py +80 -0
  322. skills/venice_image/image_enhance/image_enhance_base.py +23 -0
  323. skills/venice_image/image_enhance/image_enhance_input.py +40 -0
  324. skills/venice_image/image_generation/README.md +144 -0
  325. skills/venice_image/image_generation/__init__.py +0 -0
  326. skills/venice_image/image_generation/image_generation_base.py +117 -0
  327. skills/venice_image/image_generation/image_generation_fluently_xl.py +26 -0
  328. skills/venice_image/image_generation/image_generation_flux_dev.py +27 -0
  329. skills/venice_image/image_generation/image_generation_flux_dev_uncensored.py +26 -0
  330. skills/venice_image/image_generation/image_generation_input.py +158 -0
  331. skills/venice_image/image_generation/image_generation_lustify_sdxl.py +26 -0
  332. skills/venice_image/image_generation/image_generation_pony_realism.py +26 -0
  333. skills/venice_image/image_generation/image_generation_stable_diffusion_3_5.py +28 -0
  334. skills/venice_image/image_generation/image_generation_venice_sd35.py +28 -0
  335. skills/venice_image/image_upscale/README.md +111 -0
  336. skills/venice_image/image_upscale/__init__.py +0 -0
  337. skills/venice_image/image_upscale/image_upscale.py +90 -0
  338. skills/venice_image/image_upscale/image_upscale_base.py +23 -0
  339. skills/venice_image/image_upscale/image_upscale_input.py +22 -0
  340. skills/venice_image/image_vision/README.md +112 -0
  341. skills/venice_image/image_vision/__init__.py +0 -0
  342. skills/venice_image/image_vision/image_vision.py +100 -0
  343. skills/venice_image/image_vision/image_vision_base.py +17 -0
  344. skills/venice_image/image_vision/image_vision_input.py +9 -0
  345. skills/venice_image/schema.json +267 -0
  346. skills/venice_image/utils.py +78 -0
  347. skills/venice_image/venice_image.jpg +0 -0
  348. skills/web_scraper/README.md +82 -0
  349. skills/web_scraper/__init__.py +92 -0
  350. skills/web_scraper/base.py +21 -0
  351. skills/web_scraper/langchain.png +0 -0
  352. skills/web_scraper/schema.json +115 -0
  353. skills/web_scraper/scrape_and_index.py +327 -0
  354. utils/__init__.py +1 -0
  355. utils/chain.py +436 -0
  356. utils/error.py +134 -0
  357. utils/logging.py +70 -0
  358. utils/middleware.py +61 -0
  359. utils/random.py +16 -0
  360. utils/s3.py +267 -0
  361. utils/slack_alert.py +79 -0
  362. utils/tx.py +37 -0
  363. intentkit-0.5.0.dist-info/RECORD +0 -4
  364. {intentkit-0.5.0.dist-info → intentkit-0.5.1.dist-info}/WHEEL +0 -0
  365. {intentkit-0.5.0.dist-info → intentkit-0.5.1.dist-info}/licenses/LICENSE +0 -0
models/app_setting.py ADDED
@@ -0,0 +1,156 @@
1
+ import json
2
+ from datetime import datetime, timezone
3
+ from decimal import ROUND_HALF_UP, Decimal
4
+ from typing import Annotated, Any, List
5
+
6
+ from intentkit.models.base import Base
7
+ from intentkit.models.db import get_session
8
+ from intentkit.models.redis import get_redis
9
+ from pydantic import BaseModel, ConfigDict, Field, field_validator
10
+ from sqlalchemy import Column, DateTime, String, func, select
11
+ from sqlalchemy.dialects.postgresql import JSON, JSONB
12
+
13
+
14
+ class AppSettingTable(Base):
15
+ """App settings database table model."""
16
+
17
+ __tablename__ = "app_settings"
18
+
19
+ key = Column(
20
+ String,
21
+ primary_key=True,
22
+ )
23
+ value = Column(
24
+ JSON().with_variant(JSONB(), "postgresql"),
25
+ nullable=False,
26
+ )
27
+ created_at = Column(
28
+ DateTime(timezone=True),
29
+ nullable=False,
30
+ server_default=func.now(),
31
+ )
32
+ updated_at = Column(
33
+ DateTime(timezone=True),
34
+ nullable=False,
35
+ server_default=func.now(),
36
+ onupdate=lambda: datetime.now(timezone.utc),
37
+ )
38
+
39
+
40
+ class PaymentSettings(BaseModel):
41
+ """Payment settings model."""
42
+
43
+ model_config = ConfigDict(
44
+ json_schema_extra={
45
+ "example": {
46
+ "credit_per_usdc": 1000,
47
+ "fee_platform_percentage": 100,
48
+ "fee_dev_percentage": 20,
49
+ "agent_whitelist_enabled": False,
50
+ "agent_whitelist": [],
51
+ }
52
+ }
53
+ )
54
+
55
+ credit_per_usdc: Annotated[
56
+ Decimal,
57
+ Field(default=Decimal("1000"), description="Number of credits per USDC"),
58
+ ]
59
+ fee_platform_percentage: Annotated[
60
+ Decimal,
61
+ Field(
62
+ default=Decimal("100"), description="Platform fee percentage", ge=0, le=100
63
+ ),
64
+ ]
65
+ fee_dev_percentage: Annotated[
66
+ Decimal,
67
+ Field(
68
+ default=Decimal("20"), description="Developer fee percentage", ge=0, le=100
69
+ ),
70
+ ]
71
+ agent_whitelist_enabled: Annotated[
72
+ bool,
73
+ Field(default=False, description="Whether agent whitelist is enabled"),
74
+ ]
75
+ agent_whitelist: Annotated[
76
+ List[str],
77
+ Field(default_factory=list, description="List of whitelisted agent IDs"),
78
+ ]
79
+
80
+ @field_validator("credit_per_usdc", "fee_platform_percentage", "fee_dev_percentage")
81
+ @classmethod
82
+ def round_decimal(cls, v: Any) -> Decimal:
83
+ """Round decimal values to 4 decimal places."""
84
+ if isinstance(v, Decimal):
85
+ return v.quantize(Decimal("0.0001"), rounding=ROUND_HALF_UP)
86
+ elif isinstance(v, (int, float)):
87
+ return Decimal(str(v)).quantize(Decimal("0.0001"), rounding=ROUND_HALF_UP)
88
+ return v
89
+
90
+
91
+ class AppSetting(BaseModel):
92
+ """App setting model with all fields."""
93
+
94
+ model_config = ConfigDict(
95
+ from_attributes=True,
96
+ json_encoders={
97
+ datetime: lambda v: v.isoformat(timespec="milliseconds"),
98
+ },
99
+ )
100
+
101
+ key: Annotated[str, Field(description="Setting key")]
102
+ value: Annotated[Any, Field(description="Setting value as JSON")]
103
+ created_at: Annotated[
104
+ datetime, Field(description="Timestamp when this setting was created")
105
+ ]
106
+ updated_at: Annotated[
107
+ datetime, Field(description="Timestamp when this setting was last updated")
108
+ ]
109
+
110
+ @staticmethod
111
+ async def payment() -> PaymentSettings:
112
+ """Get payment settings from the database with Redis caching.
113
+
114
+ The settings are cached in Redis for 3 minutes.
115
+
116
+ Returns:
117
+ PaymentSettings: Payment settings
118
+ """
119
+ # Redis cache key for payment settings
120
+ cache_key = "intentkit:app:settings:payment"
121
+ cache_ttl = 180 # 3 minutes in seconds
122
+
123
+ # Try to get from Redis cache first
124
+ redis = get_redis()
125
+ cached_data = await redis.get(cache_key)
126
+
127
+ if cached_data:
128
+ # If found in cache, deserialize and return
129
+ try:
130
+ payment_data = json.loads(cached_data)
131
+ return PaymentSettings(**payment_data)
132
+ except (json.JSONDecodeError, TypeError):
133
+ # If cache is corrupted, invalidate it
134
+ await redis.delete(cache_key)
135
+
136
+ # If not in cache or cache is invalid, get from database
137
+ async with get_session() as session:
138
+ # Query the database for the payment settings
139
+ stmt = select(AppSettingTable).where(AppSettingTable.key == "payment")
140
+ setting = await session.scalar(stmt)
141
+
142
+ # If settings don't exist, use default settings
143
+ if not setting:
144
+ payment_settings = PaymentSettings()
145
+ else:
146
+ # Convert the JSON value to PaymentSettings
147
+ payment_settings = PaymentSettings(**setting.value)
148
+
149
+ # Cache the settings in Redis
150
+ await redis.set(
151
+ cache_key,
152
+ json.dumps(payment_settings.model_dump(mode="json")),
153
+ ex=cache_ttl,
154
+ )
155
+
156
+ return payment_settings
models/base.py ADDED
@@ -0,0 +1,9 @@
1
+ """Base SQLAlchemy model for all models in the application."""
2
+
3
+ from sqlalchemy.orm import DeclarativeBase
4
+
5
+
6
+ class Base(DeclarativeBase):
7
+ """Base class for all models."""
8
+
9
+ pass