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

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

Potentially problematic release.


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

Files changed (385) 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 +14 -7
  5. intentkit/abstracts/skill.py +6 -144
  6. intentkit/abstracts/twitter.py +4 -5
  7. intentkit/clients/__init__.py +5 -2
  8. intentkit/clients/cdp.py +101 -141
  9. intentkit/clients/twitter.py +83 -62
  10. intentkit/clients/web3.py +29 -0
  11. intentkit/config/config.py +8 -5
  12. intentkit/core/agent.py +472 -195
  13. intentkit/core/asset.py +253 -0
  14. intentkit/core/chat.py +51 -0
  15. intentkit/core/client.py +1 -1
  16. intentkit/core/credit.py +460 -130
  17. intentkit/core/engine.py +262 -233
  18. intentkit/core/node.py +15 -16
  19. intentkit/core/prompt.py +62 -28
  20. intentkit/core/scheduler.py +92 -0
  21. intentkit/core/statistics.py +168 -0
  22. intentkit/models/agent.py +1096 -949
  23. intentkit/models/agent_data.py +68 -38
  24. intentkit/models/agent_public.json +98 -0
  25. intentkit/models/agent_schema.json +54 -439
  26. intentkit/models/app_setting.py +96 -33
  27. intentkit/models/chat.py +74 -27
  28. intentkit/models/conversation.py +8 -8
  29. intentkit/models/credit.py +362 -74
  30. intentkit/models/db.py +26 -8
  31. intentkit/models/db_mig.py +2 -2
  32. intentkit/models/llm.csv +28 -0
  33. intentkit/models/llm.py +185 -350
  34. intentkit/models/redis.py +6 -4
  35. intentkit/models/skill.py +186 -72
  36. intentkit/models/skills.csv +174 -0
  37. intentkit/models/user.py +82 -24
  38. intentkit/skills/acolyt/__init__.py +2 -9
  39. intentkit/skills/acolyt/ask.py +3 -4
  40. intentkit/skills/acolyt/base.py +4 -9
  41. intentkit/skills/acolyt/schema.json +4 -3
  42. intentkit/skills/aixbt/__init__.py +2 -13
  43. intentkit/skills/aixbt/base.py +1 -7
  44. intentkit/skills/aixbt/projects.py +14 -15
  45. intentkit/skills/aixbt/schema.json +4 -4
  46. intentkit/skills/allora/__init__.py +2 -9
  47. intentkit/skills/allora/base.py +4 -9
  48. intentkit/skills/allora/price.py +3 -4
  49. intentkit/skills/allora/schema.json +3 -2
  50. intentkit/skills/base.py +248 -85
  51. intentkit/skills/basename/__init__.py +51 -0
  52. intentkit/skills/basename/base.py +11 -0
  53. intentkit/skills/basename/basename.svg +11 -0
  54. intentkit/skills/basename/schema.json +58 -0
  55. intentkit/skills/carv/__init__.py +115 -121
  56. intentkit/skills/carv/base.py +184 -185
  57. intentkit/skills/carv/fetch_news.py +3 -3
  58. intentkit/skills/carv/onchain_query.py +4 -4
  59. intentkit/skills/carv/schema.json +134 -137
  60. intentkit/skills/carv/token_info_and_price.py +5 -5
  61. intentkit/skills/casino/README.md +254 -0
  62. intentkit/skills/casino/__init__.py +86 -0
  63. intentkit/skills/casino/base.py +17 -0
  64. intentkit/skills/casino/casino.png +0 -0
  65. intentkit/skills/casino/deck_draw.py +127 -0
  66. intentkit/skills/casino/deck_shuffle.py +118 -0
  67. intentkit/skills/casino/dice_roll.py +100 -0
  68. intentkit/skills/casino/schema.json +77 -0
  69. intentkit/skills/casino/utils.py +107 -0
  70. intentkit/skills/cdp/__init__.py +22 -84
  71. intentkit/skills/cdp/base.py +1 -7
  72. intentkit/skills/cdp/schema.json +11 -314
  73. intentkit/skills/chainlist/__init__.py +2 -7
  74. intentkit/skills/chainlist/base.py +1 -7
  75. intentkit/skills/chainlist/chain_lookup.py +18 -18
  76. intentkit/skills/chainlist/schema.json +3 -5
  77. intentkit/skills/common/__init__.py +2 -9
  78. intentkit/skills/common/base.py +1 -7
  79. intentkit/skills/common/current_time.py +1 -2
  80. intentkit/skills/common/schema.json +2 -2
  81. intentkit/skills/cookiefun/__init__.py +6 -9
  82. intentkit/skills/cookiefun/base.py +2 -7
  83. intentkit/skills/cookiefun/get_account_details.py +7 -7
  84. intentkit/skills/cookiefun/get_account_feed.py +19 -19
  85. intentkit/skills/cookiefun/get_account_smart_followers.py +7 -7
  86. intentkit/skills/cookiefun/get_sectors.py +3 -3
  87. intentkit/skills/cookiefun/schema.json +1 -3
  88. intentkit/skills/cookiefun/search_accounts.py +9 -9
  89. intentkit/skills/cryptocompare/__init__.py +7 -24
  90. intentkit/skills/cryptocompare/api.py +2 -3
  91. intentkit/skills/cryptocompare/base.py +11 -25
  92. intentkit/skills/cryptocompare/fetch_news.py +4 -5
  93. intentkit/skills/cryptocompare/fetch_price.py +6 -7
  94. intentkit/skills/cryptocompare/fetch_top_exchanges.py +4 -5
  95. intentkit/skills/cryptocompare/fetch_top_market_cap.py +4 -5
  96. intentkit/skills/cryptocompare/fetch_top_volume.py +4 -5
  97. intentkit/skills/cryptocompare/fetch_trading_signals.py +5 -6
  98. intentkit/skills/cryptocompare/schema.json +3 -3
  99. intentkit/skills/cryptopanic/__init__.py +7 -10
  100. intentkit/skills/cryptopanic/base.py +51 -55
  101. intentkit/skills/cryptopanic/fetch_crypto_news.py +4 -8
  102. intentkit/skills/cryptopanic/fetch_crypto_sentiment.py +5 -7
  103. intentkit/skills/cryptopanic/schema.json +105 -103
  104. intentkit/skills/dapplooker/__init__.py +2 -9
  105. intentkit/skills/dapplooker/base.py +4 -9
  106. intentkit/skills/dapplooker/dapplooker_token_data.py +7 -7
  107. intentkit/skills/dapplooker/schema.json +3 -5
  108. intentkit/skills/defillama/__init__.py +24 -74
  109. intentkit/skills/defillama/api.py +6 -9
  110. intentkit/skills/defillama/base.py +11 -21
  111. intentkit/skills/defillama/coins/fetch_batch_historical_prices.py +8 -10
  112. intentkit/skills/defillama/coins/fetch_block.py +6 -8
  113. intentkit/skills/defillama/coins/fetch_current_prices.py +8 -10
  114. intentkit/skills/defillama/coins/fetch_first_price.py +7 -9
  115. intentkit/skills/defillama/coins/fetch_historical_prices.py +9 -11
  116. intentkit/skills/defillama/coins/fetch_price_chart.py +9 -11
  117. intentkit/skills/defillama/coins/fetch_price_percentage.py +7 -9
  118. intentkit/skills/defillama/config/chains.py +1 -3
  119. intentkit/skills/defillama/fees/fetch_fees_overview.py +24 -26
  120. intentkit/skills/defillama/schema.json +5 -1
  121. intentkit/skills/defillama/stablecoins/fetch_stablecoin_chains.py +16 -18
  122. intentkit/skills/defillama/stablecoins/fetch_stablecoin_charts.py +8 -10
  123. intentkit/skills/defillama/stablecoins/fetch_stablecoin_prices.py +5 -7
  124. intentkit/skills/defillama/stablecoins/fetch_stablecoins.py +7 -9
  125. intentkit/skills/defillama/tests/api_integration.test.py +1 -1
  126. intentkit/skills/defillama/tvl/fetch_chain_historical_tvl.py +4 -6
  127. intentkit/skills/defillama/tvl/fetch_chains.py +9 -11
  128. intentkit/skills/defillama/tvl/fetch_historical_tvl.py +4 -6
  129. intentkit/skills/defillama/tvl/fetch_protocol.py +32 -38
  130. intentkit/skills/defillama/tvl/fetch_protocol_current_tvl.py +3 -5
  131. intentkit/skills/defillama/tvl/fetch_protocols.py +37 -45
  132. intentkit/skills/defillama/volumes/fetch_dex_overview.py +42 -48
  133. intentkit/skills/defillama/volumes/fetch_dex_summary.py +35 -37
  134. intentkit/skills/defillama/volumes/fetch_options_overview.py +24 -28
  135. intentkit/skills/defillama/yields/fetch_pool_chart.py +10 -12
  136. intentkit/skills/defillama/yields/fetch_pools.py +26 -30
  137. intentkit/skills/dexscreener/README.md +154 -0
  138. intentkit/skills/dexscreener/__init__.py +97 -93
  139. intentkit/skills/dexscreener/base.py +125 -133
  140. intentkit/skills/dexscreener/get_pair_info.py +158 -0
  141. intentkit/skills/dexscreener/get_token_pairs.py +165 -0
  142. intentkit/skills/dexscreener/get_tokens_info.py +212 -0
  143. intentkit/skills/dexscreener/model/search_token_response.py +80 -82
  144. intentkit/skills/dexscreener/schema.json +91 -48
  145. intentkit/skills/dexscreener/search_token.py +182 -321
  146. intentkit/skills/dexscreener/utils.py +420 -0
  147. intentkit/skills/dune_analytics/__init__.py +7 -9
  148. intentkit/skills/dune_analytics/base.py +48 -52
  149. intentkit/skills/dune_analytics/fetch_kol_buys.py +5 -7
  150. intentkit/skills/dune_analytics/fetch_nation_metrics.py +6 -8
  151. intentkit/skills/dune_analytics/schema.json +104 -99
  152. intentkit/skills/elfa/__init__.py +5 -18
  153. intentkit/skills/elfa/base.py +10 -14
  154. intentkit/skills/elfa/mention.py +19 -21
  155. intentkit/skills/elfa/schema.json +3 -2
  156. intentkit/skills/elfa/stats.py +4 -4
  157. intentkit/skills/elfa/tokens.py +12 -12
  158. intentkit/skills/elfa/utils.py +26 -28
  159. intentkit/skills/enso/__init__.py +11 -31
  160. intentkit/skills/enso/base.py +50 -35
  161. intentkit/skills/enso/best_yield.py +16 -24
  162. intentkit/skills/enso/networks.py +6 -11
  163. intentkit/skills/enso/prices.py +11 -13
  164. intentkit/skills/enso/route.py +34 -38
  165. intentkit/skills/enso/schema.json +3 -2
  166. intentkit/skills/enso/tokens.py +29 -38
  167. intentkit/skills/enso/wallet.py +76 -191
  168. intentkit/skills/erc20/__init__.py +50 -0
  169. intentkit/skills/erc20/base.py +11 -0
  170. intentkit/skills/erc20/erc20.svg +5 -0
  171. intentkit/skills/erc20/schema.json +74 -0
  172. intentkit/skills/erc721/__init__.py +53 -0
  173. intentkit/skills/erc721/base.py +11 -0
  174. intentkit/skills/erc721/erc721.svg +5 -0
  175. intentkit/skills/erc721/schema.json +90 -0
  176. intentkit/skills/firecrawl/README.md +11 -5
  177. intentkit/skills/firecrawl/__init__.py +5 -18
  178. intentkit/skills/firecrawl/base.py +4 -11
  179. intentkit/skills/firecrawl/clear.py +4 -8
  180. intentkit/skills/firecrawl/crawl.py +19 -19
  181. intentkit/skills/firecrawl/query.py +4 -3
  182. intentkit/skills/firecrawl/schema.json +6 -8
  183. intentkit/skills/firecrawl/scrape.py +150 -40
  184. intentkit/skills/firecrawl/utils.py +50 -42
  185. intentkit/skills/github/__init__.py +2 -7
  186. intentkit/skills/github/base.py +1 -7
  187. intentkit/skills/github/github_search.py +1 -2
  188. intentkit/skills/github/schema.json +3 -4
  189. intentkit/skills/heurist/__init__.py +8 -27
  190. intentkit/skills/heurist/base.py +4 -9
  191. intentkit/skills/heurist/image_generation_animagine_xl.py +12 -13
  192. intentkit/skills/heurist/image_generation_arthemy_comics.py +12 -13
  193. intentkit/skills/heurist/image_generation_arthemy_real.py +12 -13
  194. intentkit/skills/heurist/image_generation_braindance.py +12 -13
  195. intentkit/skills/heurist/image_generation_cyber_realistic_xl.py +12 -13
  196. intentkit/skills/heurist/image_generation_flux_1_dev.py +12 -13
  197. intentkit/skills/heurist/image_generation_sdxl.py +12 -13
  198. intentkit/skills/heurist/schema.json +2 -2
  199. intentkit/skills/http/__init__.py +4 -15
  200. intentkit/skills/http/base.py +1 -7
  201. intentkit/skills/http/get.py +21 -16
  202. intentkit/skills/http/post.py +23 -18
  203. intentkit/skills/http/put.py +23 -18
  204. intentkit/skills/http/schema.json +4 -5
  205. intentkit/skills/lifi/__init__.py +8 -13
  206. intentkit/skills/lifi/base.py +1 -7
  207. intentkit/skills/lifi/schema.json +17 -8
  208. intentkit/skills/lifi/token_execute.py +36 -30
  209. intentkit/skills/lifi/token_quote.py +8 -10
  210. intentkit/skills/lifi/utils.py +104 -51
  211. intentkit/skills/moralis/__init__.py +6 -10
  212. intentkit/skills/moralis/api.py +6 -7
  213. intentkit/skills/moralis/base.py +5 -10
  214. intentkit/skills/moralis/fetch_chain_portfolio.py +10 -11
  215. intentkit/skills/moralis/fetch_nft_portfolio.py +22 -22
  216. intentkit/skills/moralis/fetch_solana_portfolio.py +11 -12
  217. intentkit/skills/moralis/fetch_wallet_portfolio.py +8 -9
  218. intentkit/skills/moralis/schema.json +7 -2
  219. intentkit/skills/morpho/__init__.py +52 -0
  220. intentkit/skills/morpho/base.py +11 -0
  221. intentkit/skills/morpho/morpho.svg +12 -0
  222. intentkit/skills/morpho/schema.json +73 -0
  223. intentkit/skills/nation/__init__.py +4 -9
  224. intentkit/skills/nation/base.py +5 -10
  225. intentkit/skills/nation/nft_check.py +3 -4
  226. intentkit/skills/nation/schema.json +4 -3
  227. intentkit/skills/onchain.py +23 -0
  228. intentkit/skills/openai/__init__.py +17 -18
  229. intentkit/skills/openai/base.py +10 -14
  230. intentkit/skills/openai/dalle_image_generation.py +3 -8
  231. intentkit/skills/openai/gpt_avatar_generator.py +102 -0
  232. intentkit/skills/openai/gpt_image_generation.py +4 -8
  233. intentkit/skills/openai/gpt_image_mini_generator.py +91 -0
  234. intentkit/skills/openai/gpt_image_to_image.py +4 -8
  235. intentkit/skills/openai/image_to_text.py +3 -7
  236. intentkit/skills/openai/schema.json +34 -3
  237. intentkit/skills/portfolio/__init__.py +11 -35
  238. intentkit/skills/portfolio/base.py +33 -19
  239. intentkit/skills/portfolio/schema.json +3 -5
  240. intentkit/skills/portfolio/token_balances.py +21 -21
  241. intentkit/skills/portfolio/wallet_approvals.py +17 -18
  242. intentkit/skills/portfolio/wallet_defi_positions.py +3 -3
  243. intentkit/skills/portfolio/wallet_history.py +31 -31
  244. intentkit/skills/portfolio/wallet_net_worth.py +13 -13
  245. intentkit/skills/portfolio/wallet_nfts.py +19 -19
  246. intentkit/skills/portfolio/wallet_profitability.py +18 -18
  247. intentkit/skills/portfolio/wallet_profitability_summary.py +5 -5
  248. intentkit/skills/portfolio/wallet_stats.py +3 -3
  249. intentkit/skills/portfolio/wallet_swaps.py +19 -19
  250. intentkit/skills/pyth/__init__.py +50 -0
  251. intentkit/skills/pyth/base.py +11 -0
  252. intentkit/skills/pyth/pyth.svg +6 -0
  253. intentkit/skills/pyth/schema.json +75 -0
  254. intentkit/skills/skills.toml +40 -0
  255. intentkit/skills/slack/__init__.py +5 -17
  256. intentkit/skills/slack/base.py +3 -9
  257. intentkit/skills/slack/get_channel.py +8 -8
  258. intentkit/skills/slack/get_message.py +9 -9
  259. intentkit/skills/slack/schedule_message.py +5 -5
  260. intentkit/skills/slack/schema.json +2 -2
  261. intentkit/skills/slack/send_message.py +3 -5
  262. intentkit/skills/supabase/__init__.py +7 -23
  263. intentkit/skills/supabase/base.py +9 -13
  264. intentkit/skills/supabase/delete_data.py +5 -6
  265. intentkit/skills/supabase/fetch_data.py +13 -14
  266. intentkit/skills/supabase/insert_data.py +5 -6
  267. intentkit/skills/supabase/invoke_function.py +7 -8
  268. intentkit/skills/supabase/schema.json +2 -3
  269. intentkit/skills/supabase/update_data.py +7 -8
  270. intentkit/skills/supabase/upsert_data.py +5 -6
  271. intentkit/skills/superfluid/__init__.py +53 -0
  272. intentkit/skills/superfluid/base.py +11 -0
  273. intentkit/skills/superfluid/schema.json +89 -0
  274. intentkit/skills/superfluid/superfluid.svg +6 -0
  275. intentkit/skills/system/__init__.py +7 -24
  276. intentkit/skills/system/add_autonomous_task.py +10 -12
  277. intentkit/skills/system/delete_autonomous_task.py +2 -2
  278. intentkit/skills/system/edit_autonomous_task.py +14 -18
  279. intentkit/skills/system/list_autonomous_tasks.py +3 -5
  280. intentkit/skills/system/read_agent_api_key.py +6 -4
  281. intentkit/skills/system/regenerate_agent_api_key.py +6 -4
  282. intentkit/skills/system/schema.json +6 -8
  283. intentkit/skills/tavily/__init__.py +3 -12
  284. intentkit/skills/tavily/base.py +4 -9
  285. intentkit/skills/tavily/schema.json +3 -5
  286. intentkit/skills/tavily/tavily_extract.py +2 -4
  287. intentkit/skills/tavily/tavily_search.py +4 -6
  288. intentkit/skills/token/__init__.py +5 -10
  289. intentkit/skills/token/base.py +7 -11
  290. intentkit/skills/token/erc20_transfers.py +19 -19
  291. intentkit/skills/token/schema.json +3 -6
  292. intentkit/skills/token/token_analytics.py +3 -3
  293. intentkit/skills/token/token_price.py +13 -13
  294. intentkit/skills/token/token_search.py +9 -9
  295. intentkit/skills/twitter/__init__.py +11 -35
  296. intentkit/skills/twitter/base.py +23 -35
  297. intentkit/skills/twitter/follow_user.py +3 -7
  298. intentkit/skills/twitter/get_mentions.py +6 -13
  299. intentkit/skills/twitter/get_timeline.py +5 -13
  300. intentkit/skills/twitter/get_user_by_username.py +3 -7
  301. intentkit/skills/twitter/get_user_tweets.py +6 -14
  302. intentkit/skills/twitter/like_tweet.py +3 -7
  303. intentkit/skills/twitter/post_tweet.py +23 -12
  304. intentkit/skills/twitter/reply_tweet.py +21 -12
  305. intentkit/skills/twitter/retweet.py +3 -7
  306. intentkit/skills/twitter/schema.json +1 -0
  307. intentkit/skills/twitter/search_tweets.py +5 -13
  308. intentkit/skills/unrealspeech/__init__.py +2 -7
  309. intentkit/skills/unrealspeech/base.py +2 -8
  310. intentkit/skills/unrealspeech/schema.json +2 -5
  311. intentkit/skills/unrealspeech/text_to_speech.py +8 -8
  312. intentkit/skills/venice_audio/__init__.py +98 -106
  313. intentkit/skills/venice_audio/base.py +117 -121
  314. intentkit/skills/venice_audio/input.py +41 -41
  315. intentkit/skills/venice_audio/schema.json +151 -152
  316. intentkit/skills/venice_audio/venice_audio.py +38 -21
  317. intentkit/skills/venice_image/__init__.py +147 -154
  318. intentkit/skills/venice_image/api.py +138 -138
  319. intentkit/skills/venice_image/base.py +185 -192
  320. intentkit/skills/venice_image/config.py +33 -35
  321. intentkit/skills/venice_image/image_enhance/image_enhance.py +2 -3
  322. intentkit/skills/venice_image/image_enhance/image_enhance_base.py +21 -23
  323. intentkit/skills/venice_image/image_enhance/image_enhance_input.py +38 -40
  324. intentkit/skills/venice_image/image_generation/image_generation_base.py +9 -9
  325. intentkit/skills/venice_image/image_generation/image_generation_fluently_xl.py +26 -26
  326. intentkit/skills/venice_image/image_generation/image_generation_flux_dev.py +27 -27
  327. intentkit/skills/venice_image/image_generation/image_generation_flux_dev_uncensored.py +26 -26
  328. intentkit/skills/venice_image/image_generation/image_generation_input.py +158 -158
  329. intentkit/skills/venice_image/image_generation/image_generation_lustify_sdxl.py +26 -26
  330. intentkit/skills/venice_image/image_generation/image_generation_pony_realism.py +26 -26
  331. intentkit/skills/venice_image/image_generation/image_generation_stable_diffusion_3_5.py +28 -28
  332. intentkit/skills/venice_image/image_generation/image_generation_venice_sd35.py +28 -28
  333. intentkit/skills/venice_image/image_upscale/image_upscale.py +3 -3
  334. intentkit/skills/venice_image/image_upscale/image_upscale_base.py +21 -23
  335. intentkit/skills/venice_image/image_upscale/image_upscale_input.py +22 -22
  336. intentkit/skills/venice_image/image_vision/image_vision.py +2 -2
  337. intentkit/skills/venice_image/image_vision/image_vision_base.py +17 -17
  338. intentkit/skills/venice_image/image_vision/image_vision_input.py +9 -9
  339. intentkit/skills/venice_image/schema.json +267 -267
  340. intentkit/skills/venice_image/utils.py +77 -78
  341. intentkit/skills/web_scraper/__init__.py +5 -18
  342. intentkit/skills/web_scraper/base.py +21 -7
  343. intentkit/skills/web_scraper/document_indexer.py +7 -6
  344. intentkit/skills/web_scraper/schema.json +2 -6
  345. intentkit/skills/web_scraper/scrape_and_index.py +15 -15
  346. intentkit/skills/web_scraper/utils.py +62 -63
  347. intentkit/skills/web_scraper/website_indexer.py +17 -19
  348. intentkit/skills/weth/__init__.py +49 -0
  349. intentkit/skills/weth/base.py +11 -0
  350. intentkit/skills/weth/schema.json +58 -0
  351. intentkit/skills/weth/weth.svg +6 -0
  352. intentkit/skills/wow/__init__.py +51 -0
  353. intentkit/skills/wow/base.py +11 -0
  354. intentkit/skills/wow/schema.json +89 -0
  355. intentkit/skills/wow/wow.svg +7 -0
  356. intentkit/skills/x402/__init__.py +61 -0
  357. intentkit/skills/x402/ask_agent.py +98 -0
  358. intentkit/skills/x402/base.py +99 -0
  359. intentkit/skills/x402/http_request.py +117 -0
  360. intentkit/skills/x402/schema.json +45 -0
  361. intentkit/skills/x402/x402.webp +0 -0
  362. intentkit/skills/xmtp/__init__.py +4 -15
  363. intentkit/skills/xmtp/base.py +61 -2
  364. intentkit/skills/xmtp/price.py +18 -13
  365. intentkit/skills/xmtp/schema.json +69 -71
  366. intentkit/skills/xmtp/swap.py +22 -25
  367. intentkit/skills/xmtp/transfer.py +71 -32
  368. intentkit/utils/chain.py +3 -3
  369. intentkit/utils/error.py +14 -1
  370. intentkit/utils/logging.py +2 -4
  371. intentkit/utils/s3.py +59 -7
  372. intentkit/utils/schema.py +100 -0
  373. intentkit/utils/slack_alert.py +7 -8
  374. {intentkit-0.6.13.dev2.dist-info → intentkit-0.8.17.dist-info}/METADATA +14 -16
  375. intentkit-0.8.17.dist-info/RECORD +466 -0
  376. intentkit/abstracts/exception.py +0 -9
  377. intentkit/core/skill.py +0 -200
  378. intentkit/models/generator.py +0 -347
  379. intentkit/skills/cdp/get_balance.py +0 -110
  380. intentkit/skills/cdp/swap.py +0 -121
  381. intentkit/skills/moralis/tests/__init__.py +0 -0
  382. intentkit/skills/moralis/tests/test_wallet.py +0 -511
  383. intentkit-0.6.13.dev2.dist-info/RECORD +0 -409
  384. {intentkit-0.6.13.dev2.dist-info → intentkit-0.8.17.dist-info}/WHEEL +0 -0
  385. {intentkit-0.6.13.dev2.dist-info → intentkit-0.8.17.dist-info}/licenses/LICENSE +0 -0
