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.
- intentkit/MANIFEST.in +14 -0
- intentkit/README.md +88 -0
- intentkit/__init__.py +6 -4
- intentkit/abstracts/agent.py +4 -5
- intentkit/abstracts/engine.py +5 -5
- intentkit/abstracts/graph.py +15 -8
- intentkit/abstracts/skill.py +6 -144
- intentkit/abstracts/twitter.py +4 -5
- intentkit/clients/__init__.py +9 -2
- intentkit/clients/cdp.py +129 -153
- intentkit/{utils → clients}/s3.py +109 -34
- intentkit/clients/twitter.py +83 -62
- intentkit/clients/web3.py +4 -7
- intentkit/config/config.py +123 -90
- intentkit/core/account_checking.py +802 -0
- intentkit/core/agent.py +313 -498
- intentkit/core/asset.py +267 -0
- intentkit/core/chat.py +5 -3
- intentkit/core/client.py +1 -1
- intentkit/core/credit.py +49 -41
- intentkit/core/draft.py +201 -0
- intentkit/core/draft_chat.py +118 -0
- intentkit/core/engine.py +378 -287
- intentkit/core/manager/__init__.py +25 -0
- intentkit/core/manager/engine.py +220 -0
- intentkit/core/manager/service.py +172 -0
- intentkit/core/manager/skills.py +178 -0
- intentkit/core/middleware.py +231 -0
- intentkit/core/prompt.py +74 -114
- intentkit/core/scheduler.py +143 -0
- intentkit/core/statistics.py +168 -0
- intentkit/models/agent.py +931 -518
- intentkit/models/agent_data.py +165 -106
- intentkit/models/agent_schema.json +38 -251
- intentkit/models/app_setting.py +15 -13
- intentkit/models/chat.py +86 -140
- intentkit/models/credit.py +182 -162
- intentkit/models/db.py +42 -23
- intentkit/models/db_mig.py +120 -3
- intentkit/models/draft.py +222 -0
- intentkit/models/llm.csv +31 -0
- intentkit/models/llm.py +262 -370
- intentkit/models/redis.py +6 -4
- intentkit/models/skill.py +222 -101
- intentkit/models/skills.csv +173 -0
- intentkit/models/team.py +189 -0
- intentkit/models/user.py +103 -31
- intentkit/skills/acolyt/__init__.py +2 -9
- intentkit/skills/acolyt/ask.py +3 -4
- intentkit/skills/acolyt/base.py +4 -9
- intentkit/skills/acolyt/schema.json +4 -3
- intentkit/skills/aixbt/__init__.py +2 -13
- intentkit/skills/aixbt/base.py +1 -7
- intentkit/skills/aixbt/projects.py +14 -15
- intentkit/skills/aixbt/schema.json +4 -4
- intentkit/skills/allora/__init__.py +2 -9
- intentkit/skills/allora/base.py +4 -9
- intentkit/skills/allora/price.py +3 -4
- intentkit/skills/allora/schema.json +3 -2
- intentkit/skills/base.py +241 -41
- intentkit/skills/basename/__init__.py +51 -0
- intentkit/skills/basename/base.py +11 -0
- intentkit/skills/basename/basename.svg +11 -0
- intentkit/skills/basename/schema.json +58 -0
- intentkit/skills/carv/__init__.py +115 -121
- intentkit/skills/carv/base.py +184 -185
- intentkit/skills/carv/fetch_news.py +3 -3
- intentkit/skills/carv/onchain_query.py +4 -4
- intentkit/skills/carv/schema.json +134 -137
- intentkit/skills/carv/token_info_and_price.py +6 -6
- intentkit/skills/casino/__init__.py +4 -15
- intentkit/skills/casino/base.py +1 -7
- intentkit/skills/casino/deck_draw.py +5 -8
- intentkit/skills/casino/deck_shuffle.py +6 -6
- intentkit/skills/casino/dice_roll.py +2 -4
- intentkit/skills/casino/schema.json +0 -1
- intentkit/skills/cdp/__init__.py +22 -84
- intentkit/skills/cdp/base.py +1 -7
- intentkit/skills/cdp/schema.json +11 -314
- intentkit/skills/chainlist/__init__.py +2 -7
- intentkit/skills/chainlist/base.py +1 -7
- intentkit/skills/chainlist/chain_lookup.py +18 -18
- intentkit/skills/chainlist/schema.json +3 -5
- intentkit/skills/common/__init__.py +2 -9
- intentkit/skills/common/base.py +1 -7
- intentkit/skills/common/current_time.py +1 -2
- intentkit/skills/common/schema.json +2 -2
- intentkit/skills/cookiefun/__init__.py +6 -9
- intentkit/skills/cookiefun/base.py +2 -7
- intentkit/skills/cookiefun/get_account_details.py +7 -7
- intentkit/skills/cookiefun/get_account_feed.py +19 -19
- intentkit/skills/cookiefun/get_account_smart_followers.py +7 -7
- intentkit/skills/cookiefun/get_sectors.py +3 -3
- intentkit/skills/cookiefun/schema.json +1 -3
- intentkit/skills/cookiefun/search_accounts.py +9 -9
- intentkit/skills/cryptocompare/__init__.py +7 -24
- intentkit/skills/cryptocompare/api.py +2 -3
- intentkit/skills/cryptocompare/base.py +10 -24
- intentkit/skills/cryptocompare/fetch_news.py +4 -5
- intentkit/skills/cryptocompare/fetch_price.py +6 -7
- intentkit/skills/cryptocompare/fetch_top_exchanges.py +4 -5
- intentkit/skills/cryptocompare/fetch_top_market_cap.py +4 -5
- intentkit/skills/cryptocompare/fetch_top_volume.py +4 -5
- intentkit/skills/cryptocompare/fetch_trading_signals.py +5 -6
- intentkit/skills/cryptocompare/schema.json +3 -3
- intentkit/skills/cryptopanic/__init__.py +7 -10
- intentkit/skills/cryptopanic/base.py +51 -55
- intentkit/skills/cryptopanic/fetch_crypto_news.py +4 -8
- intentkit/skills/cryptopanic/fetch_crypto_sentiment.py +5 -7
- intentkit/skills/cryptopanic/schema.json +105 -103
- intentkit/skills/dapplooker/__init__.py +2 -9
- intentkit/skills/dapplooker/base.py +4 -9
- intentkit/skills/dapplooker/dapplooker_token_data.py +7 -7
- intentkit/skills/dapplooker/schema.json +3 -5
- intentkit/skills/defillama/__init__.py +24 -74
- intentkit/skills/defillama/api.py +6 -9
- intentkit/skills/defillama/base.py +8 -19
- intentkit/skills/defillama/coins/fetch_batch_historical_prices.py +8 -10
- intentkit/skills/defillama/coins/fetch_block.py +6 -8
- intentkit/skills/defillama/coins/fetch_current_prices.py +8 -10
- intentkit/skills/defillama/coins/fetch_first_price.py +7 -9
- intentkit/skills/defillama/coins/fetch_historical_prices.py +9 -11
- intentkit/skills/defillama/coins/fetch_price_chart.py +9 -11
- intentkit/skills/defillama/coins/fetch_price_percentage.py +7 -9
- intentkit/skills/defillama/config/chains.py +1 -3
- intentkit/skills/defillama/fees/fetch_fees_overview.py +24 -26
- intentkit/skills/defillama/schema.json +5 -1
- intentkit/skills/defillama/stablecoins/fetch_stablecoin_chains.py +16 -18
- intentkit/skills/defillama/stablecoins/fetch_stablecoin_charts.py +8 -10
- intentkit/skills/defillama/stablecoins/fetch_stablecoin_prices.py +5 -7
- intentkit/skills/defillama/stablecoins/fetch_stablecoins.py +7 -9
- intentkit/skills/defillama/tests/api_integration.test.py +1 -1
- intentkit/skills/defillama/tvl/fetch_chain_historical_tvl.py +4 -6
- intentkit/skills/defillama/tvl/fetch_chains.py +9 -11
- intentkit/skills/defillama/tvl/fetch_historical_tvl.py +4 -6
- intentkit/skills/defillama/tvl/fetch_protocol.py +32 -38
- intentkit/skills/defillama/tvl/fetch_protocol_current_tvl.py +3 -5
- intentkit/skills/defillama/tvl/fetch_protocols.py +37 -45
- intentkit/skills/defillama/volumes/fetch_dex_overview.py +42 -48
- intentkit/skills/defillama/volumes/fetch_dex_summary.py +35 -37
- intentkit/skills/defillama/volumes/fetch_options_overview.py +24 -28
- intentkit/skills/defillama/yields/fetch_pool_chart.py +10 -12
- intentkit/skills/defillama/yields/fetch_pools.py +26 -30
- intentkit/skills/dexscreener/__init__.py +97 -102
- intentkit/skills/dexscreener/base.py +125 -130
- intentkit/skills/dexscreener/get_pair_info.py +4 -5
- intentkit/skills/dexscreener/get_token_pairs.py +4 -5
- intentkit/skills/dexscreener/get_tokens_info.py +7 -8
- intentkit/skills/dexscreener/model/search_token_response.py +80 -82
- intentkit/skills/dexscreener/schema.json +91 -93
- intentkit/skills/dexscreener/search_token.py +182 -184
- intentkit/skills/dexscreener/utils.py +15 -14
- intentkit/skills/dune_analytics/__init__.py +7 -9
- intentkit/skills/dune_analytics/base.py +48 -52
- intentkit/skills/dune_analytics/fetch_kol_buys.py +5 -7
- intentkit/skills/dune_analytics/fetch_nation_metrics.py +6 -8
- intentkit/skills/dune_analytics/schema.json +104 -99
- intentkit/skills/elfa/__init__.py +5 -18
- intentkit/skills/elfa/base.py +10 -14
- intentkit/skills/elfa/mention.py +19 -21
- intentkit/skills/elfa/schema.json +3 -2
- intentkit/skills/elfa/stats.py +4 -4
- intentkit/skills/elfa/tokens.py +12 -12
- intentkit/skills/elfa/utils.py +26 -28
- intentkit/skills/enso/__init__.py +11 -31
- intentkit/skills/enso/base.py +54 -35
- intentkit/skills/enso/best_yield.py +16 -24
- intentkit/skills/enso/networks.py +6 -11
- intentkit/skills/enso/prices.py +11 -13
- intentkit/skills/enso/route.py +34 -38
- intentkit/skills/enso/schema.json +3 -2
- intentkit/skills/enso/tokens.py +29 -38
- intentkit/skills/enso/wallet.py +76 -191
- intentkit/skills/erc20/__init__.py +50 -0
- intentkit/skills/erc20/base.py +11 -0
- intentkit/skills/erc20/erc20.svg +5 -0
- intentkit/skills/erc20/schema.json +74 -0
- intentkit/skills/erc721/__init__.py +53 -0
- intentkit/skills/erc721/base.py +11 -0
- intentkit/skills/erc721/erc721.svg +5 -0
- intentkit/skills/erc721/schema.json +90 -0
- intentkit/skills/firecrawl/__init__.py +5 -18
- intentkit/skills/firecrawl/base.py +4 -9
- intentkit/skills/firecrawl/clear.py +4 -8
- intentkit/skills/firecrawl/crawl.py +19 -19
- intentkit/skills/firecrawl/query.py +4 -3
- intentkit/skills/firecrawl/schema.json +2 -6
- intentkit/skills/firecrawl/scrape.py +17 -22
- intentkit/skills/firecrawl/utils.py +50 -42
- intentkit/skills/github/__init__.py +2 -7
- intentkit/skills/github/base.py +1 -7
- intentkit/skills/github/github_search.py +1 -2
- intentkit/skills/github/schema.json +3 -4
- intentkit/skills/heurist/__init__.py +8 -27
- intentkit/skills/heurist/base.py +4 -9
- intentkit/skills/heurist/image_generation_animagine_xl.py +13 -15
- intentkit/skills/heurist/image_generation_arthemy_comics.py +13 -15
- intentkit/skills/heurist/image_generation_arthemy_real.py +13 -15
- intentkit/skills/heurist/image_generation_braindance.py +13 -15
- intentkit/skills/heurist/image_generation_cyber_realistic_xl.py +13 -15
- intentkit/skills/heurist/image_generation_flux_1_dev.py +13 -15
- intentkit/skills/heurist/image_generation_sdxl.py +13 -15
- intentkit/skills/heurist/schema.json +2 -2
- intentkit/skills/http/__init__.py +4 -15
- intentkit/skills/http/base.py +1 -7
- intentkit/skills/http/get.py +21 -16
- intentkit/skills/http/post.py +23 -18
- intentkit/skills/http/put.py +23 -18
- intentkit/skills/http/schema.json +4 -5
- intentkit/skills/lifi/__init__.py +8 -13
- intentkit/skills/lifi/base.py +3 -9
- intentkit/skills/lifi/schema.json +17 -8
- intentkit/skills/lifi/token_execute.py +150 -60
- intentkit/skills/lifi/token_quote.py +8 -10
- intentkit/skills/lifi/utils.py +104 -51
- intentkit/skills/moralis/__init__.py +6 -10
- intentkit/skills/moralis/api.py +6 -7
- intentkit/skills/moralis/base.py +5 -10
- intentkit/skills/moralis/fetch_chain_portfolio.py +10 -11
- intentkit/skills/moralis/fetch_nft_portfolio.py +22 -22
- intentkit/skills/moralis/fetch_solana_portfolio.py +11 -12
- intentkit/skills/moralis/fetch_wallet_portfolio.py +8 -9
- intentkit/skills/moralis/schema.json +7 -2
- intentkit/skills/morpho/__init__.py +52 -0
- intentkit/skills/morpho/base.py +11 -0
- intentkit/skills/morpho/morpho.svg +12 -0
- intentkit/skills/morpho/schema.json +73 -0
- intentkit/skills/nation/__init__.py +4 -9
- intentkit/skills/nation/base.py +5 -10
- intentkit/skills/nation/nft_check.py +3 -4
- intentkit/skills/nation/schema.json +4 -3
- intentkit/skills/onchain.py +30 -0
- intentkit/skills/openai/__init__.py +17 -18
- intentkit/skills/openai/base.py +10 -14
- intentkit/skills/openai/dalle_image_generation.py +4 -9
- intentkit/skills/openai/gpt_avatar_generator.py +102 -0
- intentkit/skills/openai/gpt_image_generation.py +5 -9
- intentkit/skills/openai/gpt_image_mini_generator.py +92 -0
- intentkit/skills/openai/gpt_image_to_image.py +5 -9
- intentkit/skills/openai/image_to_text.py +3 -7
- intentkit/skills/openai/schema.json +34 -3
- intentkit/skills/portfolio/__init__.py +11 -35
- intentkit/skills/portfolio/base.py +33 -19
- intentkit/skills/portfolio/schema.json +3 -5
- intentkit/skills/portfolio/token_balances.py +21 -21
- intentkit/skills/portfolio/wallet_approvals.py +17 -18
- intentkit/skills/portfolio/wallet_defi_positions.py +3 -3
- intentkit/skills/portfolio/wallet_history.py +31 -31
- intentkit/skills/portfolio/wallet_net_worth.py +13 -13
- intentkit/skills/portfolio/wallet_nfts.py +19 -19
- intentkit/skills/portfolio/wallet_profitability.py +18 -18
- intentkit/skills/portfolio/wallet_profitability_summary.py +5 -5
- intentkit/skills/portfolio/wallet_stats.py +3 -3
- intentkit/skills/portfolio/wallet_swaps.py +19 -19
- intentkit/skills/pyth/__init__.py +50 -0
- intentkit/skills/pyth/base.py +11 -0
- intentkit/skills/pyth/pyth.svg +6 -0
- intentkit/skills/pyth/schema.json +75 -0
- intentkit/skills/skills.toml +36 -0
- intentkit/skills/slack/__init__.py +5 -17
- intentkit/skills/slack/base.py +3 -9
- intentkit/skills/slack/get_channel.py +8 -8
- intentkit/skills/slack/get_message.py +9 -9
- intentkit/skills/slack/schedule_message.py +5 -5
- intentkit/skills/slack/schema.json +2 -2
- intentkit/skills/slack/send_message.py +3 -5
- intentkit/skills/supabase/__init__.py +7 -23
- intentkit/skills/supabase/base.py +1 -7
- intentkit/skills/supabase/delete_data.py +4 -4
- intentkit/skills/supabase/fetch_data.py +12 -12
- intentkit/skills/supabase/insert_data.py +4 -4
- intentkit/skills/supabase/invoke_function.py +6 -6
- intentkit/skills/supabase/schema.json +2 -3
- intentkit/skills/supabase/update_data.py +6 -6
- intentkit/skills/supabase/upsert_data.py +4 -4
- intentkit/skills/superfluid/__init__.py +53 -0
- intentkit/skills/superfluid/base.py +11 -0
- intentkit/skills/superfluid/schema.json +89 -0
- intentkit/skills/superfluid/superfluid.svg +6 -0
- intentkit/skills/system/__init__.py +7 -24
- intentkit/skills/system/add_autonomous_task.py +10 -12
- intentkit/skills/system/delete_autonomous_task.py +2 -2
- intentkit/skills/system/edit_autonomous_task.py +14 -18
- intentkit/skills/system/list_autonomous_tasks.py +3 -5
- intentkit/skills/system/read_agent_api_key.py +6 -4
- intentkit/skills/system/regenerate_agent_api_key.py +6 -4
- intentkit/skills/system/schema.json +6 -8
- intentkit/skills/tavily/__init__.py +3 -12
- intentkit/skills/tavily/base.py +4 -9
- intentkit/skills/tavily/schema.json +3 -5
- intentkit/skills/tavily/tavily_extract.py +2 -4
- intentkit/skills/tavily/tavily_search.py +4 -6
- intentkit/skills/token/__init__.py +5 -10
- intentkit/skills/token/base.py +7 -11
- intentkit/skills/token/erc20_transfers.py +19 -19
- intentkit/skills/token/schema.json +3 -6
- intentkit/skills/token/token_analytics.py +3 -3
- intentkit/skills/token/token_price.py +13 -13
- intentkit/skills/token/token_search.py +9 -9
- intentkit/skills/twitter/__init__.py +11 -35
- intentkit/skills/twitter/base.py +22 -34
- intentkit/skills/twitter/follow_user.py +2 -6
- intentkit/skills/twitter/get_mentions.py +5 -12
- intentkit/skills/twitter/get_timeline.py +4 -12
- intentkit/skills/twitter/get_user_by_username.py +2 -6
- intentkit/skills/twitter/get_user_tweets.py +5 -13
- intentkit/skills/twitter/like_tweet.py +2 -6
- intentkit/skills/twitter/post_tweet.py +6 -9
- intentkit/skills/twitter/reply_tweet.py +6 -9
- intentkit/skills/twitter/retweet.py +2 -6
- intentkit/skills/twitter/schema.json +1 -0
- intentkit/skills/twitter/search_tweets.py +4 -12
- intentkit/skills/unrealspeech/__init__.py +2 -7
- intentkit/skills/unrealspeech/base.py +2 -8
- intentkit/skills/unrealspeech/schema.json +2 -5
- intentkit/skills/unrealspeech/text_to_speech.py +8 -8
- intentkit/skills/venice_audio/__init__.py +98 -106
- intentkit/skills/venice_audio/base.py +117 -121
- intentkit/skills/venice_audio/input.py +41 -41
- intentkit/skills/venice_audio/schema.json +151 -152
- intentkit/skills/venice_audio/venice_audio.py +38 -21
- intentkit/skills/venice_image/__init__.py +147 -154
- intentkit/skills/venice_image/api.py +138 -138
- intentkit/skills/venice_image/base.py +185 -192
- intentkit/skills/venice_image/config.py +33 -35
- intentkit/skills/venice_image/image_enhance/image_enhance.py +2 -3
- intentkit/skills/venice_image/image_enhance/image_enhance_base.py +21 -23
- intentkit/skills/venice_image/image_enhance/image_enhance_input.py +38 -40
- intentkit/skills/venice_image/image_generation/image_generation_base.py +11 -10
- intentkit/skills/venice_image/image_generation/image_generation_fluently_xl.py +26 -26
- intentkit/skills/venice_image/image_generation/image_generation_flux_dev.py +27 -27
- intentkit/skills/venice_image/image_generation/image_generation_flux_dev_uncensored.py +26 -26
- intentkit/skills/venice_image/image_generation/image_generation_input.py +158 -158
- intentkit/skills/venice_image/image_generation/image_generation_lustify_sdxl.py +26 -26
- intentkit/skills/venice_image/image_generation/image_generation_pony_realism.py +26 -26
- intentkit/skills/venice_image/image_generation/image_generation_stable_diffusion_3_5.py +28 -28
- intentkit/skills/venice_image/image_generation/image_generation_venice_sd35.py +28 -28
- intentkit/skills/venice_image/image_upscale/image_upscale.py +3 -3
- intentkit/skills/venice_image/image_upscale/image_upscale_base.py +21 -23
- intentkit/skills/venice_image/image_upscale/image_upscale_input.py +22 -22
- intentkit/skills/venice_image/image_vision/image_vision.py +2 -2
- intentkit/skills/venice_image/image_vision/image_vision_base.py +17 -17
- intentkit/skills/venice_image/image_vision/image_vision_input.py +9 -9
- intentkit/skills/venice_image/schema.json +267 -267
- intentkit/skills/venice_image/utils.py +77 -78
- intentkit/skills/web_scraper/__init__.py +5 -18
- intentkit/skills/web_scraper/base.py +21 -7
- intentkit/skills/web_scraper/document_indexer.py +7 -6
- intentkit/skills/web_scraper/schema.json +2 -6
- intentkit/skills/web_scraper/scrape_and_index.py +15 -15
- intentkit/skills/web_scraper/utils.py +62 -63
- intentkit/skills/web_scraper/website_indexer.py +17 -19
- intentkit/skills/weth/__init__.py +49 -0
- intentkit/skills/weth/base.py +11 -0
- intentkit/skills/weth/schema.json +58 -0
- intentkit/skills/weth/weth.svg +6 -0
- intentkit/skills/wow/__init__.py +51 -0
- intentkit/skills/wow/base.py +11 -0
- intentkit/skills/wow/schema.json +89 -0
- intentkit/skills/wow/wow.svg +7 -0
- intentkit/skills/x402/__init__.py +58 -0
- intentkit/skills/x402/base.py +99 -0
- intentkit/skills/x402/http_request.py +117 -0
- intentkit/skills/x402/schema.json +40 -0
- intentkit/skills/x402/x402.webp +0 -0
- intentkit/skills/xmtp/__init__.py +4 -15
- intentkit/skills/xmtp/base.py +5 -5
- intentkit/skills/xmtp/price.py +7 -6
- intentkit/skills/xmtp/schema.json +69 -71
- intentkit/skills/xmtp/swap.py +6 -8
- intentkit/skills/xmtp/transfer.py +4 -6
- intentkit/utils/__init__.py +4 -0
- intentkit/utils/chain.py +198 -96
- intentkit/utils/ens.py +135 -0
- intentkit/utils/error.py +5 -2
- intentkit/utils/logging.py +9 -11
- intentkit/utils/schema.py +100 -0
- intentkit/utils/slack_alert.py +8 -8
- intentkit/utils/tx.py +16 -8
- intentkit/uv.lock +3377 -0
- {intentkit-0.7.5.dev3.dist-info → intentkit-0.8.34.dev7.dist-info}/METADATA +13 -15
- intentkit-0.8.34.dev7.dist-info/RECORD +478 -0
- intentkit-0.8.34.dev7.dist-info/licenses/LICENSE +21 -0
- intentkit/core/node.py +0 -215
- intentkit/models/conversation.py +0 -286
- intentkit/models/generator.py +0 -347
- intentkit/skills/cdp/get_balance.py +0 -110
- intentkit/skills/cdp/swap.py +0 -121
- intentkit/skills/moralis/tests/__init__.py +0 -0
- intentkit/skills/moralis/tests/test_wallet.py +0 -511
- intentkit-0.7.5.dev3.dist-info/RECORD +0 -424
- {intentkit-0.7.5.dev3.dist-info/licenses → intentkit}/LICENSE +0 -0
- {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
|
|
3
|
+
from typing import Annotated
|
|
3
4
|
from urllib.parse import quote_plus
|
|
4
5
|
|
|
5
|
-
from
|
|
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
|
-
|
|
15
|
-
|
|
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:
|
|
32
|
-
username:
|
|
33
|
-
password:
|
|
34
|
-
dbname:
|
|
35
|
-
port: Annotated[
|
|
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,
|
|
55
|
-
# Initialize psycopg pool and
|
|
56
|
-
if
|
|
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
|
-
|
|
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
|
|
77
|
+
async with AsyncShallowPostgresSaver.from_conn_string(
|
|
78
|
+
conn_string
|
|
79
|
+
) as saver:
|
|
76
80
|
await saver.setup()
|
|
77
81
|
else:
|
|
78
|
-
|
|
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
|
|
139
|
-
"""Get the
|
|
146
|
+
def get_connection_pool() -> AsyncConnectionPool:
|
|
147
|
+
"""Get the AsyncConnectionPool instance.
|
|
140
148
|
|
|
141
149
|
Returns:
|
|
142
|
-
|
|
150
|
+
AsyncConnectionPool: The AsyncConnectionPool instance
|
|
143
151
|
"""
|
|
144
|
-
if
|
|
152
|
+
if _connection_pool is None:
|
|
145
153
|
raise RuntimeError("Database pool not initialized. Call init_db first.")
|
|
146
|
-
return
|
|
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
|
intentkit/models/db_mig.py
CHANGED
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
"""Database migration utilities."""
|
|
2
2
|
|
|
3
3
|
import logging
|
|
4
|
-
from
|
|
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,
|
|
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
|
+
)
|
intentkit/models/llm.csv
ADDED
|
@@ -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
|