intentkit 0.7.5.dev3__py3-none-any.whl → 0.8.34.dev7__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (393) hide show
  1. intentkit/MANIFEST.in +14 -0
  2. intentkit/README.md +88 -0
  3. intentkit/__init__.py +6 -4
  4. intentkit/abstracts/agent.py +4 -5
  5. intentkit/abstracts/engine.py +5 -5
  6. intentkit/abstracts/graph.py +15 -8
  7. intentkit/abstracts/skill.py +6 -144
  8. intentkit/abstracts/twitter.py +4 -5
  9. intentkit/clients/__init__.py +9 -2
  10. intentkit/clients/cdp.py +129 -153
  11. intentkit/{utils → clients}/s3.py +109 -34
  12. intentkit/clients/twitter.py +83 -62
  13. intentkit/clients/web3.py +4 -7
  14. intentkit/config/config.py +123 -90
  15. intentkit/core/account_checking.py +802 -0
  16. intentkit/core/agent.py +313 -498
  17. intentkit/core/asset.py +267 -0
  18. intentkit/core/chat.py +5 -3
  19. intentkit/core/client.py +1 -1
  20. intentkit/core/credit.py +49 -41
  21. intentkit/core/draft.py +201 -0
  22. intentkit/core/draft_chat.py +118 -0
  23. intentkit/core/engine.py +378 -287
  24. intentkit/core/manager/__init__.py +25 -0
  25. intentkit/core/manager/engine.py +220 -0
  26. intentkit/core/manager/service.py +172 -0
  27. intentkit/core/manager/skills.py +178 -0
  28. intentkit/core/middleware.py +231 -0
  29. intentkit/core/prompt.py +74 -114
  30. intentkit/core/scheduler.py +143 -0
  31. intentkit/core/statistics.py +168 -0
  32. intentkit/models/agent.py +931 -518
  33. intentkit/models/agent_data.py +165 -106
  34. intentkit/models/agent_schema.json +38 -251
  35. intentkit/models/app_setting.py +15 -13
  36. intentkit/models/chat.py +86 -140
  37. intentkit/models/credit.py +182 -162
  38. intentkit/models/db.py +42 -23
  39. intentkit/models/db_mig.py +120 -3
  40. intentkit/models/draft.py +222 -0
  41. intentkit/models/llm.csv +31 -0
  42. intentkit/models/llm.py +262 -370
  43. intentkit/models/redis.py +6 -4
  44. intentkit/models/skill.py +222 -101
  45. intentkit/models/skills.csv +173 -0
  46. intentkit/models/team.py +189 -0
  47. intentkit/models/user.py +103 -31
  48. intentkit/skills/acolyt/__init__.py +2 -9
  49. intentkit/skills/acolyt/ask.py +3 -4
  50. intentkit/skills/acolyt/base.py +4 -9
  51. intentkit/skills/acolyt/schema.json +4 -3
  52. intentkit/skills/aixbt/__init__.py +2 -13
  53. intentkit/skills/aixbt/base.py +1 -7
  54. intentkit/skills/aixbt/projects.py +14 -15
  55. intentkit/skills/aixbt/schema.json +4 -4
  56. intentkit/skills/allora/__init__.py +2 -9
  57. intentkit/skills/allora/base.py +4 -9
  58. intentkit/skills/allora/price.py +3 -4
  59. intentkit/skills/allora/schema.json +3 -2
  60. intentkit/skills/base.py +241 -41
  61. intentkit/skills/basename/__init__.py +51 -0
  62. intentkit/skills/basename/base.py +11 -0
  63. intentkit/skills/basename/basename.svg +11 -0
  64. intentkit/skills/basename/schema.json +58 -0
  65. intentkit/skills/carv/__init__.py +115 -121
  66. intentkit/skills/carv/base.py +184 -185
  67. intentkit/skills/carv/fetch_news.py +3 -3
  68. intentkit/skills/carv/onchain_query.py +4 -4
  69. intentkit/skills/carv/schema.json +134 -137
  70. intentkit/skills/carv/token_info_and_price.py +6 -6
  71. intentkit/skills/casino/__init__.py +4 -15
  72. intentkit/skills/casino/base.py +1 -7
  73. intentkit/skills/casino/deck_draw.py +5 -8
  74. intentkit/skills/casino/deck_shuffle.py +6 -6
  75. intentkit/skills/casino/dice_roll.py +2 -4
  76. intentkit/skills/casino/schema.json +0 -1
  77. intentkit/skills/cdp/__init__.py +22 -84
  78. intentkit/skills/cdp/base.py +1 -7
  79. intentkit/skills/cdp/schema.json +11 -314
  80. intentkit/skills/chainlist/__init__.py +2 -7
  81. intentkit/skills/chainlist/base.py +1 -7
  82. intentkit/skills/chainlist/chain_lookup.py +18 -18
  83. intentkit/skills/chainlist/schema.json +3 -5
  84. intentkit/skills/common/__init__.py +2 -9
  85. intentkit/skills/common/base.py +1 -7
  86. intentkit/skills/common/current_time.py +1 -2
  87. intentkit/skills/common/schema.json +2 -2
  88. intentkit/skills/cookiefun/__init__.py +6 -9
  89. intentkit/skills/cookiefun/base.py +2 -7
  90. intentkit/skills/cookiefun/get_account_details.py +7 -7
  91. intentkit/skills/cookiefun/get_account_feed.py +19 -19
  92. intentkit/skills/cookiefun/get_account_smart_followers.py +7 -7
  93. intentkit/skills/cookiefun/get_sectors.py +3 -3
  94. intentkit/skills/cookiefun/schema.json +1 -3
  95. intentkit/skills/cookiefun/search_accounts.py +9 -9
  96. intentkit/skills/cryptocompare/__init__.py +7 -24
  97. intentkit/skills/cryptocompare/api.py +2 -3
  98. intentkit/skills/cryptocompare/base.py +10 -24
  99. intentkit/skills/cryptocompare/fetch_news.py +4 -5
  100. intentkit/skills/cryptocompare/fetch_price.py +6 -7
  101. intentkit/skills/cryptocompare/fetch_top_exchanges.py +4 -5
  102. intentkit/skills/cryptocompare/fetch_top_market_cap.py +4 -5
  103. intentkit/skills/cryptocompare/fetch_top_volume.py +4 -5
  104. intentkit/skills/cryptocompare/fetch_trading_signals.py +5 -6
  105. intentkit/skills/cryptocompare/schema.json +3 -3
  106. intentkit/skills/cryptopanic/__init__.py +7 -10
  107. intentkit/skills/cryptopanic/base.py +51 -55
  108. intentkit/skills/cryptopanic/fetch_crypto_news.py +4 -8
  109. intentkit/skills/cryptopanic/fetch_crypto_sentiment.py +5 -7
  110. intentkit/skills/cryptopanic/schema.json +105 -103
  111. intentkit/skills/dapplooker/__init__.py +2 -9
  112. intentkit/skills/dapplooker/base.py +4 -9
  113. intentkit/skills/dapplooker/dapplooker_token_data.py +7 -7
  114. intentkit/skills/dapplooker/schema.json +3 -5
  115. intentkit/skills/defillama/__init__.py +24 -74
  116. intentkit/skills/defillama/api.py +6 -9
  117. intentkit/skills/defillama/base.py +8 -19
  118. intentkit/skills/defillama/coins/fetch_batch_historical_prices.py +8 -10
  119. intentkit/skills/defillama/coins/fetch_block.py +6 -8
  120. intentkit/skills/defillama/coins/fetch_current_prices.py +8 -10
  121. intentkit/skills/defillama/coins/fetch_first_price.py +7 -9
  122. intentkit/skills/defillama/coins/fetch_historical_prices.py +9 -11
  123. intentkit/skills/defillama/coins/fetch_price_chart.py +9 -11
  124. intentkit/skills/defillama/coins/fetch_price_percentage.py +7 -9
  125. intentkit/skills/defillama/config/chains.py +1 -3
  126. intentkit/skills/defillama/fees/fetch_fees_overview.py +24 -26
  127. intentkit/skills/defillama/schema.json +5 -1
  128. intentkit/skills/defillama/stablecoins/fetch_stablecoin_chains.py +16 -18
  129. intentkit/skills/defillama/stablecoins/fetch_stablecoin_charts.py +8 -10
  130. intentkit/skills/defillama/stablecoins/fetch_stablecoin_prices.py +5 -7
  131. intentkit/skills/defillama/stablecoins/fetch_stablecoins.py +7 -9
  132. intentkit/skills/defillama/tests/api_integration.test.py +1 -1
  133. intentkit/skills/defillama/tvl/fetch_chain_historical_tvl.py +4 -6
  134. intentkit/skills/defillama/tvl/fetch_chains.py +9 -11
  135. intentkit/skills/defillama/tvl/fetch_historical_tvl.py +4 -6
  136. intentkit/skills/defillama/tvl/fetch_protocol.py +32 -38
  137. intentkit/skills/defillama/tvl/fetch_protocol_current_tvl.py +3 -5
  138. intentkit/skills/defillama/tvl/fetch_protocols.py +37 -45
  139. intentkit/skills/defillama/volumes/fetch_dex_overview.py +42 -48
  140. intentkit/skills/defillama/volumes/fetch_dex_summary.py +35 -37
  141. intentkit/skills/defillama/volumes/fetch_options_overview.py +24 -28
  142. intentkit/skills/defillama/yields/fetch_pool_chart.py +10 -12
  143. intentkit/skills/defillama/yields/fetch_pools.py +26 -30
  144. intentkit/skills/dexscreener/__init__.py +97 -102
  145. intentkit/skills/dexscreener/base.py +125 -130
  146. intentkit/skills/dexscreener/get_pair_info.py +4 -5
  147. intentkit/skills/dexscreener/get_token_pairs.py +4 -5
  148. intentkit/skills/dexscreener/get_tokens_info.py +7 -8
  149. intentkit/skills/dexscreener/model/search_token_response.py +80 -82
  150. intentkit/skills/dexscreener/schema.json +91 -93
  151. intentkit/skills/dexscreener/search_token.py +182 -184
  152. intentkit/skills/dexscreener/utils.py +15 -14
  153. intentkit/skills/dune_analytics/__init__.py +7 -9
  154. intentkit/skills/dune_analytics/base.py +48 -52
  155. intentkit/skills/dune_analytics/fetch_kol_buys.py +5 -7
  156. intentkit/skills/dune_analytics/fetch_nation_metrics.py +6 -8
  157. intentkit/skills/dune_analytics/schema.json +104 -99
  158. intentkit/skills/elfa/__init__.py +5 -18
  159. intentkit/skills/elfa/base.py +10 -14
  160. intentkit/skills/elfa/mention.py +19 -21
  161. intentkit/skills/elfa/schema.json +3 -2
  162. intentkit/skills/elfa/stats.py +4 -4
  163. intentkit/skills/elfa/tokens.py +12 -12
  164. intentkit/skills/elfa/utils.py +26 -28
  165. intentkit/skills/enso/__init__.py +11 -31
  166. intentkit/skills/enso/base.py +54 -35
  167. intentkit/skills/enso/best_yield.py +16 -24
  168. intentkit/skills/enso/networks.py +6 -11
  169. intentkit/skills/enso/prices.py +11 -13
  170. intentkit/skills/enso/route.py +34 -38
  171. intentkit/skills/enso/schema.json +3 -2
  172. intentkit/skills/enso/tokens.py +29 -38
  173. intentkit/skills/enso/wallet.py +76 -191
  174. intentkit/skills/erc20/__init__.py +50 -0
  175. intentkit/skills/erc20/base.py +11 -0
  176. intentkit/skills/erc20/erc20.svg +5 -0
  177. intentkit/skills/erc20/schema.json +74 -0
  178. intentkit/skills/erc721/__init__.py +53 -0
  179. intentkit/skills/erc721/base.py +11 -0
  180. intentkit/skills/erc721/erc721.svg +5 -0
  181. intentkit/skills/erc721/schema.json +90 -0
  182. intentkit/skills/firecrawl/__init__.py +5 -18
  183. intentkit/skills/firecrawl/base.py +4 -9
  184. intentkit/skills/firecrawl/clear.py +4 -8
  185. intentkit/skills/firecrawl/crawl.py +19 -19
  186. intentkit/skills/firecrawl/query.py +4 -3
  187. intentkit/skills/firecrawl/schema.json +2 -6
  188. intentkit/skills/firecrawl/scrape.py +17 -22
  189. intentkit/skills/firecrawl/utils.py +50 -42
  190. intentkit/skills/github/__init__.py +2 -7
  191. intentkit/skills/github/base.py +1 -7
  192. intentkit/skills/github/github_search.py +1 -2
  193. intentkit/skills/github/schema.json +3 -4
  194. intentkit/skills/heurist/__init__.py +8 -27
  195. intentkit/skills/heurist/base.py +4 -9
  196. intentkit/skills/heurist/image_generation_animagine_xl.py +13 -15
  197. intentkit/skills/heurist/image_generation_arthemy_comics.py +13 -15
  198. intentkit/skills/heurist/image_generation_arthemy_real.py +13 -15
  199. intentkit/skills/heurist/image_generation_braindance.py +13 -15
  200. intentkit/skills/heurist/image_generation_cyber_realistic_xl.py +13 -15
  201. intentkit/skills/heurist/image_generation_flux_1_dev.py +13 -15
  202. intentkit/skills/heurist/image_generation_sdxl.py +13 -15
  203. intentkit/skills/heurist/schema.json +2 -2
  204. intentkit/skills/http/__init__.py +4 -15
  205. intentkit/skills/http/base.py +1 -7
  206. intentkit/skills/http/get.py +21 -16
  207. intentkit/skills/http/post.py +23 -18
  208. intentkit/skills/http/put.py +23 -18
  209. intentkit/skills/http/schema.json +4 -5
  210. intentkit/skills/lifi/__init__.py +8 -13
  211. intentkit/skills/lifi/base.py +3 -9
  212. intentkit/skills/lifi/schema.json +17 -8
  213. intentkit/skills/lifi/token_execute.py +150 -60
  214. intentkit/skills/lifi/token_quote.py +8 -10
  215. intentkit/skills/lifi/utils.py +104 -51
  216. intentkit/skills/moralis/__init__.py +6 -10
  217. intentkit/skills/moralis/api.py +6 -7
  218. intentkit/skills/moralis/base.py +5 -10
  219. intentkit/skills/moralis/fetch_chain_portfolio.py +10 -11
  220. intentkit/skills/moralis/fetch_nft_portfolio.py +22 -22
  221. intentkit/skills/moralis/fetch_solana_portfolio.py +11 -12
  222. intentkit/skills/moralis/fetch_wallet_portfolio.py +8 -9
  223. intentkit/skills/moralis/schema.json +7 -2
  224. intentkit/skills/morpho/__init__.py +52 -0
  225. intentkit/skills/morpho/base.py +11 -0
  226. intentkit/skills/morpho/morpho.svg +12 -0
  227. intentkit/skills/morpho/schema.json +73 -0
  228. intentkit/skills/nation/__init__.py +4 -9
  229. intentkit/skills/nation/base.py +5 -10
  230. intentkit/skills/nation/nft_check.py +3 -4
  231. intentkit/skills/nation/schema.json +4 -3
  232. intentkit/skills/onchain.py +30 -0
  233. intentkit/skills/openai/__init__.py +17 -18
  234. intentkit/skills/openai/base.py +10 -14
  235. intentkit/skills/openai/dalle_image_generation.py +4 -9
  236. intentkit/skills/openai/gpt_avatar_generator.py +102 -0
  237. intentkit/skills/openai/gpt_image_generation.py +5 -9
  238. intentkit/skills/openai/gpt_image_mini_generator.py +92 -0
  239. intentkit/skills/openai/gpt_image_to_image.py +5 -9
  240. intentkit/skills/openai/image_to_text.py +3 -7
  241. intentkit/skills/openai/schema.json +34 -3
  242. intentkit/skills/portfolio/__init__.py +11 -35
  243. intentkit/skills/portfolio/base.py +33 -19
  244. intentkit/skills/portfolio/schema.json +3 -5
  245. intentkit/skills/portfolio/token_balances.py +21 -21
  246. intentkit/skills/portfolio/wallet_approvals.py +17 -18
  247. intentkit/skills/portfolio/wallet_defi_positions.py +3 -3
  248. intentkit/skills/portfolio/wallet_history.py +31 -31
  249. intentkit/skills/portfolio/wallet_net_worth.py +13 -13
  250. intentkit/skills/portfolio/wallet_nfts.py +19 -19
  251. intentkit/skills/portfolio/wallet_profitability.py +18 -18
  252. intentkit/skills/portfolio/wallet_profitability_summary.py +5 -5
  253. intentkit/skills/portfolio/wallet_stats.py +3 -3
  254. intentkit/skills/portfolio/wallet_swaps.py +19 -19
  255. intentkit/skills/pyth/__init__.py +50 -0
  256. intentkit/skills/pyth/base.py +11 -0
  257. intentkit/skills/pyth/pyth.svg +6 -0
  258. intentkit/skills/pyth/schema.json +75 -0
  259. intentkit/skills/skills.toml +36 -0
  260. intentkit/skills/slack/__init__.py +5 -17
  261. intentkit/skills/slack/base.py +3 -9
  262. intentkit/skills/slack/get_channel.py +8 -8
  263. intentkit/skills/slack/get_message.py +9 -9
  264. intentkit/skills/slack/schedule_message.py +5 -5
  265. intentkit/skills/slack/schema.json +2 -2
  266. intentkit/skills/slack/send_message.py +3 -5
  267. intentkit/skills/supabase/__init__.py +7 -23
  268. intentkit/skills/supabase/base.py +1 -7
  269. intentkit/skills/supabase/delete_data.py +4 -4
  270. intentkit/skills/supabase/fetch_data.py +12 -12
  271. intentkit/skills/supabase/insert_data.py +4 -4
  272. intentkit/skills/supabase/invoke_function.py +6 -6
  273. intentkit/skills/supabase/schema.json +2 -3
  274. intentkit/skills/supabase/update_data.py +6 -6
  275. intentkit/skills/supabase/upsert_data.py +4 -4
  276. intentkit/skills/superfluid/__init__.py +53 -0
  277. intentkit/skills/superfluid/base.py +11 -0
  278. intentkit/skills/superfluid/schema.json +89 -0
  279. intentkit/skills/superfluid/superfluid.svg +6 -0
  280. intentkit/skills/system/__init__.py +7 -24
  281. intentkit/skills/system/add_autonomous_task.py +10 -12
  282. intentkit/skills/system/delete_autonomous_task.py +2 -2
  283. intentkit/skills/system/edit_autonomous_task.py +14 -18
  284. intentkit/skills/system/list_autonomous_tasks.py +3 -5
  285. intentkit/skills/system/read_agent_api_key.py +6 -4
  286. intentkit/skills/system/regenerate_agent_api_key.py +6 -4
  287. intentkit/skills/system/schema.json +6 -8
  288. intentkit/skills/tavily/__init__.py +3 -12
  289. intentkit/skills/tavily/base.py +4 -9
  290. intentkit/skills/tavily/schema.json +3 -5
  291. intentkit/skills/tavily/tavily_extract.py +2 -4
  292. intentkit/skills/tavily/tavily_search.py +4 -6
  293. intentkit/skills/token/__init__.py +5 -10
  294. intentkit/skills/token/base.py +7 -11
  295. intentkit/skills/token/erc20_transfers.py +19 -19
  296. intentkit/skills/token/schema.json +3 -6
  297. intentkit/skills/token/token_analytics.py +3 -3
  298. intentkit/skills/token/token_price.py +13 -13
  299. intentkit/skills/token/token_search.py +9 -9
  300. intentkit/skills/twitter/__init__.py +11 -35
  301. intentkit/skills/twitter/base.py +22 -34
  302. intentkit/skills/twitter/follow_user.py +2 -6
  303. intentkit/skills/twitter/get_mentions.py +5 -12
  304. intentkit/skills/twitter/get_timeline.py +4 -12
  305. intentkit/skills/twitter/get_user_by_username.py +2 -6
  306. intentkit/skills/twitter/get_user_tweets.py +5 -13
  307. intentkit/skills/twitter/like_tweet.py +2 -6
  308. intentkit/skills/twitter/post_tweet.py +6 -9
  309. intentkit/skills/twitter/reply_tweet.py +6 -9
  310. intentkit/skills/twitter/retweet.py +2 -6
  311. intentkit/skills/twitter/schema.json +1 -0
  312. intentkit/skills/twitter/search_tweets.py +4 -12
  313. intentkit/skills/unrealspeech/__init__.py +2 -7
  314. intentkit/skills/unrealspeech/base.py +2 -8
  315. intentkit/skills/unrealspeech/schema.json +2 -5
  316. intentkit/skills/unrealspeech/text_to_speech.py +8 -8
  317. intentkit/skills/venice_audio/__init__.py +98 -106
  318. intentkit/skills/venice_audio/base.py +117 -121
  319. intentkit/skills/venice_audio/input.py +41 -41
  320. intentkit/skills/venice_audio/schema.json +151 -152
  321. intentkit/skills/venice_audio/venice_audio.py +38 -21
  322. intentkit/skills/venice_image/__init__.py +147 -154
  323. intentkit/skills/venice_image/api.py +138 -138
  324. intentkit/skills/venice_image/base.py +185 -192
  325. intentkit/skills/venice_image/config.py +33 -35
  326. intentkit/skills/venice_image/image_enhance/image_enhance.py +2 -3
  327. intentkit/skills/venice_image/image_enhance/image_enhance_base.py +21 -23
  328. intentkit/skills/venice_image/image_enhance/image_enhance_input.py +38 -40
  329. intentkit/skills/venice_image/image_generation/image_generation_base.py +11 -10
  330. intentkit/skills/venice_image/image_generation/image_generation_fluently_xl.py +26 -26
  331. intentkit/skills/venice_image/image_generation/image_generation_flux_dev.py +27 -27
  332. intentkit/skills/venice_image/image_generation/image_generation_flux_dev_uncensored.py +26 -26
  333. intentkit/skills/venice_image/image_generation/image_generation_input.py +158 -158
  334. intentkit/skills/venice_image/image_generation/image_generation_lustify_sdxl.py +26 -26
  335. intentkit/skills/venice_image/image_generation/image_generation_pony_realism.py +26 -26
  336. intentkit/skills/venice_image/image_generation/image_generation_stable_diffusion_3_5.py +28 -28
  337. intentkit/skills/venice_image/image_generation/image_generation_venice_sd35.py +28 -28
  338. intentkit/skills/venice_image/image_upscale/image_upscale.py +3 -3
  339. intentkit/skills/venice_image/image_upscale/image_upscale_base.py +21 -23
  340. intentkit/skills/venice_image/image_upscale/image_upscale_input.py +22 -22
  341. intentkit/skills/venice_image/image_vision/image_vision.py +2 -2
  342. intentkit/skills/venice_image/image_vision/image_vision_base.py +17 -17
  343. intentkit/skills/venice_image/image_vision/image_vision_input.py +9 -9
  344. intentkit/skills/venice_image/schema.json +267 -267
  345. intentkit/skills/venice_image/utils.py +77 -78
  346. intentkit/skills/web_scraper/__init__.py +5 -18
  347. intentkit/skills/web_scraper/base.py +21 -7
  348. intentkit/skills/web_scraper/document_indexer.py +7 -6
  349. intentkit/skills/web_scraper/schema.json +2 -6
  350. intentkit/skills/web_scraper/scrape_and_index.py +15 -15
  351. intentkit/skills/web_scraper/utils.py +62 -63
  352. intentkit/skills/web_scraper/website_indexer.py +17 -19
  353. intentkit/skills/weth/__init__.py +49 -0
  354. intentkit/skills/weth/base.py +11 -0
  355. intentkit/skills/weth/schema.json +58 -0
  356. intentkit/skills/weth/weth.svg +6 -0
  357. intentkit/skills/wow/__init__.py +51 -0
  358. intentkit/skills/wow/base.py +11 -0
  359. intentkit/skills/wow/schema.json +89 -0
  360. intentkit/skills/wow/wow.svg +7 -0
  361. intentkit/skills/x402/__init__.py +58 -0
  362. intentkit/skills/x402/base.py +99 -0
  363. intentkit/skills/x402/http_request.py +117 -0
  364. intentkit/skills/x402/schema.json +40 -0
  365. intentkit/skills/x402/x402.webp +0 -0
  366. intentkit/skills/xmtp/__init__.py +4 -15
  367. intentkit/skills/xmtp/base.py +5 -5
  368. intentkit/skills/xmtp/price.py +7 -6
  369. intentkit/skills/xmtp/schema.json +69 -71
  370. intentkit/skills/xmtp/swap.py +6 -8
  371. intentkit/skills/xmtp/transfer.py +4 -6
  372. intentkit/utils/__init__.py +4 -0
  373. intentkit/utils/chain.py +198 -96
  374. intentkit/utils/ens.py +135 -0
  375. intentkit/utils/error.py +5 -2
  376. intentkit/utils/logging.py +9 -11
  377. intentkit/utils/schema.py +100 -0
  378. intentkit/utils/slack_alert.py +8 -8
  379. intentkit/utils/tx.py +16 -8
  380. intentkit/uv.lock +3377 -0
  381. {intentkit-0.7.5.dev3.dist-info → intentkit-0.8.34.dev7.dist-info}/METADATA +13 -15
  382. intentkit-0.8.34.dev7.dist-info/RECORD +478 -0
  383. intentkit-0.8.34.dev7.dist-info/licenses/LICENSE +21 -0
  384. intentkit/core/node.py +0 -215
  385. intentkit/models/conversation.py +0 -286
  386. intentkit/models/generator.py +0 -347
  387. intentkit/skills/cdp/get_balance.py +0 -110
  388. intentkit/skills/cdp/swap.py +0 -121
  389. intentkit/skills/moralis/tests/__init__.py +0 -0
  390. intentkit/skills/moralis/tests/test_wallet.py +0 -511
  391. intentkit-0.7.5.dev3.dist-info/RECORD +0 -424
  392. {intentkit-0.7.5.dev3.dist-info/licenses → intentkit}/LICENSE +0 -0
  393. {intentkit-0.7.5.dev3.dist-info → intentkit-0.8.34.dev7.dist-info}/WHEEL +0 -0