intentkit/models/llm.py CHANGED
@@ -1,28 +1,102 @@
1
+ import csv
1
2
  import json
2
3
  import logging
3
- from datetime import datetime, timezone
4
- from decimal import Decimal
4
+ from datetime import UTC, datetime
5
+ from decimal import ROUND_HALF_UP, Decimal
5
6
  from enum import Enum
6
- from typing import Annotated, Any, Optional
7
+ from pathlib import Path
8
+ from typing import Annotated, Any
7
9
 
10
+ from intentkit.config.config import config
8
11
  from intentkit.models.app_setting import AppSetting
9
12
  from intentkit.models.base import Base
10
13
  from intentkit.models.db import get_session
11
14
  from intentkit.models.redis import get_redis
12
- from intentkit.utils.error import IntentKitLookUpError
13
- from langchain_core.language_models import LanguageModelLike
15
+ from intentkit.utils.error import IntentKitAPIError
16
+ from langchain.chat_models.base import BaseChatModel
14
17
  from pydantic import BaseModel, ConfigDict, Field
15
18
  from sqlalchemy import Boolean, Column, DateTime, Integer, Numeric, String, func, select
19
+ from sqlalchemy.ext.asyncio import AsyncSession
16
20
 
17
21
  logger = logging.getLogger(__name__)
