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/core/asset.py
ADDED
|
@@ -0,0 +1,253 @@
|
|
|
1
|
+
"""Shared asset retrieval utilities for agents."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import json
|
|
6
|
+
import logging
|
|
7
|
+
from decimal import Decimal
|
|
8
|
+
|
|
9
|
+
import httpx
|
|
10
|
+
from pydantic import BaseModel, Field
|
|
11
|
+
from sqlalchemy import update
|
|
12
|
+
from web3 import Web3
|
|
13
|
+
|
|
14
|
+
from intentkit.clients.web3 import get_web3_client
|
|
15
|
+
from intentkit.config.config import config
|
|
16
|
+
from intentkit.models.agent import Agent, AgentTable
|
|
17
|
+
from intentkit.models.agent_data import AgentData
|
|
18
|
+
from intentkit.models.db import get_session
|
|
19
|
+
from intentkit.models.redis import get_redis
|
|
20
|
+
from intentkit.utils.error import IntentKitAPIError
|
|
21
|
+
|
|
22
|
+
logger = logging.getLogger(__name__)
|
|
23
|
+
|
|
24
|
+
# USDC contract addresses for different networks
|
|
25
|
+
USDC_ADDRESSES = {
|
|
26
|
+
"base-mainnet": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
|
|
27
|
+
"ethereum-mainnet": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48",
|
|
28
|
+
"arbitrum-mainnet": "0xaf88d065e77c8cC2239327C5EDb3A432268e5831",
|
|
29
|
+
"optimism-mainnet": "0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85",
|
|
30
|
+
"polygon-mainnet": "0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359",
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
# NATION token address for base-mainnet
|
|
34
|
+
NATION_ADDRESS = "0x2f74f818e81685c8086dd783837a4605a90474b8"
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
class Asset(BaseModel):
|
|
38
|
+
"""Model for individual asset with symbol and balance."""
|
|
39
|
+
|
|
40
|
+
symbol: str = Field(description="Asset symbol (e.g., ETH, USDC, NATION)")
|
|
41
|
+
balance: Decimal = Field(description="Asset balance as decimal")
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
class AgentAssets(BaseModel):
|
|
45
|
+
"""Simplified agent asset response with wallet net worth and tokens."""
|
|
46
|
+
|
|
47
|
+
net_worth: str = Field(description="Total wallet net worth in USD")
|
|
48
|
+
tokens: list[Asset] = Field(description="List of assets with symbol and balance")
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
async def _get_token_balance(
|
|
52
|
+
web3_client: Web3, wallet_address: str, token_address: str
|
|
53
|
+
) -> Decimal:
|
|
54
|
+
"""Get ERC-20 token balance for a wallet address."""
|
|
55
|
+
try:
|
|
56
|
+
# ERC-20 standard ABI for balanceOf and decimals
|
|
57
|
+
erc20_abi = [
|
|
58
|
+
{
|
|
59
|
+
"constant": True,
|
|
60
|
+
"inputs": [{"name": "_owner", "type": "address"}],
|
|
61
|
+
"name": "balanceOf",
|
|
62
|
+
"outputs": [{"name": "balance", "type": "uint256"}],
|
|
63
|
+
"type": "function",
|
|
64
|
+
},
|
|
65
|
+
{
|
|
66
|
+
"constant": True,
|
|
67
|
+
"inputs": [],
|
|
68
|
+
"name": "decimals",
|
|
69
|
+
"outputs": [{"name": "", "type": "uint8"}],
|
|
70
|
+
"type": "function",
|
|
71
|
+
},
|
|
72
|
+
]
|
|
73
|
+
|
|
74
|
+
contract = web3_client.eth.contract(
|
|
75
|
+
address=web3_client.to_checksum_address(token_address), abi=erc20_abi
|
|
76
|
+
)
|
|
77
|
+
|
|
78
|
+
balance_wei = contract.functions.balanceOf(
|
|
79
|
+
web3_client.to_checksum_address(wallet_address)
|
|
80
|
+
).call()
|
|
81
|
+
decimals = contract.functions.decimals().call()
|
|
82
|
+
|
|
83
|
+
# Convert from wei to token units using actual decimals
|
|
84
|
+
balance = Decimal(balance_wei) / Decimal(10**decimals)
|
|
85
|
+
return balance
|
|
86
|
+
except Exception as exc: # pragma: no cover - log path only
|
|
87
|
+
logger.error("Error getting token balance: %s", exc)
|
|
88
|
+
return Decimal("0")
|
|
89
|
+
|
|
90
|
+
|
|
91
|
+
async def _get_eth_balance(web3_client: Web3, wallet_address: str) -> Decimal:
|
|
92
|
+
"""Get ETH balance for a wallet address."""
|
|
93
|
+
try:
|
|
94
|
+
balance_wei = web3_client.eth.get_balance(
|
|
95
|
+
web3_client.to_checksum_address(wallet_address)
|
|
96
|
+
)
|
|
97
|
+
balance = Decimal(balance_wei) / Decimal(10**18)
|
|
98
|
+
return balance
|
|
99
|
+
except Exception as exc: # pragma: no cover - log path only
|
|
100
|
+
logger.error("Error getting ETH balance: %s", exc)
|
|
101
|
+
return Decimal("0")
|
|
102
|
+
|
|
103
|
+
|
|
104
|
+
async def _get_wallet_net_worth(wallet_address: str) -> str:
|
|
105
|
+
"""Get wallet net worth using Moralis API."""
|
|
106
|
+
try:
|
|
107
|
+
async with httpx.AsyncClient() as client:
|
|
108
|
+
url = (
|
|
109
|
+
"https://deep-index.moralis.io/api/v2.2/wallets/"
|
|
110
|
+
f"{wallet_address}/net-worth"
|
|
111
|
+
)
|
|
112
|
+
headers = {
|
|
113
|
+
"accept": "application/json",
|
|
114
|
+
"X-API-Key": config.moralis_api_key,
|
|
115
|
+
}
|
|
116
|
+
params = {
|
|
117
|
+
"exclude_spam": "true",
|
|
118
|
+
"exclude_unverified_contracts": "true",
|
|
119
|
+
"chains": ["eth", "base", "polygon", "arbitrum", "optimism"],
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
response = await client.get(url, headers=headers, params=params)
|
|
123
|
+
response.raise_for_status()
|
|
124
|
+
data = response.json()
|
|
125
|
+
return data.get("total_networth_usd", "0")
|
|
126
|
+
except Exception as exc: # pragma: no cover - log path only
|
|
127
|
+
logger.error("Error getting wallet net worth for %s: %s", wallet_address, exc)
|
|
128
|
+
return "0"
|
|
129
|
+
|
|
130
|
+
|
|
131
|
+
async def _build_assets_list(
|
|
132
|
+
agent: Agent, agent_data: AgentData, web3_client: Web3
|
|
133
|
+
) -> list[Asset]:
|
|
134
|
+
"""Build the assets list based on network conditions and agent configuration."""
|
|
135
|
+
assets: list[Asset] = []
|
|
136
|
+
|
|
137
|
+
if not agent_data or not agent_data.evm_wallet_address:
|
|
138
|
+
return assets
|
|
139
|
+
|
|
140
|
+
wallet_address = agent_data.evm_wallet_address
|
|
141
|
+
network_id: str | None = agent.network_id
|
|
142
|
+
|
|
143
|
+
# ETH is always included
|
|
144
|
+
eth_balance = await _get_eth_balance(web3_client, wallet_address)
|
|
145
|
+
assets.append(Asset(symbol="ETH", balance=eth_balance))
|
|
146
|
+
|
|
147
|
+
if network_id and network_id.endswith("-mainnet"):
|
|
148
|
+
usdc_address = USDC_ADDRESSES.get(str(network_id))
|
|
149
|
+
if usdc_address:
|
|
150
|
+
usdc_balance = await _get_token_balance(
|
|
151
|
+
web3_client, wallet_address, usdc_address
|
|
152
|
+
)
|
|
153
|
+
assets.append(Asset(symbol="USDC", balance=usdc_balance))
|
|
154
|
+
|
|
155
|
+
if network_id == "base-mainnet":
|
|
156
|
+
nation_balance = await _get_token_balance(
|
|
157
|
+
web3_client, wallet_address, NATION_ADDRESS
|
|
158
|
+
)
|
|
159
|
+
assets.append(Asset(symbol="NATION", balance=nation_balance))
|
|
160
|
+
|
|
161
|
+
if agent.ticker and agent.token_address:
|
|
162
|
+
lower_addresses = [addr.lower() for addr in USDC_ADDRESSES.values()]
|
|
163
|
+
is_usdc = agent.token_address.lower() in lower_addresses
|
|
164
|
+
is_nation = agent.token_address.lower() == NATION_ADDRESS.lower()
|
|
165
|
+
|
|
166
|
+
if not is_usdc and not is_nation:
|
|
167
|
+
custom_balance = await _get_token_balance(
|
|
168
|
+
web3_client, wallet_address, agent.token_address
|
|
169
|
+
)
|
|
170
|
+
assets.append(Asset(symbol=agent.ticker, balance=custom_balance))
|
|
171
|
+
|
|
172
|
+
return assets
|
|
173
|
+
|
|
174
|
+
|
|
175
|
+
async def agent_asset(agent_id: str) -> AgentAssets:
|
|
176
|
+
"""Fetch wallet net worth and token balances for an agent."""
|
|
177
|
+
|
|
178
|
+
cache_key = f"intentkit:agent_assets:{agent_id}"
|
|
179
|
+
redis_client = None
|
|
180
|
+
|
|
181
|
+
try:
|
|
182
|
+
redis_client = get_redis()
|
|
183
|
+
except Exception as exc: # pragma: no cover - best effort fallback
|
|
184
|
+
logger.debug("Redis unavailable for agent assets: %s", exc)
|
|
185
|
+
|
|
186
|
+
agent = await Agent.get(agent_id)
|
|
187
|
+
if not agent:
|
|
188
|
+
raise IntentKitAPIError(404, "AgentNotFound", "Agent not found")
|
|
189
|
+
|
|
190
|
+
if redis_client:
|
|
191
|
+
try:
|
|
192
|
+
cached_raw = await redis_client.get(cache_key)
|
|
193
|
+
if cached_raw:
|
|
194
|
+
cached_data = json.loads(cached_raw)
|
|
195
|
+
cached_assets = AgentAssets.model_validate(cached_data)
|
|
196
|
+
return cached_assets
|
|
197
|
+
except Exception as exc: # pragma: no cover - cache read path only
|
|
198
|
+
logger.debug("Failed to read agent asset cache for %s: %s", agent_id, exc)
|
|
199
|
+
|
|
200
|
+
agent_data = await AgentData.get(agent_id)
|
|
201
|
+
if not agent_data or not agent_data.evm_wallet_address:
|
|
202
|
+
assets_result = AgentAssets(net_worth="0", tokens=[])
|
|
203
|
+
elif not agent.network_id:
|
|
204
|
+
assets_result = AgentAssets(net_worth="0", tokens=[])
|
|
205
|
+
else:
|
|
206
|
+
try:
|
|
207
|
+
web3_client = get_web3_client(str(agent.network_id))
|
|
208
|
+
tokens = await _build_assets_list(agent, agent_data, web3_client)
|
|
209
|
+
net_worth = await _get_wallet_net_worth(agent_data.evm_wallet_address)
|
|
210
|
+
assets_result = AgentAssets(net_worth=net_worth, tokens=tokens)
|
|
211
|
+
except IntentKitAPIError:
|
|
212
|
+
raise
|
|
213
|
+
except Exception as exc:
|
|
214
|
+
logger.error("Error getting agent assets for %s: %s", agent_id, exc)
|
|
215
|
+
raise IntentKitAPIError(
|
|
216
|
+
500, "AgentAssetError", "Failed to retrieve agent assets"
|
|
217
|
+
) from exc
|
|
218
|
+
|
|
219
|
+
assets_payload = assets_result.model_dump(mode="json")
|
|
220
|
+
|
|
221
|
+
if redis_client:
|
|
222
|
+
try:
|
|
223
|
+
await redis_client.set(
|
|
224
|
+
cache_key,
|
|
225
|
+
json.dumps(assets_payload),
|
|
226
|
+
ex=3600,
|
|
227
|
+
)
|
|
228
|
+
except Exception as exc: # pragma: no cover - cache write path only
|
|
229
|
+
logger.debug("Failed to write agent asset cache for %s: %s", agent_id, exc)
|
|
230
|
+
|
|
231
|
+
try:
|
|
232
|
+
async with get_session() as session:
|
|
233
|
+
await session.execute(
|
|
234
|
+
update(AgentTable)
|
|
235
|
+
.where(AgentTable.id == agent_id)
|
|
236
|
+
.values(assets=assets_payload)
|
|
237
|
+
)
|
|
238
|
+
await session.commit()
|
|
239
|
+
except Exception as exc: # pragma: no cover - db persistence path only
|
|
240
|
+
logger.error("Error updating agent assets cache for %s: %s", agent_id, exc)
|
|
241
|
+
|
|
242
|
+
return assets_result
|
|
243
|
+
|
|
244
|
+
|
|
245
|
+
__all__ = [
|
|
246
|
+
"Asset",
|
|
247
|
+
"AgentAssets",
|
|
248
|
+
"USDC_ADDRESSES",
|
|
249
|
+
"NATION_ADDRESS",
|
|
250
|
+
"agent_asset",
|
|
251
|
+
"_build_assets_list",
|
|
252
|
+
"_get_wallet_net_worth",
|
|
253
|
+
]
|
intentkit/core/chat.py
ADDED
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
"""Chat memory management utilities.
|
|
2
|
+
|
|
3
|
+
This module provides functions for managing chat thread memory,
|
|
4
|
+
including clearing thread history using LangGraph's checkpointer.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
import logging
|
|
8
|
+
|
|
9
|
+
from intentkit.models.db import get_langgraph_checkpointer
|
|
10
|
+
from intentkit.utils.error import IntentKitAPIError
|
|
11
|
+
|
|
12
|
+
logger = logging.getLogger(__name__)
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
async def clear_thread_memory(agent_id: str, chat_id: str) -> bool:
|
|
16
|
+
"""Clear all memory content for a specific thread.
|
|
17
|
+
|
|
18
|
+
This function uses LangGraph's official checkpointer.delete_thread() method
|
|
19
|
+
to permanently remove all stored checkpoints and conversation history
|
|
20
|
+
associated with the specified thread.
|
|
21
|
+
|
|
22
|
+
Args:
|
|
23
|
+
agent_id (str): The agent identifier
|
|
24
|
+
chat_id (str): The chat identifier
|
|
25
|
+
|
|
26
|
+
Returns:
|
|
27
|
+
bool: True if the thread memory was successfully cleared
|
|
28
|
+
|
|
29
|
+
Raises:
|
|
30
|
+
IntentKitAPIError: If there's an error clearing the thread memory
|
|
31
|
+
"""
|
|
32
|
+
try:
|
|
33
|
+
# Construct thread_id by combining agent_id and chat_id
|
|
34
|
+
thread_id = f"{agent_id}-{chat_id}"
|
|
35
|
+
|
|
36
|
+
# Get the LangGraph checkpointer instance
|
|
37
|
+
checkpointer = get_langgraph_checkpointer()
|
|
38
|
+
|
|
39
|
+
# Use the official LangGraph method to delete all thread content
|
|
40
|
+
await checkpointer.adelete_thread(thread_id)
|
|
41
|
+
|
|
42
|
+
logger.info(f"Successfully cleared thread memory for thread_id: {thread_id}")
|
|
43
|
+
return True
|
|
44
|
+
|
|
45
|
+
except Exception as e:
|
|
46
|
+
logger.error(
|
|
47
|
+
f"Failed to clear thread memory for agent_id: {agent_id}, chat_id: {chat_id}. Error: {str(e)}"
|
|
48
|
+
)
|
|
49
|
+
raise IntentKitAPIError(
|
|
50
|
+
status_code=500, key="ServerError", message="Failed to clear thread memory"
|
|
51
|
+
)
|