intentkit/models/db.py CHANGED
@@ -1,18 +1,19 @@
1
+ from collections.abc import AsyncGenerator
1
2
  from contextlib import asynccontextmanager
2
- from typing import Annotated, AsyncGenerator, Optional
3
+ from typing import Annotated
3
4
  from urllib.parse import quote_plus
4
5
 
5
- from intentkit.models.db_mig import safe_migrate
6
- from langgraph.checkpoint.memory import InMemorySaver
7
- from langgraph.checkpoint.postgres.aio import AsyncPostgresSaver
8
- from langgraph.types import Checkpointer
6
+ from langgraph.checkpoint.postgres.shallow import AsyncShallowPostgresSaver
9
7
  from psycopg import OperationalError
10
8
  from psycopg_pool import AsyncConnectionPool
11
9
  from pydantic import Field
12
10
  from sqlalchemy.ext.asyncio import AsyncEngine, AsyncSession, create_async_engine
13
11
 
14
- engine = None
15
- _langgraph_checkpointer: Optional[Checkpointer] = None
12
+ from intentkit.models.db_mig import safe_migrate
13
+
14
+ engine: AsyncEngine | None = None
15
+ _connection_pool: AsyncConnectionPool | None = None
16
+ _checkpointer: AsyncShallowPostgresSaver | None = None
16
17
 