18
22
 
19
23
  _credit_per_usdc = None
24
+ FOURPLACES = Decimal("0.0001")
25
+
26
+
27
+ def _parse_bool(value: str | None) -> bool:
28
+ if value is None:
29
+ return False
30
+ return value.strip().lower() in {"true", "1", "yes"}
31
+
32
+
33
+ def _parse_optional_int(value: str | None) -> int | None:
34
+ if value is None:
35
+ return None
36
+ value = value.strip()
37
+ return int(value) if value else None
38
+
39
+
40
+ def _load_default_llm_models() -> dict[str, "LLMModelInfo"]:
41
+ """Load default LLM models from a CSV file."""
42
+
43
+ path = Path(__file__).with_name("llm.csv")
44
+ if not path.exists():
45
+ logger.warning("Default LLM CSV not found at %s", path)
46
+ return {}
47
+
48
+ defaults: dict[str, LLMModelInfo] = {}
49
+ with path.open(newline="", encoding="utf-8") as csvfile:
50
+ reader = csv.DictReader(csvfile)
51
+ for row in reader:
52
+ try:
53
+ timestamp = datetime.now(UTC)
54
+ model = LLMModelInfo(
55
+ id=row["id"],
56
+ name=row["name"],
57
+ provider=LLMProvider(row["provider"]),
58
+ enabled=_parse_bool(row.get("enabled")),
59
+ input_price=Decimal(row["input_price"]),
60
+ output_price=Decimal(row["output_price"]),
61
+ price_level=_parse_optional_int(row.get("price_level")),
62
+ context_length=int(row["context_length"]),
63
+ output_length=int(row["output_length"]),
64
+ intelligence=int(row["intelligence"]),
65
+ speed=int(row["speed"]),
66
+ supports_image_input=_parse_bool(row.get("supports_image_input")),
67
+ supports_skill_calls=_parse_bool(row.get("supports_skill_calls")),
68
+ supports_structured_output=_parse_bool(
69
+ row.get("supports_structured_output")
70
+ ),
71
+ has_reasoning=_parse_bool(row.get("has_reasoning")),
72
+ supports_search=_parse_bool(row.get("supports_search")),
73
+ supports_temperature=_parse_bool(row.get("supports_temperature")),
74
+ supports_frequency_penalty=_parse_bool(
75
+ row.get("supports_frequency_penalty")
76
+ ),
77
+ supports_presence_penalty=_parse_bool(
78
+ row.get("supports_presence_penalty")
79
+ ),
80
+ api_base=row.get("api_base", "").strip() or None,
81
+ timeout=int(row.get("timeout", "") or 180),
82
+ created_at=timestamp,
83
+ updated_at=timestamp,
84
+ )
85
+ except Exception as exc:
86
+ logger.error(
87
+ "Failed to load default LLM model %s: %s", row.get("id"), exc
88
+ )
89
+ continue
90
+ defaults[model.id] = model
91
+
92
+ return defaults
20
93
 
