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.
- intentkit/__init__.py +1 -1
- intentkit/abstracts/agent.py +4 -5
- intentkit/abstracts/engine.py +5 -5
- intentkit/abstracts/graph.py +14 -7
- intentkit/abstracts/skill.py +6 -144
- intentkit/abstracts/twitter.py +4 -5
- intentkit/clients/__init__.py +5 -2
- intentkit/clients/cdp.py +101 -141
- intentkit/clients/twitter.py +83 -62
- intentkit/clients/web3.py +29 -0
- intentkit/config/config.py +8 -5
- intentkit/core/agent.py +472 -195
- intentkit/core/asset.py +253 -0
- intentkit/core/chat.py +51 -0
- intentkit/core/client.py +1 -1
- intentkit/core/credit.py +460 -130
- intentkit/core/engine.py +262 -233
- intentkit/core/node.py +15 -16
- intentkit/core/prompt.py +62 -28
- intentkit/core/scheduler.py +92 -0
- intentkit/core/statistics.py +168 -0
- intentkit/models/agent.py +1096 -949
- intentkit/models/agent_data.py +68 -38
- intentkit/models/agent_public.json +98 -0
- intentkit/models/agent_schema.json +54 -439
- intentkit/models/app_setting.py +96 -33
- intentkit/models/chat.py +74 -27
- intentkit/models/conversation.py +8 -8
- intentkit/models/credit.py +362 -74
- intentkit/models/db.py +26 -8
- intentkit/models/db_mig.py +2 -2
- intentkit/models/llm.csv +28 -0
- intentkit/models/llm.py +185 -350
- intentkit/models/redis.py +6 -4
- intentkit/models/skill.py +186 -72
- intentkit/models/skills.csv +174 -0
- intentkit/models/user.py +82 -24
- 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 +248 -85
- 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 +5 -5
- intentkit/skills/casino/README.md +254 -0
- intentkit/skills/casino/__init__.py +86 -0
- intentkit/skills/casino/base.py +17 -0
- intentkit/skills/casino/casino.png +0 -0
- intentkit/skills/casino/deck_draw.py +127 -0
- intentkit/skills/casino/deck_shuffle.py +118 -0
- intentkit/skills/casino/dice_roll.py +100 -0
- intentkit/skills/casino/schema.json +77 -0
- intentkit/skills/casino/utils.py +107 -0
- 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 +11 -25
- 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 +11 -21
- 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/README.md +154 -0
- intentkit/skills/dexscreener/__init__.py +97 -93
- intentkit/skills/dexscreener/base.py +125 -133
- intentkit/skills/dexscreener/get_pair_info.py +158 -0
- intentkit/skills/dexscreener/get_token_pairs.py +165 -0
- intentkit/skills/dexscreener/get_tokens_info.py +212 -0
- intentkit/skills/dexscreener/model/search_token_response.py +80 -82
- intentkit/skills/dexscreener/schema.json +91 -48
- intentkit/skills/dexscreener/search_token.py +182 -321
- intentkit/skills/dexscreener/utils.py +420 -0
- 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 +50 -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/README.md +11 -5
- intentkit/skills/firecrawl/__init__.py +5 -18
- intentkit/skills/firecrawl/base.py +4 -11
- 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 +6 -8
- intentkit/skills/firecrawl/scrape.py +150 -40
- 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 +12 -13
- intentkit/skills/heurist/image_generation_arthemy_comics.py +12 -13
- intentkit/skills/heurist/image_generation_arthemy_real.py +12 -13
- intentkit/skills/heurist/image_generation_braindance.py +12 -13
- intentkit/skills/heurist/image_generation_cyber_realistic_xl.py +12 -13
- intentkit/skills/heurist/image_generation_flux_1_dev.py +12 -13
- intentkit/skills/heurist/image_generation_sdxl.py +12 -13
- 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 +1 -7
- intentkit/skills/lifi/schema.json +17 -8
- intentkit/skills/lifi/token_execute.py +36 -30
- 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 +23 -0
- intentkit/skills/openai/__init__.py +17 -18
- intentkit/skills/openai/base.py +10 -14
- intentkit/skills/openai/dalle_image_generation.py +3 -8
- intentkit/skills/openai/gpt_avatar_generator.py +102 -0
- intentkit/skills/openai/gpt_image_generation.py +4 -8
- intentkit/skills/openai/gpt_image_mini_generator.py +91 -0
- intentkit/skills/openai/gpt_image_to_image.py +4 -8
- 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 +40 -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 +9 -13
- intentkit/skills/supabase/delete_data.py +5 -6
- intentkit/skills/supabase/fetch_data.py +13 -14
- intentkit/skills/supabase/insert_data.py +5 -6
- intentkit/skills/supabase/invoke_function.py +7 -8
- intentkit/skills/supabase/schema.json +2 -3
- intentkit/skills/supabase/update_data.py +7 -8
- intentkit/skills/supabase/upsert_data.py +5 -6
- 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 +23 -35
- intentkit/skills/twitter/follow_user.py +3 -7
- intentkit/skills/twitter/get_mentions.py +6 -13
- intentkit/skills/twitter/get_timeline.py +5 -13
- intentkit/skills/twitter/get_user_by_username.py +3 -7
- intentkit/skills/twitter/get_user_tweets.py +6 -14
- intentkit/skills/twitter/like_tweet.py +3 -7
- intentkit/skills/twitter/post_tweet.py +23 -12
- intentkit/skills/twitter/reply_tweet.py +21 -12
- intentkit/skills/twitter/retweet.py +3 -7
- intentkit/skills/twitter/schema.json +1 -0
- intentkit/skills/twitter/search_tweets.py +5 -13
- 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 +9 -9
- 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 +61 -0
- intentkit/skills/x402/ask_agent.py +98 -0
- intentkit/skills/x402/base.py +99 -0
- intentkit/skills/x402/http_request.py +117 -0
- intentkit/skills/x402/schema.json +45 -0
- intentkit/skills/x402/x402.webp +0 -0
- intentkit/skills/xmtp/__init__.py +4 -15
- intentkit/skills/xmtp/base.py +61 -2
- intentkit/skills/xmtp/price.py +18 -13
- intentkit/skills/xmtp/schema.json +69 -71
- intentkit/skills/xmtp/swap.py +22 -25
- intentkit/skills/xmtp/transfer.py +71 -32
- intentkit/utils/chain.py +3 -3
- intentkit/utils/error.py +14 -1
- intentkit/utils/logging.py +2 -4
- intentkit/utils/s3.py +59 -7
- intentkit/utils/schema.py +100 -0
- intentkit/utils/slack_alert.py +7 -8
- {intentkit-0.6.13.dev2.dist-info → intentkit-0.8.17.dist-info}/METADATA +14 -16
- intentkit-0.8.17.dist-info/RECORD +466 -0
- intentkit/abstracts/exception.py +0 -9
- intentkit/core/skill.py +0 -200
- 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.6.13.dev2.dist-info/RECORD +0 -409
- {intentkit-0.6.13.dev2.dist-info → intentkit-0.8.17.dist-info}/WHEEL +0 -0
- {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
|
|
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
|
|
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
|
|
13
|
-
from
|
|
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.
|
|
37
|
-
self.
|
|
38
|
-
self.
|
|
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(
|
|
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:
|
|
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:
|
|
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(
|
|
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(
|
|
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
|
|
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
|
-
#
|
|
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
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
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
|
-
|
|
680
|
-
|
|
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,
|
|
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,
|
|
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,
|
|
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)
|