17
18
 
18
19
  async def check_connection(conn):
@@ -28,11 +29,11 @@ async def check_connection(conn):
28
29
 
29
30
 
30
31
  async def init_db(
31
- host: Optional[str],
32
- username: Optional[str],
33
- password: Optional[str],
34
- dbname: Optional[str],
35
- port: Annotated[Optional[str], Field(default="5432", description="Database port")],
32
+ host: str | None,
33
+ username: str | None,
34
+ password: str | None,
35
+ dbname: str | None,
36
+ port: Annotated[str | None, Field(default="5432", description="Database port")],
36
37
  auto_migrate: Annotated[
37
38
  bool, Field(default=True, description="Whether to run migrations automatically")
38
39
  ],
@@ -51,9 +52,9 @@ async def init_db(
51
52
  auto_migrate: Whether to run migrations automatically (default: True)
52
53
  pool_size: Database connection pool size (default: 3)
53
54
  """
54
- global engine, _langgraph_checkpointer
55
- # Initialize psycopg pool and AsyncPostgresSaver if not already initialized
56
- if _langgraph_checkpointer is None:
55
+ global engine, _connection_pool, _checkpointer
56
+ # Initialize psycopg pool and AsyncShallowPostgresSaver if not already initialized
57
+ if _connection_pool is None:
57
58
  if host:
58
59
  conn_string = (
59
60
  f"postgresql://{username}:{quote_plus(password)}@{host}:{port}/{dbname}"
@@ -69,13 +70,17 @@ async def init_db(
69
70
  # Set connection max lifetime to prevent stale connections
70
71
  max_lifetime=3600, # 1 hour
71
72
  )
72
- _langgraph_checkpointer = AsyncPostgresSaver(pool)
73
+ _connection_pool = pool
74
+ _checkpointer = AsyncShallowPostgresSaver(pool)
73
75
  if auto_migrate:
74
76
  # Migrate can not use pool, so we start from scratch
75
- async with AsyncPostgresSaver.from_conn_string(conn_string) as saver:
77
+ async with AsyncShallowPostgresSaver.from_conn_string(
78
+ conn_string
79
+ ) as saver:
76
80
  await saver.setup()
77
81
  else:
78
- _langgraph_checkpointer = InMemorySaver()
82
+ # For in-memory, we don't need a pool, but we need to handle it if requested
83
+ pass
79
84
  # Initialize SQLAlchemy engine with pool settings
80
85
  if engine is None:
81
86
  if host:
@@ -97,6 +102,7 @@ async def init_db(
97
102
 
98
103
 
99
104
  async def get_db() -> AsyncGenerator[AsyncSession, None]:
105
+ assert engine is not None, "Database engine not initialized. Call init_db first."
100
106
  async with AsyncSession(engine) as session:
101
107
  yield session
102
108
 
@@ -119,6 +125,7 @@ async def get_session() -> AsyncGenerator[AsyncSession, None]:
119
125
  # session is automatically closed
120
126
  ```
121
127
  """
128
+ assert engine is not None, "Database engine not initialized. Call init_db first."
122
129
  session = AsyncSession(engine)
123
130
  try:
124
131
  yield session
@@ -132,15 +139,27 @@ def get_engine() -> AsyncEngine:
132
139
  Returns:
133
140
  AsyncEngine: The SQLAlchemy async engine
134
141
  """
142
+ assert engine is not None, "Database engine not initialized. Call init_db first."
135
143
  return engine
136
144
 
137
145
 
138
- def get_langgraph_checkpointer() -> Checkpointer:
139
- """Get the AsyncPostgresSaver instance for langgraph.
146
+ def get_connection_pool() -> AsyncConnectionPool:
147
+ """Get the AsyncConnectionPool instance.
140
148
 
141
149
  Returns:
142
- AsyncPostgresSaver: The AsyncPostgresSaver instance
150
+ AsyncConnectionPool: The AsyncConnectionPool instance
143
151
  """
144
- if _langgraph_checkpointer is None:
152
+ if _connection_pool is None:
145
153
  raise RuntimeError("Database pool not initialized. Call init_db first.")
146
- return _langgraph_checkpointer
154
+ return _connection_pool
155
+
156
+
157
+ def get_checkpointer() -> AsyncShallowPostgresSaver:
158
+ """Get the AsyncShallowPostgresSaver instance.
159
+
160
+ Returns:
161
+ AsyncShallowPostgresSaver: The AsyncShallowPostgresSaver instance
162
+ """
163
+ if _checkpointer is None:
164
+ raise RuntimeError("Database checkpointer not initialized. Call init_db first.")
165
+ return _checkpointer
@@ -1,11 +1,12 @@
1
1
  """Database migration utilities."""
2
2
 
3
3
  import logging
4
- from typing import Callable
4
+ from collections.abc import Callable
5
5
 
6
- from intentkit.models.base import Base
7
6
  from sqlalchemy import Column, MetaData, inspect, text
8
7
 
8
+ from intentkit.models.base import Base
9
+
9
10
  logger = logging.getLogger(__name__)
10
11
 
11
12
 
@@ -40,7 +41,7 @@ async def add_column_if_not_exists(
40
41
  default_value = str(default_value).lower()
41
42
  elif isinstance(default_value, str):
42
43
  default_value = f"'{default_value}'"
43
- elif isinstance(default_value, (list, dict)):
44
+ elif isinstance(default_value, list | dict):
44
45
  default_value = "'{}'"
45
46
  column_def += f" DEFAULT {default_value}"
46
47
 
@@ -95,8 +96,124 @@ async def safe_migrate(engine) -> None:
95
96
  await update_table_schema(conn, dialect, model_cls)
96
97
 
97
98
  await update_table_wrapper()
99
+
100
+ # Migrate checkpoints tables
101
+ await migrate_checkpoints_table(conn)
98
102
  except Exception as e:
99
103
  logger.error(f"Error updating database schema: {str(e)}")
100
104
  raise
101
105
 
102
106
  logger.info("Database schema updated successfully")
107
+
108
+
109
+ async def migrate_checkpoints_table(conn) -> None:
110
+ """Migrate checkpoints tables to support langgraph 2.0."""
111
+ tables = ["checkpoints", "checkpoint_blobs", "checkpoint_writes"]
112
+
113
+ def _get_tables(connection):
114
+ insp = inspect(connection)
115
+ return insp.get_table_names()
116
+
117
+ existing_tables = await conn.run_sync(_get_tables)
118
+
119
+ for table in tables:
120
+ if table not in existing_tables:
121
+ continue
122
+
123
+ # Step 1: Add checkpoint_ns column
124
+ await conn.execute(
125
+ text(
126
+ f"ALTER TABLE {table} ADD COLUMN IF NOT EXISTS checkpoint_ns TEXT DEFAULT ''"
127
+ )
128
+ )
129
+
130
+ # Step 2: Check current and expected Primary Key
131
+ def _check_pk(connection, table_name=table):
132
+ insp = inspect(connection)
133
+ return insp.get_pk_constraint(table_name)
134
+
135
+ pk = await conn.run_sync(_check_pk)
136
+ current_cols = set(pk.get("constrained_columns", []))
137
+
138
+ # Expected columns depend on table
139
+ expected_cols = set()
140
+ pk_cols = ""
141
+ if table == "checkpoints":
142
+ expected_cols = {"thread_id", "checkpoint_ns"}
143
+ pk_cols = "thread_id, checkpoint_ns"
144
+ elif table == "checkpoint_blobs":
145
+ expected_cols = {"thread_id", "checkpoint_ns", "channel"}
146
+ pk_cols = "thread_id, checkpoint_ns, channel"
147
+ elif table == "checkpoint_writes":
148
+ expected_cols = {
149
+ "thread_id",
150
+ "checkpoint_ns",
151
+ "checkpoint_id",
152
+ "task_id",
153
+ "idx",
154
+ }
155
+ pk_cols = "thread_id, checkpoint_ns, checkpoint_id, task_id, idx"
156
+
157
+ # Step 3: Handle duplicates BEFORE dropping columns (so we can use checkpoint_id, version, etc.)
158
+ if current_cols != expected_cols:
159
+ logger.info(f"Migrating {table} PK from {current_cols} to {expected_cols}")
160
+
161
+ if table == "checkpoints" and expected_cols == {
162
+ "thread_id",
163
+ "checkpoint_ns",
164
+ }:
165
+ # Keep only the latest checkpoint based on MAX(checkpoint_id)
166
+ await conn.execute(
167
+ text("""
168
+ DELETE FROM checkpoints
169
+ WHERE (thread_id, checkpoint_ns, checkpoint_id) NOT IN (
170
+ SELECT thread_id, checkpoint_ns, MAX(checkpoint_id)
171
+ FROM checkpoints
172
+ GROUP BY thread_id, checkpoint_ns
173
+ )
174
+ """)
175
+ )
176
+
177
+ elif table == "checkpoint_blobs" and expected_cols == {
178
+ "thread_id",
179
+ "checkpoint_ns",
180
+ "channel",
181
+ }:
182
+ # Keep only blobs referenced by checkpoints via channel_versions
183
+ await conn.execute(
184
+ text("""
185
+ DELETE FROM checkpoint_blobs cb
186
+ WHERE NOT EXISTS (
187
+ SELECT 1
188
+ FROM checkpoints cp
189
+ WHERE cp.thread_id = cb.thread_id
190
+ AND cp.checkpoint_ns = cb.checkpoint_ns
191
+ AND (cp.checkpoint -> 'channel_versions' ->> cb.channel) = cb.version
192
+ )
193
+ """)
194
+ )
195
+
196
+ # Step 4: Update Primary Key FIRST (before dropping columns)
197
+ if current_cols != expected_cols:
198
+ if pk.get("name"):
199
+ await conn.execute(
200
+ text(f"ALTER TABLE {table} DROP CONSTRAINT {pk['name']}")
201
+ )
202
+
203
+ await conn.execute(text(f"ALTER TABLE {table} ADD PRIMARY KEY ({pk_cols})"))
204
+
205
+ # Step 5: Drop columns that ShallowPostgresSaver doesn't use
206
+ # (Can only drop AFTER removing from PK)
207
+ if table == "checkpoints":
208
+ await conn.execute(
209
+ text("ALTER TABLE checkpoints DROP COLUMN IF EXISTS checkpoint_id")
210
+ )
211
+ await conn.execute(
212
+ text(
213
+ "ALTER TABLE checkpoints DROP COLUMN IF EXISTS parent_checkpoint_id"
214
+ )
215
+ )
216
+ elif table == "checkpoint_blobs":
217
+ await conn.execute(
218
+ text("ALTER TABLE checkpoint_blobs DROP COLUMN IF EXISTS version")
219
+ )
@@ -0,0 +1,222 @@
1
+ from datetime import datetime, timezone
2
+ from enum import Enum
3
+ from typing import Annotated
4
+
5
+ from epyxid import XID
6
+ from fastapi import status
7
+ from pydantic import BaseModel, Field
8
+ from sqlalchemy import Column, DateTime, Index, String, func, select
9
+
10
+ from intentkit.models.agent import (
11
+ AgentUserInput,
12
+ AgentUserInputColumns,
13
+ )
14
+ from intentkit.models.base import Base
15
+ from intentkit.models.db import get_session
16
+ from intentkit.utils.error import IntentKitAPIError
17
+
18
+
19
+ class AgentState(str, Enum):
20
+ """Agent state."""
21
+
22
+ PRIVATE = "private"
23
+ PUBLIC = "public"
24
+ CITIZEN = "citizen"
25
+
26
+
27
+ class AgentExtra(BaseModel):
28
+ """Agent extra data in AgentUpdate."""
29
+
30
+ state: AgentState = Field(default=AgentState.PRIVATE, description="Agent state")
31
+ draft_id: str = Field(description="Draft ID")
32
+ project_id: str | None = Field(
33
+ default=None, description="Project ID, forward compatible"
34
+ )
35
+ request_id: str | None = Field(
36
+ default=None, description="Request ID, forward compatible"
37
+ )
38
+ create_tx_id: str | None = Field(
39
+ default=None, description="Transaction hash used when the agent was created"
40
+ )
41
+
42
+
43
+ class AgentDraftTable(Base, AgentUserInputColumns):
44
+ """Agent table db model."""
45
+
46
+ __tablename__ = "agent_drafts"
47
+
48
+ id = Column(
49
+ String,
50
+ primary_key=True,
51
+ comment="Unique identifier for the agent. Must be URL-safe, containing only lowercase letters, numbers, and hyphens",
52
+ )
53
+ agent_id = Column(
54
+ String,
55
+ nullable=False,
56
+ comment="Agent id",
57
+ )
58
+ owner = Column(
59
+ String,
60
+ nullable=True,
61
+ comment="Owner identifier of the agent, used for access control",
62
+ )
63
+ team_id = Column(
64
+ String,
65
+ nullable=True,
66
+ comment="Team identifier of the agent, used for access control",
67
+ )
68
+ version = Column(
69
+ String,
70
+ nullable=True,
71
+ comment="Version hash of the agent",
72
+ )
73
+ project_id = Column(
74
+ String,
75
+ nullable=True,
76
+ comment="Project ID, forward compatible",
77
+ )
78
+ last_draft_id = Column(
79
+ String,
80
+ nullable=True,
81
+ comment="ID of the last draft that was deployed",
82
+ )
83
+ deployed_at = Column(
84
+ DateTime(timezone=True),
85
+ nullable=True,
86
+ comment="Timestamp when the agent was deployed",
87
+ )
88
+ # auto timestamp
89
+ created_at = Column(
90
+ DateTime(timezone=True),
91
+ nullable=False,
92
+ server_default=func.now(),
93
+ comment="Timestamp when the agent was created",
94
+ )
95
+ updated_at = Column(
96
+ DateTime(timezone=True),
97
+ nullable=False,
98
+ server_default=func.now(),
99
+ onupdate=lambda: datetime.now(timezone.utc),
100
+ comment="Timestamp when the agent was last updated",
101
+ )
102
+
103
+ # Indexes for optimal query performance
104
+ __table_args__ = (
105
+ # Index for queries filtering by agent_id and owner (most common pattern)
106
+ Index("idx_agent_drafts_agent_owner", "agent_id", "owner"),
107
+ # Index for queries ordering by created_at (for latest draft queries)
108
+ Index("idx_agent_drafts_created_at", "created_at"),
109
+ # Composite index for agent_id, owner, and created_at (covers all common query patterns)
110
+ Index(
111
+ "idx_agent_drafts_agent_owner_created", "agent_id", "owner", "created_at"
112
+ ),
113
+ )
114
+
115
+
116
+ class AgentDraft(AgentUserInput):
117
+ """Agent draft model."""
118
+
119
+ id: Annotated[
120
+ str,
121
+ Field(
122
+ default_factory=lambda: str(XID()),
123
+ description="Unique identifier for the draft",
124
+ ),
125
+ ]
126
+ agent_id: Annotated[
127
+ str,
128
+ Field(
129
+ description="Agent id",
130
+ ),
131
+ ]
132
+ owner: Annotated[
133
+ str | None,
134
+ Field(
135
+ default=None,
136
+ description="Owner identifier of the agent, used for access control",
137
+ max_length=50,
138
+ ),
139
+ ]
140
+ team_id: Annotated[
141
+ str | None,
142
+ Field(
143
+ default=None,
144
+ description="Team identifier of the agent, used for access control",
145
+ max_length=50,
146
+ ),
147
+ ]
148
+ version: Annotated[
149
+ str | None,
150
+ Field(
151
+ default=None,
152
+ description="Version hash of the agent",
153
+ ),
154
+ ]
155
+ project_id: Annotated[
156
+ str | None,
157
+ Field(
158
+ default=None,
159
+ description="Project ID, forward compatible",
160
+ ),
161
+ ]
162
+ last_draft_id: Annotated[
163
+ str | None,
164
+ Field(
165
+ default=None,
166
+ description="ID of the last draft that was deployed",
167
+ ),
168
+ ]
169
+ deployed_at: Annotated[
170
+ datetime | None,
171
+ Field(
172
+ default=None,
173
+ description="Timestamp when the agent was deployed",
174
+ ),
175
+ ]
176
+ # auto timestamp
177
+ created_at: Annotated[
178
+ datetime,
179
+ Field(
180
+ description="Timestamp when the agent was created, will ignore when importing"
181
+ ),
182
+ ]
183
+ updated_at: Annotated[
184
+ datetime,
185
+ Field(
186
+ description="Timestamp when the agent was last updated, will ignore when importing"
187
+ ),
188
+ ]
189
+
190
+ @staticmethod
191
+ async def exist(agent_id: str, user_id: str | None = None) -> None:
192
+ """Check if an agent exists in the draft table.
193
+
194
+ Args:
195
+ agent_id: The agent ID to check
196
+ user_id: Optional user ID to check ownership
197
+
198
+ Raises:
199
+ IntentKitAPIError: 404 if agent not found, 403 if user doesn't own the agent
200
+ """
201
+ async with get_session() as session:
202
+ query = (
203
+ select(AgentDraftTable)
204
+ .where(AgentDraftTable.agent_id == agent_id)
205
+ .limit(1)
206
+ )
207
+ result = await session.execute(query)
208
+ draft = result.scalar_one_or_none()
209
+
210
+ if not draft:
211
+ raise IntentKitAPIError(
212
+ status.HTTP_404_NOT_FOUND,
213
+ "AgentNotFound",
214
+ f"Agent {agent_id} not found",
215
+ )
216
+
217
+ if user_id is not None and draft.owner != user_id:
218
+ raise IntentKitAPIError(
219
+ status.HTTP_403_FORBIDDEN,
220
+ "AgentForbidden",
221
+ "Agent does not belong to user",
222
+ )
@@ -0,0 +1,31 @@
1
+ id,name,provider,enabled,input_price,output_price,price_level,context_length,output_length,intelligence,speed,supports_image_input,supports_skill_calls,supports_structured_output,has_reasoning,supports_search,supports_temperature,supports_frequency_penalty,supports_presence_penalty,api_base,timeout
2
+ minimax/minimax-m2:free,MiniMax M2,gatewayz,FALSE,0,0,1,204800,131000,4,2,FALSE,TRUE,FALSE,FALSE,FALSE,TRUE,FALSE,FALSE,https://api.gatewayz.ai/v1,300
3
+ qwen/qwen3-coder:exacto,Qwen3 Coder,gatewayz,FALSE,0.38,1.53,2,262000,262000,3,3,FALSE,TRUE,FALSE,FALSE,FALSE,TRUE,FALSE,FALSE,https://api.gatewayz.ai/v1,300
4
+ google/gemini-2.5-flash,Gemini 2.5 Flash,gatewayz,FALSE,0.3,2.5,2,1050000,65000,3,4,TRUE,TRUE,FALSE,TRUE,FALSE,TRUE,FALSE,FALSE,https://api.gatewayz.ai/v1,300
5
+ google/gemini-2.5-pro,Gemini 2.5 Pro,gatewayz,FALSE,1.25,10,4,1050000,65000,4,2,TRUE,TRUE,FALSE,TRUE,FALSE,TRUE,FALSE,FALSE,https://api.gatewayz.ai/v1,300
6
+ anthropic/claude-sonnet-4.5,Anthropic Claude Sonnet 4.5,gatewayz,FALSE,3,15,5,200000,64000,5,1,TRUE,TRUE,FALSE,TRUE,FALSE,TRUE,FALSE,FALSE,https://api.gatewayz.ai/v1,300
7
+ gpt-5-nano,GPT-5 Nano,openai,TRUE,0.05,0.4,1,400000,128000,3,5,TRUE,TRUE,TRUE,TRUE,FALSE,FALSE,FALSE,FALSE,,180
8
+ gpt-5-mini,GPT-5 Mini,openai,TRUE,0.25,2,2,400000,128000,4,4,TRUE,TRUE,TRUE,TRUE,TRUE,FALSE,FALSE,FALSE,,180
9
+ gpt-5,GPT-5,openai,TRUE,1.25,10,4,400000,128000,5,3,TRUE,TRUE,TRUE,TRUE,TRUE,FALSE,FALSE,FALSE,,180
10
+ gpt-5.1,GPT-5.1,openai,TRUE,1.25,10,4,400000,128000,5,3,TRUE,TRUE,TRUE,TRUE,TRUE,FALSE,FALSE,FALSE,,180
11
+ gpt-5.1-codex,GPT-5.1 Codex,openai,TRUE,1.25,10,4,400000,128000,5,3,TRUE,TRUE,TRUE,TRUE,TRUE,FALSE,FALSE,FALSE,,180
12
+ gpt-5.1-codex-mini,GPT-5.1 Codex Mini,openai,TRUE,0.25,2,2,400000,128000,4,4,TRUE,TRUE,TRUE,TRUE,TRUE,FALSE,FALSE,FALSE,,180
13
+ gpt-4o,GPT-4o,openai,FALSE,2.5,10,4,128000,4096,4,3,TRUE,TRUE,TRUE,FALSE,TRUE,TRUE,FALSE,FALSE,,180
14
+ gpt-4o-mini,GPT-4o Mini,openai,FALSE,0.15,0.6,1,128000,4096,3,4,FALSE,TRUE,TRUE,FALSE,TRUE,TRUE,FALSE,FALSE,,180
15
+ gpt-4.1-nano,GPT-4.1 Nano,openai,TRUE,0.1,0.4,1,128000,4096,3,5,FALSE,TRUE,TRUE,FALSE,FALSE,TRUE,FALSE,FALSE,,180
16
+ gpt-4.1-mini,GPT-4.1 Mini,openai,TRUE,0.4,1.6,2,128000,4096,4,4,FALSE,TRUE,TRUE,FALSE,TRUE,TRUE,FALSE,FALSE,,180
17
+ gpt-4.1,GPT-4.1,openai,TRUE,2,8,4,128000,4096,5,3,TRUE,TRUE,TRUE,FALSE,TRUE,TRUE,FALSE,FALSE,,180
18
+ o3,OpenAI o3,openai,TRUE,2,8,4,200000,100000,5,1,TRUE,TRUE,TRUE,TRUE,FALSE,FALSE,FALSE,FALSE,,180
19
+ o4-mini,OpenAI o4-mini,openai,TRUE,1.1,4.4,3,128000,4096,4,3,FALSE,TRUE,TRUE,TRUE,FALSE,FALSE,FALSE,FALSE,,180
20
+ deepseek-chat,Deepseek V3.2 Exp,deepseek,TRUE,0.28,0.42,2,128000,4096,4,3,FALSE,TRUE,TRUE,FALSE,FALSE,TRUE,TRUE,TRUE,https://api.deepseek.com,300
21
+ deepseek-reasoner,DeepSeek V3.2 Exp (Thinking Mode),deepseek,TRUE,0.28,0.42,2,128000,32000,5,1,FALSE,TRUE,TRUE,TRUE,FALSE,TRUE,TRUE,TRUE,https://api.deepseek.com,300
22
+ grok-4,Grok 4,xai,TRUE,3,15,4,256000,4096,5,3,TRUE,TRUE,TRUE,TRUE,TRUE,TRUE,FALSE,FALSE,,180
23
+ grok-4-fast-non-reasoning,Grok 4 Fast,xai,TRUE,0.2,0.5,2,2000000,4096,3,4,TRUE,TRUE,TRUE,FALSE,TRUE,TRUE,FALSE,FALSE,,180
24
+ grok-4-fast-reasoning,Grok 4 Fast Reasoning,xai,TRUE,0.2,0.5,2,2000000,4096,3,4,TRUE,TRUE,TRUE,TRUE,TRUE,TRUE,FALSE,FALSE,,180
25
+ grok-code-fast-1,Grok Code Fast 1,xai,TRUE,0.2,1.5,3,256000,4096,4,4,FALSE,TRUE,TRUE,TRUE,TRUE,TRUE,FALSE,FALSE,,180
26
+ grok-3,Grok 3,xai,TRUE,3,15,4,131072,4096,5,3,FALSE,TRUE,TRUE,FALSE,TRUE,TRUE,FALSE,FALSE,,180
27
+ grok-3-mini,Grok 3 Mini,xai,TRUE,0.3,0.5,2,131072,4096,5,3,FALSE,TRUE,TRUE,TRUE,TRUE,TRUE,FALSE,FALSE,,180
28
+ eternalai,Eternal AI (Llama-3.3-70B),eternal,FALSE,0.25,0.75,2,64000,4096,4,3,FALSE,TRUE,TRUE,FALSE,FALSE,TRUE,TRUE,TRUE,https://api.eternalai.org/v1,300
29
+ reigent,REI Network,reigent,FALSE,0.5,1.5,3,32000,4096,4,3,FALSE,TRUE,TRUE,FALSE,FALSE,FALSE,FALSE,FALSE,https://api.reisearch.box/v1,300
30
+ venice-uncensored,Venice Uncensored,venice,TRUE,0.5,2,3,32000,4096,4,3,FALSE,TRUE,TRUE,FALSE,FALSE,FALSE,FALSE,FALSE,https://api.venice.ai/api/v1,300
31
+ venice-llama-4-maverick-17b,Venice Llama 4 Maverick 17B,venice,TRUE,1.5,6,4,32000,4096,4,3,FALSE,TRUE,TRUE,FALSE,FALSE,FALSE,FALSE,FALSE,https://api.venice.ai/api/v1,300