21
94
 
22
95
  class LLMProvider(str, Enum):
23
96
  OPENAI = "openai"
24
97
  DEEPSEEK = "deepseek"
25
98
  XAI = "xai"
99
+ GATEWAYZ = "gatewayz"
26
100
  ETERNAL = "eternal"
27
101
  REIGENT = "reigent"
28
102
  VENICE = "venice"
@@ -33,9 +107,10 @@ class LLMProvider(str, Enum):
33
107
  self.OPENAI: "OpenAI",
34
108
  self.DEEPSEEK: "DeepSeek",
35
109
  self.XAI: "xAI",
36
- self.ETERNAL: "Others",
37
- self.REIGENT: "Others",
38
- self.VENICE: "Others",
110
+ self.GATEWAYZ: "Gatewayz",
111
+ self.ETERNAL: "Eternal",
112
+ self.REIGENT: "Reigent",
113
+ self.VENICE: "Venice",
39
114
  }
40
115
  return display_names.get(self, self.value)
41
116
 
@@ -79,7 +154,7 @@ class LLMModelInfoTable(Base):
79
154
  DateTime(timezone=True),
80
155
  nullable=False,
81
156
  server_default=func.now(),
82
- onupdate=lambda: datetime.now(timezone.utc),
157
+ onupdate=lambda: datetime.now(UTC),
83
158
  )
84
159
 
85
160
 
@@ -98,7 +173,7 @@ class LLMModelInfo(BaseModel):
98
173
  enabled: bool = Field(default=True)
99
174
  input_price: Decimal # Price per 1M input tokens in USD
100
175
  output_price: Decimal # Price per 1M output tokens in USD
101
- price_level: Optional[int] = Field(
176
+ price_level: int | None = Field(
102
177
  default=None, ge=1, le=5
103
178
  ) # Price level rating from 1-5
104
179
  context_length: int # Maximum context length in tokens
@@ -123,22 +198,20 @@ class LLMModelInfo(BaseModel):
123
198
  supports_presence_penalty: bool = (
124
199
  True # Whether the model supports presence_penalty parameter
125
200
  )
126
- api_base: Optional[str] = (
127
- None # Custom API base URL if not using provider's default
128
- )
201
+ api_base: str | None = None # Custom API base URL if not using provider's default
129
202
  timeout: int = 180 # Default timeout in seconds
130
203
  created_at: Annotated[
131
204
  datetime,
132
205
  Field(
133
206
  description="Timestamp when this data was created",
134
- default=datetime.now(timezone.utc),
207
+ default=datetime.now(UTC),
135
208
  ),
136
209
  ]
137
210
  updated_at: Annotated[
138
211
  datetime,
139
212
  Field(
140
213
  description="Timestamp when this data was updated",
141
- default=datetime.now(timezone.utc),
214
+ default=datetime.now(UTC),
142
215
  ),
143
216
  ]
144
217
 
@@ -207,7 +280,31 @@ class LLMModelInfo(BaseModel):
207
280
  return model_info
208
281
 
209
282
  # Not found anywhere
210
- raise IntentKitLookUpError(f"Model {model_id} not found")
283
+ raise IntentKitAPIError(
284
+ 400,
285
+ "ModelNotFound",
286
+ f"Model {model_id} not found, maybe deprecated, please change it in the agent configuration.",
287
+ )
288
+
289
+ @classmethod
290
+ async def get_all(cls, session: AsyncSession | None = None) -> list["LLMModelInfo"]:
291
+ """Return all models merged from defaults and database overrides."""
292
+
293
+ if session is None:
294
+ async with get_session() as db:
295
+ return await cls.get_all(session=db)
296
+
297
+ models: dict[str, LLMModelInfo] = {
298
+ model_id: model.model_copy(deep=True)
299
+ for model_id, model in AVAILABLE_MODELS.items()
300
+ }
301
+
302
+ result = await session.execute(select(LLMModelInfoTable))
303
+ for row in result.scalars():
304
+ model_info = cls.model_validate(row)
305
+ models[model_info.id] = model_info
306
+
307
+ return list(models.values())
211
308
 
212
309
  async def calculate_cost(self, input_tokens: int, output_tokens: int) -> Decimal:
213
310
  global _credit_per_usdc
@@ -219,335 +316,18 @@ class LLMModelInfo(BaseModel):
219
316
  * Decimal(input_tokens)
220
317
  * self.input_price
221
318
  / Decimal(1000000)
222
- )
319
+ ).quantize(FOURPLACES, rounding=ROUND_HALF_UP)
223
320
  output_cost = (
224
321
  _credit_per_usdc
225
322
  * Decimal(output_tokens)
226
323
  * self.output_price
227
324
  / Decimal(1000000)
228
- )
229
- return input_cost + output_cost
230
-
231
-
232
- # Define all available models
233
- AVAILABLE_MODELS = {
234
- # OpenAI models
235
- "gpt-4o": LLMModelInfo(
236
- id="gpt-4o",
237
- name="GPT-4o",
238
- provider=LLMProvider.OPENAI,
239
- input_price=Decimal("2.50"), # per 1M input tokens
240
- output_price=Decimal("10.00"), # per 1M output tokens
241
- context_length=128000,
242
- output_length=4096,
243
- intelligence=4,
244
- speed=3,
245
- supports_image_input=True,
246
- supports_skill_calls=True,
247
- supports_structured_output=True,
248
- supports_search=True,
249
- supports_frequency_penalty=False,
250
- supports_presence_penalty=False,
251
- ),
252
- "gpt-4o-mini": LLMModelInfo(
253
- id="gpt-4o-mini",
254
- name="GPT-4o Mini",
255
- provider=LLMProvider.OPENAI,
256
- input_price=Decimal("0.15"), # per 1M input tokens
257
- output_price=Decimal("0.60"), # per 1M output tokens
258
- context_length=128000,
259
- output_length=4096,
260
- intelligence=3,
261
- speed=4,
262
- supports_image_input=False,
263
- supports_skill_calls=True,
264
- supports_structured_output=True,
265
- supports_search=True,
266
- supports_frequency_penalty=False,
267
- supports_presence_penalty=False,
268
- ),
269
- "gpt-5-nano": LLMModelInfo(
270
- id="gpt-5-nano",
271
- name="GPT-5 Nano",
272
- provider=LLMProvider.OPENAI,
273
- input_price=Decimal("0.05"), # per 1M input tokens
274
- output_price=Decimal("0.4"), # per 1M output tokens
275
- context_length=400000,
276
- output_length=128000,
277
- intelligence=3,
278
- speed=5,
279
- supports_image_input=True,
280
- supports_skill_calls=True,
281
- supports_structured_output=True,
282
- supports_temperature=False,
283
- supports_frequency_penalty=False,
284
- supports_presence_penalty=False,
285
- ),
286
- "gpt-5-mini": LLMModelInfo(
287
- id="gpt-5-mini",
288
- name="GPT-5 Mini",
289
- provider=LLMProvider.OPENAI,
290
- input_price=Decimal("0.25"), # per 1M input tokens
291
- output_price=Decimal("2"), # per 1M output tokens
292
- context_length=400000,
293
- output_length=128000,
294
- intelligence=4,
295
- speed=4,
296
- supports_image_input=True,
297
- supports_skill_calls=True,
298
- supports_structured_output=True,
299
- supports_search=True,
300
- supports_temperature=False,
301
- supports_frequency_penalty=False,
302
- supports_presence_penalty=False,
303
- ),
304
- "gpt-5": LLMModelInfo(
305
- id="gpt-5",
306
- name="GPT-5",
307
- provider=LLMProvider.OPENAI,
308
- input_price=Decimal("1.25"), # per 1M input tokens
309
- output_price=Decimal("10.00"), # per 1M output tokens
310
- context_length=400000,
311
- output_length=128000,
312
- intelligence=5,
313
- speed=3,
314
- supports_image_input=True,
315
- supports_skill_calls=True,
316
- supports_structured_output=True,
317
- supports_search=True,
318
- supports_temperature=False,
319
- supports_frequency_penalty=False,
320
- supports_presence_penalty=False,
321
- ),
322
- "gpt-4.1-nano": LLMModelInfo(
323
- id="gpt-4.1-nano",
324
- name="GPT-4.1 Nano",
325
- provider=LLMProvider.OPENAI,
326
- input_price=Decimal("0.1"), # per 1M input tokens
327
- output_price=Decimal("0.4"), # per 1M output tokens
328
- context_length=128000,
329
- output_length=4096,
330
- intelligence=3,
331
- speed=5,
332
- supports_image_input=False,
333
- supports_skill_calls=True,
334
- supports_structured_output=True,
335
- supports_frequency_penalty=False,
336
- supports_presence_penalty=False,
337
- ),
338
- "gpt-4.1-mini": LLMModelInfo(
339
- id="gpt-4.1-mini",
340
- name="GPT-4.1 Mini",
341
- provider=LLMProvider.OPENAI,
342
- input_price=Decimal("0.4"), # per 1M input tokens
343
- output_price=Decimal("1.6"), # per 1M output tokens
344
- context_length=128000,
345
- output_length=4096,
346
- intelligence=4,
347
- speed=4,
348
- supports_image_input=False,
349
- supports_skill_calls=True,
350
- supports_structured_output=True,
351
- supports_search=True,
352
- supports_frequency_penalty=False,
353
- supports_presence_penalty=False,
354
- ),
355
- "gpt-4.1": LLMModelInfo(
356
- id="gpt-4.1",
357
- name="GPT-4.1",
358
- provider=LLMProvider.OPENAI,
359
- input_price=Decimal("2.00"), # per 1M input tokens
360
- output_price=Decimal("8.00"), # per 1M output tokens
361
- context_length=128000,
362
- output_length=4096,
363
- intelligence=5,
364
- speed=3,
365
- supports_image_input=True,
366
- supports_skill_calls=True,
367
- supports_structured_output=True,
368
- supports_search=True,
369
- supports_frequency_penalty=False,
370
- supports_presence_penalty=False,
371
- ),
372
- "o4-mini": LLMModelInfo(
373
- id="o4-mini",
374
- name="OpenAI o4-mini",
375
- provider=LLMProvider.OPENAI,
376
- input_price=Decimal("1.10"), # per 1M input tokens
377
- output_price=Decimal("4.40"), # per 1M output tokens
378
- context_length=128000,
379
- output_length=4096,
380
- intelligence=4,
381
- speed=3,
382
- supports_image_input=False,
383
- supports_skill_calls=True,
384
- supports_structured_output=True,
385
- has_reasoning=True, # Has strong reasoning capabilities
386
- supports_temperature=False,
387
- supports_frequency_penalty=False,
388
- supports_presence_penalty=False,
389
- ),
390
- # Deepseek models
391
- "deepseek-chat": LLMModelInfo(
392
- id="deepseek-chat",
393
- name="Deepseek V3 (0324)",
394
- provider=LLMProvider.DEEPSEEK,
395
- input_price=Decimal("0.27"),
396
- output_price=Decimal("1.10"),
397
- context_length=60000,
398
- output_length=4096,
399
- intelligence=4,
400
- speed=3,
401
- supports_image_input=False,
402
- supports_skill_calls=True,
403
- supports_structured_output=True,
404
- api_base="https://api.deepseek.com",
405
- timeout=300,
406
- ),
407
- "deepseek-reasoner": LLMModelInfo(
408
- id="deepseek-reasoner",
409
- name="Deepseek R1",
410
- provider=LLMProvider.DEEPSEEK,
411
- input_price=Decimal("0.55"),
412
- output_price=Decimal("2.19"),
413
- context_length=60000,
414
- output_length=4096,
415
- intelligence=4,
416
- speed=2,
417
- supports_image_input=False,
418
- supports_skill_calls=True,
419
- supports_structured_output=True,
420
- has_reasoning=True, # Has strong reasoning capabilities
421
- api_base="https://api.deepseek.com",
422
- timeout=300,
423
- ),
424
- # XAI models
425
- "grok-2": LLMModelInfo(
426
- id="grok-2",
427
- name="Grok 2",
428
- provider=LLMProvider.XAI,
429
- input_price=Decimal("2"),
430
- output_price=Decimal("10"),
431
- context_length=120000,
432
- output_length=4096,
433
- intelligence=3,
434
- speed=3,
435
- supports_image_input=False,
436
- supports_skill_calls=True,
437
- supports_structured_output=True,
438
- timeout=180,
439
- ),
440
- "grok-3": LLMModelInfo(
441
- id="grok-3",
442
- name="Grok 3",
443
- provider=LLMProvider.XAI,
444
- input_price=Decimal("3"),
445
- output_price=Decimal("15"),
446
- context_length=131072,
447
- output_length=4096,
448
- intelligence=5,
449
- speed=3,
450
- supports_image_input=False,
451
- supports_skill_calls=True,
452
- supports_structured_output=True,
453
- supports_search=True,
454
- timeout=180,
455
- ),
456
- "grok-3-mini": LLMModelInfo(
457
- id="grok-3-mini",
458
- name="Grok 3 Mini",
459
- provider=LLMProvider.XAI,
460
- input_price=Decimal("0.3"),
461
- output_price=Decimal("0.5"),
462
- context_length=131072,
463
- output_length=4096,
464
- intelligence=5,
465
- speed=3,
466
- supports_image_input=False,
467
- supports_skill_calls=True,
468
- supports_structured_output=True,
469
- has_reasoning=True, # Has strong reasoning capabilities
470
- supports_frequency_penalty=False,
471
- supports_presence_penalty=False, # Grok-3-mini doesn't support presence_penalty
472
- timeout=180,
473
- ),
474
- # Eternal AI models
475
- "eternalai": LLMModelInfo(
476
- id="eternalai",
477
- name="Eternal AI (Llama-3.3-70B)",
478
- provider=LLMProvider.ETERNAL,
479
- input_price=Decimal("0.25"),
480
- output_price=Decimal("0.75"),
481
- context_length=60000,
482
- output_length=4096,
483
- intelligence=4,
484
- speed=3,
485
- supports_image_input=False,
486
- supports_skill_calls=True,
487
- supports_structured_output=True,
488
- api_base="https://api.eternalai.org/v1",
489
- timeout=300,
490
- ),
491
- # Reigent models
492
- "reigent": LLMModelInfo(
493
- id="reigent",
494
- name="REI Network",
495
- provider=LLMProvider.REIGENT,
496
- input_price=Decimal("0.50"), # Placeholder price, update with actual pricing
497
- output_price=Decimal("1.50"), # Placeholder price, update with actual pricing
498
- context_length=32000,
499
- output_length=4096,
500
- intelligence=4,
501
- speed=3,
502
- supports_image_input=False,
503
- supports_skill_calls=True,
504
- supports_structured_output=True,
505
- supports_temperature=False,
506
- supports_frequency_penalty=False,
507
- supports_presence_penalty=False,
508
- api_base="https://api.reisearch.box/v1",
509
- timeout=300,
510
- ),
511
- # Venice models
512
- "venice-uncensored": LLMModelInfo(
513
- id="venice-uncensored",
514
- name="Venice Uncensored",
515
- provider=LLMProvider.VENICE,
516
- input_price=Decimal("0.50"), # Placeholder price, update with actual pricing
517
- output_price=Decimal("2.00"), # Placeholder price, update with actual pricing
518
- context_length=32000,
519
- output_length=4096,
520
- intelligence=3,
521
- speed=3,
522
- supports_image_input=False,
523
- supports_skill_calls=True,
524
- supports_structured_output=True,
525
- supports_temperature=True,
526
- supports_frequency_penalty=False,
527
- supports_presence_penalty=False,
528
- api_base="https://api.venice.ai/api/v1",
529
- timeout=300,
530
- ),
531
- "venice-llama-4-maverick-17b": LLMModelInfo(
532
- id="venice-llama-4-maverick-17b",
533
- name="Venice Llama-4 Maverick 17B",
534
- provider=LLMProvider.VENICE,
535
- input_price=Decimal("1.50"),
536
- output_price=Decimal("6.00"),
537
- context_length=32000,
538
- output_length=4096,
539
- intelligence=3,
540
- speed=3,
541
- supports_image_input=False,
542
- supports_skill_calls=True,
543
- supports_structured_output=True,
544
- supports_temperature=True,
545
- supports_frequency_penalty=False,
546
- supports_presence_penalty=False,
547
- api_base="https://api.venice.ai/api/v1",
548
- timeout=300,
549
- ),
550
- }
325
+ ).quantize(FOURPLACES, rounding=ROUND_HALF_UP)
326
+ return (input_cost + output_cost).quantize(FOURPLACES, rounding=ROUND_HALF_UP)
327
+
328
+
329
+ # Default models loaded from CSV
330
+ AVAILABLE_MODELS = _load_default_llm_models()
551
331
 
552
332
 
553
333
  class LLMModel(BaseModel):
@@ -562,14 +342,14 @@ class LLMModel(BaseModel):
562
342
  async def model_info(self) -> LLMModelInfo:
563
343
  """Get the model information with caching.
564
344
 
565
- First tries to get from cache, then database, then AVAILABLE_MODELS.
345
+ First tries to get from cache, then database, then default models loaded from CSV.
566
346
  Raises ValueError if model is not found anywhere.
567
347
  """
568
348
  model_info = await LLMModelInfo.get(self.model_name)
569
349
  return model_info
570
350
 
571
351
  # This will be implemented by subclasses to return the appropriate LLM instance
572
- async def create_instance(self, config: Any) -> LanguageModelLike:
352
+ async def create_instance(self, params: dict[str, Any] = {}) -> BaseChatModel:
573
353
  """Create and return the LLM instance based on the configuration."""
574
354
  raise NotImplementedError("Subclasses must implement create_instance")
575
355
 
@@ -587,7 +367,7 @@ class LLMModel(BaseModel):
587
367
  class OpenAILLM(LLMModel):
588
368
  """OpenAI LLM configuration."""
589
369
 
590
- async def create_instance(self, config: Any) -> LanguageModelLike:
370
+ async def create_instance(self, params: dict[str, Any] = {}) -> BaseChatModel:
591
371
  """Create and return a ChatOpenAI instance."""
592
372
  from langchain_openai import ChatOpenAI
593
373
 
@@ -612,6 +392,14 @@ class OpenAILLM(LLMModel):
612
392
  if info.api_base:
613
393
  kwargs["openai_api_base"] = info.api_base
614
394
 
395
+ if self.model_name.startswith("gpt-5-"):
396
+ kwargs["reasoning_effort"] = "minimal"
397
+ elif self.model_name == "gpt-5":
398
+ kwargs["reasoning_effort"] = "low"
399
+
400
+ # Update kwargs with params to allow overriding
401
+ kwargs.update(params)
402
+
615
403
  logger.debug(f"Creating ChatOpenAI instance with kwargs: {kwargs}")
616
404
 
617
405
  return ChatOpenAI(**kwargs)
@@ -620,7 +408,7 @@ class OpenAILLM(LLMModel):
620
408
  class DeepseekLLM(LLMModel):
621
409
  """Deepseek LLM configuration."""
622
410
 
623
- async def create_instance(self, config: Any) -> LanguageModelLike:
411
+ async def create_instance(self, params: dict[str, Any] = {}) -> BaseChatModel:
624
412
  """Create and return a ChatDeepseek instance."""
625
413
 
626
414
  from langchain_deepseek import ChatDeepSeek
@@ -647,13 +435,16 @@ class DeepseekLLM(LLMModel):
647
435
  if info.api_base:
648
436
  kwargs["api_base"] = info.api_base
649
437
 
438
+ # Update kwargs with params to allow overriding
439
+ kwargs.update(params)
440
+
650
441
  return ChatDeepSeek(**kwargs)
651
442
 
652
443
 
653
444
  class XAILLM(LLMModel):
654
445
  """XAI (Grok) LLM configuration."""
655
446
 
656
- async def create_instance(self, config: Any) -> LanguageModelLike:
447
+ async def create_instance(self, params: dict[str, Any] = {}) -> BaseChatModel:
657
448
  """Create and return a ChatXAI instance."""
658
449
 
659
450
  from langchain_xai import ChatXAI
@@ -676,16 +467,49 @@ class XAILLM(LLMModel):
676
467
  if info.supports_presence_penalty:
677
468
  kwargs["presence_penalty"] = self.presence_penalty
678
469
 
679
- if self.model_name in ["grok-3", "grok-3-mini"]:
680
- kwargs["search_parameters"] = {"mode": "auto"}
470
+ # Update kwargs with params to allow overriding
471
+ kwargs.update(params)
681
472
 
682
473
  return ChatXAI(**kwargs)
683
474
 
684
475
 
476
+ class GatewayzLLM(LLMModel):
477
+ """Gatewayz AI LLM configuration."""
478
+
479
+ async def create_instance(self, params: dict[str, Any] = {}) -> BaseChatModel:
480
+ """Create and return a ChatOpenAI instance configured for Eternal AI."""
481
+ from langchain_openai import ChatOpenAI
482
+
483
+ info = await self.model_info()
484
+
485
+ kwargs = {
486
+ "model": self.model_name,
487
+ "api_key": config.gatewayz_api_key,
488
+ "base_url": info.api_base,
489
+ "timeout": info.timeout,
490
+ "max_completion_tokens": 999,
491
+ }
492
+
493
+ # Add optional parameters based on model support
494
+ if info.supports_temperature:
495
+ kwargs["temperature"] = self.temperature
496
+
497
+ if info.supports_frequency_penalty:
498
+ kwargs["frequency_penalty"] = self.frequency_penalty
499
+
500
+ if info.supports_presence_penalty:
501
+ kwargs["presence_penalty"] = self.presence_penalty
502
+
503
+ # Update kwargs with params to allow overriding
504
+ kwargs.update(params)
505
+
506
+ return ChatOpenAI(**kwargs)
507
+
508
+
685
509
  class EternalLLM(LLMModel):
686
510
  """Eternal AI LLM configuration."""
687
511
 
688
- async def create_instance(self, config: Any) -> LanguageModelLike:
512
+ async def create_instance(self, params: dict[str, Any] = {}) -> BaseChatModel:
689
513
  """Create and return a ChatOpenAI instance configured for Eternal AI."""
690
514
  from langchain_openai import ChatOpenAI
691
515
 
@@ -711,13 +535,16 @@ class EternalLLM(LLMModel):
711
535
  if info.supports_presence_penalty:
712
536
  kwargs["presence_penalty"] = self.presence_penalty
713
537
 
538
+ # Update kwargs with params to allow overriding
539
+ kwargs.update(params)
540
+
714
541
  return ChatOpenAI(**kwargs)
715
542
 
716
543
 
717
544
  class ReigentLLM(LLMModel):
718
545
  """Reigent LLM configuration."""
719
546
 
720
- async def create_instance(self, config: Any) -> LanguageModelLike:
547
+ async def create_instance(self, params: dict[str, Any] = {}) -> BaseChatModel:
721
548
  """Create and return a ChatOpenAI instance configured for Reigent."""
722
549
  from langchain_openai import ChatOpenAI
723
550
 
@@ -733,13 +560,16 @@ class ReigentLLM(LLMModel):
733
560
  },
734
561
  }
735
562
 
563
+ # Update kwargs with params to allow overriding
564
+ kwargs.update(params)
565
+
736
566
  return ChatOpenAI(**kwargs)
737
567
 
738
568
 
739
569
  class VeniceLLM(LLMModel):
740
570
  """Venice LLM configuration."""
741
571
 
742
- async def create_instance(self, config: Any) -> LanguageModelLike:
572
+ async def create_instance(self, params: dict[str, Any] = {}) -> BaseChatModel:
743
573
  """Create and return a ChatOpenAI instance configured for Venice."""
744
574
  from langchain_openai import ChatOpenAI
745
575
 
@@ -751,6 +581,9 @@ class VeniceLLM(LLMModel):
751
581
  "timeout": info.timeout,
752
582
  }
753
583
 
584
+ # Update kwargs with params to allow overriding
585
+ kwargs.update(params)
586
+
754
587
  return ChatOpenAI(**kwargs)
755
588
 
756
589
 
@@ -795,6 +628,8 @@ async def create_llm_model(
795
628
  return ReigentLLM(**base_params)
796
629
  elif provider == LLMProvider.VENICE:
797
630
  return VeniceLLM(**base_params)
631
+ elif provider == LLMProvider.GATEWAYZ:
632
+ return GatewayzLLM(**base_params)
798
633
  else:
799
634
  # Default to OpenAI
800
635
  return OpenAILLM(**base_params)