intentkit 0.5.0__py3-none-any.whl → 0.5.2__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 +17 -0
- intentkit/abstracts/__init__.py +0 -0
- intentkit/abstracts/agent.py +60 -0
- intentkit/abstracts/api.py +4 -0
- intentkit/abstracts/engine.py +38 -0
- intentkit/abstracts/exception.py +9 -0
- intentkit/abstracts/graph.py +25 -0
- intentkit/abstracts/skill.py +129 -0
- intentkit/abstracts/twitter.py +54 -0
- intentkit/clients/__init__.py +14 -0
- intentkit/clients/cdp.py +53 -0
- intentkit/clients/twitter.py +445 -0
- intentkit/config/__init__.py +0 -0
- intentkit/config/config.py +164 -0
- intentkit/core/__init__.py +0 -0
- intentkit/core/agent.py +191 -0
- intentkit/core/api.py +40 -0
- intentkit/core/client.py +45 -0
- intentkit/core/credit.py +1767 -0
- intentkit/core/engine.py +1018 -0
- intentkit/core/node.py +223 -0
- intentkit/core/prompt.py +58 -0
- intentkit/core/skill.py +124 -0
- intentkit/models/agent.py +1689 -0
- intentkit/models/agent_data.py +810 -0
- intentkit/models/agent_schema.json +733 -0
- intentkit/models/app_setting.py +156 -0
- intentkit/models/base.py +9 -0
- intentkit/models/chat.py +581 -0
- intentkit/models/conversation.py +286 -0
- intentkit/models/credit.py +1406 -0
- intentkit/models/db.py +120 -0
- intentkit/models/db_mig.py +102 -0
- intentkit/models/generator.py +347 -0
- intentkit/models/llm.py +746 -0
- intentkit/models/redis.py +132 -0
- intentkit/models/skill.py +466 -0
- intentkit/models/user.py +243 -0
- intentkit/skills/__init__.py +12 -0
- intentkit/skills/acolyt/__init__.py +83 -0
- intentkit/skills/acolyt/acolyt.jpg +0 -0
- intentkit/skills/acolyt/ask.py +128 -0
- intentkit/skills/acolyt/base.py +28 -0
- intentkit/skills/acolyt/schema.json +89 -0
- intentkit/skills/aixbt/README.md +71 -0
- intentkit/skills/aixbt/__init__.py +73 -0
- intentkit/skills/aixbt/aixbt.jpg +0 -0
- intentkit/skills/aixbt/base.py +21 -0
- intentkit/skills/aixbt/projects.py +153 -0
- intentkit/skills/aixbt/schema.json +99 -0
- intentkit/skills/allora/__init__.py +83 -0
- intentkit/skills/allora/allora.jpeg +0 -0
- intentkit/skills/allora/base.py +28 -0
- intentkit/skills/allora/price.py +130 -0
- intentkit/skills/allora/schema.json +89 -0
- intentkit/skills/base.py +174 -0
- intentkit/skills/carv/README.md +95 -0
- intentkit/skills/carv/__init__.py +121 -0
- intentkit/skills/carv/base.py +183 -0
- intentkit/skills/carv/carv.webp +0 -0
- intentkit/skills/carv/fetch_news.py +92 -0
- intentkit/skills/carv/onchain_query.py +164 -0
- intentkit/skills/carv/schema.json +137 -0
- intentkit/skills/carv/token_info_and_price.py +110 -0
- intentkit/skills/cdp/__init__.py +137 -0
- intentkit/skills/cdp/base.py +21 -0
- intentkit/skills/cdp/cdp.png +0 -0
- intentkit/skills/cdp/get_balance.py +81 -0
- intentkit/skills/cdp/schema.json +473 -0
- intentkit/skills/chainlist/README.md +38 -0
- intentkit/skills/chainlist/__init__.py +54 -0
- intentkit/skills/chainlist/base.py +21 -0
- intentkit/skills/chainlist/chain_lookup.py +208 -0
- intentkit/skills/chainlist/chainlist.png +0 -0
- intentkit/skills/chainlist/schema.json +47 -0
- intentkit/skills/common/__init__.py +82 -0
- intentkit/skills/common/base.py +21 -0
- intentkit/skills/common/common.jpg +0 -0
- intentkit/skills/common/current_time.py +84 -0
- intentkit/skills/common/schema.json +57 -0
- intentkit/skills/cookiefun/README.md +121 -0
- intentkit/skills/cookiefun/__init__.py +78 -0
- intentkit/skills/cookiefun/base.py +41 -0
- intentkit/skills/cookiefun/constants.py +18 -0
- intentkit/skills/cookiefun/cookiefun.png +0 -0
- intentkit/skills/cookiefun/get_account_details.py +171 -0
- intentkit/skills/cookiefun/get_account_feed.py +282 -0
- intentkit/skills/cookiefun/get_account_smart_followers.py +181 -0
- intentkit/skills/cookiefun/get_sectors.py +128 -0
- intentkit/skills/cookiefun/schema.json +155 -0
- intentkit/skills/cookiefun/search_accounts.py +225 -0
- intentkit/skills/cryptocompare/__init__.py +130 -0
- intentkit/skills/cryptocompare/api.py +159 -0
- intentkit/skills/cryptocompare/base.py +303 -0
- intentkit/skills/cryptocompare/cryptocompare.png +0 -0
- intentkit/skills/cryptocompare/fetch_news.py +96 -0
- intentkit/skills/cryptocompare/fetch_price.py +99 -0
- intentkit/skills/cryptocompare/fetch_top_exchanges.py +113 -0
- intentkit/skills/cryptocompare/fetch_top_market_cap.py +109 -0
- intentkit/skills/cryptocompare/fetch_top_volume.py +108 -0
- intentkit/skills/cryptocompare/fetch_trading_signals.py +107 -0
- intentkit/skills/cryptocompare/schema.json +168 -0
- intentkit/skills/cryptopanic/__init__.py +108 -0
- intentkit/skills/cryptopanic/base.py +51 -0
- intentkit/skills/cryptopanic/cryptopanic.png +0 -0
- intentkit/skills/cryptopanic/fetch_crypto_news.py +153 -0
- intentkit/skills/cryptopanic/fetch_crypto_sentiment.py +136 -0
- intentkit/skills/cryptopanic/schema.json +103 -0
- intentkit/skills/dapplooker/README.md +92 -0
- intentkit/skills/dapplooker/__init__.py +83 -0
- intentkit/skills/dapplooker/base.py +26 -0
- intentkit/skills/dapplooker/dapplooker.jpg +0 -0
- intentkit/skills/dapplooker/dapplooker_token_data.py +476 -0
- intentkit/skills/dapplooker/schema.json +91 -0
- intentkit/skills/defillama/__init__.py +323 -0
- intentkit/skills/defillama/api.py +315 -0
- intentkit/skills/defillama/base.py +135 -0
- intentkit/skills/defillama/coins/__init__.py +0 -0
- intentkit/skills/defillama/coins/fetch_batch_historical_prices.py +116 -0
- intentkit/skills/defillama/coins/fetch_block.py +98 -0
- intentkit/skills/defillama/coins/fetch_current_prices.py +105 -0
- intentkit/skills/defillama/coins/fetch_first_price.py +100 -0
- intentkit/skills/defillama/coins/fetch_historical_prices.py +110 -0
- intentkit/skills/defillama/coins/fetch_price_chart.py +109 -0
- intentkit/skills/defillama/coins/fetch_price_percentage.py +93 -0
- intentkit/skills/defillama/config/__init__.py +0 -0
- intentkit/skills/defillama/config/chains.py +433 -0
- intentkit/skills/defillama/defillama.jpeg +0 -0
- intentkit/skills/defillama/fees/__init__.py +0 -0
- intentkit/skills/defillama/fees/fetch_fees_overview.py +130 -0
- intentkit/skills/defillama/schema.json +383 -0
- intentkit/skills/defillama/stablecoins/__init__.py +0 -0
- intentkit/skills/defillama/stablecoins/fetch_stablecoin_chains.py +100 -0
- intentkit/skills/defillama/stablecoins/fetch_stablecoin_charts.py +129 -0
- intentkit/skills/defillama/stablecoins/fetch_stablecoin_prices.py +83 -0
- intentkit/skills/defillama/stablecoins/fetch_stablecoins.py +126 -0
- intentkit/skills/defillama/tests/__init__.py +0 -0
- intentkit/skills/defillama/tests/api_integration.test.py +192 -0
- intentkit/skills/defillama/tests/api_unit.test.py +583 -0
- intentkit/skills/defillama/tvl/__init__.py +0 -0
- intentkit/skills/defillama/tvl/fetch_chain_historical_tvl.py +106 -0
- intentkit/skills/defillama/tvl/fetch_chains.py +107 -0
- intentkit/skills/defillama/tvl/fetch_historical_tvl.py +91 -0
- intentkit/skills/defillama/tvl/fetch_protocol.py +207 -0
- intentkit/skills/defillama/tvl/fetch_protocol_current_tvl.py +93 -0
- intentkit/skills/defillama/tvl/fetch_protocols.py +196 -0
- intentkit/skills/defillama/volumes/__init__.py +0 -0
- intentkit/skills/defillama/volumes/fetch_dex_overview.py +157 -0
- intentkit/skills/defillama/volumes/fetch_dex_summary.py +123 -0
- intentkit/skills/defillama/volumes/fetch_options_overview.py +131 -0
- intentkit/skills/defillama/yields/__init__.py +0 -0
- intentkit/skills/defillama/yields/fetch_pool_chart.py +100 -0
- intentkit/skills/defillama/yields/fetch_pools.py +126 -0
- intentkit/skills/dexscreener/__init__.py +93 -0
- intentkit/skills/dexscreener/base.py +133 -0
- intentkit/skills/dexscreener/dexscreener.png +0 -0
- intentkit/skills/dexscreener/model/__init__.py +0 -0
- intentkit/skills/dexscreener/model/search_token_response.py +82 -0
- intentkit/skills/dexscreener/schema.json +48 -0
- intentkit/skills/dexscreener/search_token.py +321 -0
- intentkit/skills/dune_analytics/__init__.py +103 -0
- intentkit/skills/dune_analytics/base.py +46 -0
- intentkit/skills/dune_analytics/dune.png +0 -0
- intentkit/skills/dune_analytics/fetch_kol_buys.py +128 -0
- intentkit/skills/dune_analytics/fetch_nation_metrics.py +237 -0
- intentkit/skills/dune_analytics/schema.json +99 -0
- intentkit/skills/elfa/README.md +100 -0
- intentkit/skills/elfa/__init__.py +123 -0
- intentkit/skills/elfa/base.py +28 -0
- intentkit/skills/elfa/elfa.jpg +0 -0
- intentkit/skills/elfa/mention.py +504 -0
- intentkit/skills/elfa/schema.json +153 -0
- intentkit/skills/elfa/stats.py +118 -0
- intentkit/skills/elfa/tokens.py +126 -0
- intentkit/skills/enso/README.md +75 -0
- intentkit/skills/enso/__init__.py +114 -0
- intentkit/skills/enso/abi/__init__.py +0 -0
- intentkit/skills/enso/abi/approval.py +279 -0
- intentkit/skills/enso/abi/erc20.py +14 -0
- intentkit/skills/enso/abi/route.py +129 -0
- intentkit/skills/enso/base.py +44 -0
- intentkit/skills/enso/best_yield.py +286 -0
- intentkit/skills/enso/enso.jpg +0 -0
- intentkit/skills/enso/networks.py +105 -0
- intentkit/skills/enso/prices.py +93 -0
- intentkit/skills/enso/route.py +300 -0
- intentkit/skills/enso/schema.json +212 -0
- intentkit/skills/enso/tokens.py +223 -0
- intentkit/skills/enso/wallet.py +381 -0
- intentkit/skills/github/README.md +63 -0
- intentkit/skills/github/__init__.py +54 -0
- intentkit/skills/github/base.py +21 -0
- intentkit/skills/github/github.jpg +0 -0
- intentkit/skills/github/github_search.py +183 -0
- intentkit/skills/github/schema.json +59 -0
- intentkit/skills/heurist/__init__.py +143 -0
- intentkit/skills/heurist/base.py +26 -0
- intentkit/skills/heurist/heurist.png +0 -0
- intentkit/skills/heurist/image_generation_animagine_xl.py +162 -0
- intentkit/skills/heurist/image_generation_arthemy_comics.py +162 -0
- intentkit/skills/heurist/image_generation_arthemy_real.py +162 -0
- intentkit/skills/heurist/image_generation_braindance.py +162 -0
- intentkit/skills/heurist/image_generation_cyber_realistic_xl.py +162 -0
- intentkit/skills/heurist/image_generation_flux_1_dev.py +162 -0
- intentkit/skills/heurist/image_generation_sdxl.py +161 -0
- intentkit/skills/heurist/schema.json +196 -0
- intentkit/skills/lifi/README.md +294 -0
- intentkit/skills/lifi/__init__.py +141 -0
- intentkit/skills/lifi/base.py +21 -0
- intentkit/skills/lifi/lifi.png +0 -0
- intentkit/skills/lifi/schema.json +89 -0
- intentkit/skills/lifi/token_execute.py +472 -0
- intentkit/skills/lifi/token_quote.py +190 -0
- intentkit/skills/lifi/utils.py +656 -0
- intentkit/skills/moralis/README.md +490 -0
- intentkit/skills/moralis/__init__.py +110 -0
- intentkit/skills/moralis/api.py +281 -0
- intentkit/skills/moralis/base.py +55 -0
- intentkit/skills/moralis/fetch_chain_portfolio.py +191 -0
- intentkit/skills/moralis/fetch_nft_portfolio.py +284 -0
- intentkit/skills/moralis/fetch_solana_portfolio.py +331 -0
- intentkit/skills/moralis/fetch_wallet_portfolio.py +301 -0
- intentkit/skills/moralis/moralis.png +0 -0
- intentkit/skills/moralis/schema.json +156 -0
- intentkit/skills/moralis/tests/__init__.py +0 -0
- intentkit/skills/moralis/tests/test_wallet.py +511 -0
- intentkit/skills/nation/__init__.py +62 -0
- intentkit/skills/nation/base.py +31 -0
- intentkit/skills/nation/nation.png +0 -0
- intentkit/skills/nation/nft_check.py +106 -0
- intentkit/skills/nation/schema.json +58 -0
- intentkit/skills/openai/__init__.py +107 -0
- intentkit/skills/openai/base.py +32 -0
- intentkit/skills/openai/dalle_image_generation.py +128 -0
- intentkit/skills/openai/gpt_image_generation.py +152 -0
- intentkit/skills/openai/gpt_image_to_image.py +186 -0
- intentkit/skills/openai/image_to_text.py +126 -0
- intentkit/skills/openai/openai.png +0 -0
- intentkit/skills/openai/schema.json +139 -0
- intentkit/skills/portfolio/README.md +55 -0
- intentkit/skills/portfolio/__init__.py +151 -0
- intentkit/skills/portfolio/base.py +107 -0
- intentkit/skills/portfolio/constants.py +9 -0
- intentkit/skills/portfolio/moralis.png +0 -0
- intentkit/skills/portfolio/schema.json +237 -0
- intentkit/skills/portfolio/token_balances.py +155 -0
- intentkit/skills/portfolio/wallet_approvals.py +102 -0
- intentkit/skills/portfolio/wallet_defi_positions.py +80 -0
- intentkit/skills/portfolio/wallet_history.py +155 -0
- intentkit/skills/portfolio/wallet_net_worth.py +112 -0
- intentkit/skills/portfolio/wallet_nfts.py +139 -0
- intentkit/skills/portfolio/wallet_profitability.py +101 -0
- intentkit/skills/portfolio/wallet_profitability_summary.py +91 -0
- intentkit/skills/portfolio/wallet_stats.py +79 -0
- intentkit/skills/portfolio/wallet_swaps.py +147 -0
- intentkit/skills/skills.toml +103 -0
- intentkit/skills/slack/__init__.py +98 -0
- intentkit/skills/slack/base.py +55 -0
- intentkit/skills/slack/get_channel.py +109 -0
- intentkit/skills/slack/get_message.py +136 -0
- intentkit/skills/slack/schedule_message.py +92 -0
- intentkit/skills/slack/schema.json +135 -0
- intentkit/skills/slack/send_message.py +81 -0
- intentkit/skills/slack/slack.jpg +0 -0
- intentkit/skills/system/__init__.py +90 -0
- intentkit/skills/system/base.py +22 -0
- intentkit/skills/system/read_agent_api_key.py +87 -0
- intentkit/skills/system/regenerate_agent_api_key.py +77 -0
- intentkit/skills/system/schema.json +53 -0
- intentkit/skills/system/system.svg +76 -0
- intentkit/skills/tavily/README.md +86 -0
- intentkit/skills/tavily/__init__.py +91 -0
- intentkit/skills/tavily/base.py +27 -0
- intentkit/skills/tavily/schema.json +119 -0
- intentkit/skills/tavily/tavily.jpg +0 -0
- intentkit/skills/tavily/tavily_extract.py +147 -0
- intentkit/skills/tavily/tavily_search.py +139 -0
- intentkit/skills/token/README.md +89 -0
- intentkit/skills/token/__init__.py +107 -0
- intentkit/skills/token/base.py +154 -0
- intentkit/skills/token/constants.py +9 -0
- intentkit/skills/token/erc20_transfers.py +145 -0
- intentkit/skills/token/moralis.png +0 -0
- intentkit/skills/token/schema.json +141 -0
- intentkit/skills/token/token_analytics.py +81 -0
- intentkit/skills/token/token_price.py +132 -0
- intentkit/skills/token/token_search.py +121 -0
- intentkit/skills/twitter/__init__.py +146 -0
- intentkit/skills/twitter/base.py +68 -0
- intentkit/skills/twitter/follow_user.py +69 -0
- intentkit/skills/twitter/get_mentions.py +124 -0
- intentkit/skills/twitter/get_timeline.py +111 -0
- intentkit/skills/twitter/get_user_by_username.py +84 -0
- intentkit/skills/twitter/get_user_tweets.py +123 -0
- intentkit/skills/twitter/like_tweet.py +65 -0
- intentkit/skills/twitter/post_tweet.py +90 -0
- intentkit/skills/twitter/reply_tweet.py +98 -0
- intentkit/skills/twitter/retweet.py +76 -0
- intentkit/skills/twitter/schema.json +258 -0
- intentkit/skills/twitter/search_tweets.py +115 -0
- intentkit/skills/twitter/twitter.png +0 -0
- intentkit/skills/unrealspeech/__init__.py +55 -0
- intentkit/skills/unrealspeech/base.py +21 -0
- intentkit/skills/unrealspeech/schema.json +100 -0
- intentkit/skills/unrealspeech/text_to_speech.py +177 -0
- intentkit/skills/unrealspeech/unrealspeech.jpg +0 -0
- intentkit/skills/venice_audio/__init__.py +106 -0
- intentkit/skills/venice_audio/base.py +119 -0
- intentkit/skills/venice_audio/input.py +41 -0
- intentkit/skills/venice_audio/schema.json +152 -0
- intentkit/skills/venice_audio/venice_audio.py +240 -0
- intentkit/skills/venice_audio/venice_logo.jpg +0 -0
- intentkit/skills/venice_image/README.md +119 -0
- intentkit/skills/venice_image/__init__.py +154 -0
- intentkit/skills/venice_image/api.py +138 -0
- intentkit/skills/venice_image/base.py +188 -0
- intentkit/skills/venice_image/config.py +35 -0
- intentkit/skills/venice_image/image_enhance/README.md +119 -0
- intentkit/skills/venice_image/image_enhance/__init__.py +0 -0
- intentkit/skills/venice_image/image_enhance/image_enhance.py +80 -0
- intentkit/skills/venice_image/image_enhance/image_enhance_base.py +23 -0
- intentkit/skills/venice_image/image_enhance/image_enhance_input.py +40 -0
- intentkit/skills/venice_image/image_generation/README.md +144 -0
- intentkit/skills/venice_image/image_generation/__init__.py +0 -0
- intentkit/skills/venice_image/image_generation/image_generation_base.py +117 -0
- intentkit/skills/venice_image/image_generation/image_generation_fluently_xl.py +26 -0
- intentkit/skills/venice_image/image_generation/image_generation_flux_dev.py +27 -0
- intentkit/skills/venice_image/image_generation/image_generation_flux_dev_uncensored.py +26 -0
- intentkit/skills/venice_image/image_generation/image_generation_input.py +158 -0
- intentkit/skills/venice_image/image_generation/image_generation_lustify_sdxl.py +26 -0
- intentkit/skills/venice_image/image_generation/image_generation_pony_realism.py +26 -0
- intentkit/skills/venice_image/image_generation/image_generation_stable_diffusion_3_5.py +28 -0
- intentkit/skills/venice_image/image_generation/image_generation_venice_sd35.py +28 -0
- intentkit/skills/venice_image/image_upscale/README.md +111 -0
- intentkit/skills/venice_image/image_upscale/__init__.py +0 -0
- intentkit/skills/venice_image/image_upscale/image_upscale.py +90 -0
- intentkit/skills/venice_image/image_upscale/image_upscale_base.py +23 -0
- intentkit/skills/venice_image/image_upscale/image_upscale_input.py +22 -0
- intentkit/skills/venice_image/image_vision/README.md +112 -0
- intentkit/skills/venice_image/image_vision/__init__.py +0 -0
- intentkit/skills/venice_image/image_vision/image_vision.py +100 -0
- intentkit/skills/venice_image/image_vision/image_vision_base.py +17 -0
- intentkit/skills/venice_image/image_vision/image_vision_input.py +9 -0
- intentkit/skills/venice_image/schema.json +267 -0
- intentkit/skills/venice_image/utils.py +78 -0
- intentkit/skills/venice_image/venice_image.jpg +0 -0
- intentkit/skills/web_scraper/README.md +82 -0
- intentkit/skills/web_scraper/__init__.py +92 -0
- intentkit/skills/web_scraper/base.py +21 -0
- intentkit/skills/web_scraper/langchain.png +0 -0
- intentkit/skills/web_scraper/schema.json +115 -0
- intentkit/skills/web_scraper/scrape_and_index.py +327 -0
- intentkit/utils/__init__.py +1 -0
- intentkit/utils/chain.py +436 -0
- intentkit/utils/error.py +134 -0
- intentkit/utils/logging.py +70 -0
- intentkit/utils/middleware.py +61 -0
- intentkit/utils/random.py +16 -0
- intentkit/utils/s3.py +267 -0
- intentkit/utils/slack_alert.py +79 -0
- intentkit/utils/tx.py +37 -0
- {intentkit-0.5.0.dist-info → intentkit-0.5.2.dist-info}/METADATA +1 -1
- intentkit-0.5.2.dist-info/RECORD +365 -0
- intentkit-0.5.0.dist-info/RECORD +0 -4
- {intentkit-0.5.0.dist-info → intentkit-0.5.2.dist-info}/WHEEL +0 -0
- {intentkit-0.5.0.dist-info → intentkit-0.5.2.dist-info}/licenses/LICENSE +0 -0
intentkit/core/agent.py
ADDED
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
import logging
|
|
2
|
+
import time
|
|
3
|
+
from datetime import datetime, timedelta, timezone
|
|
4
|
+
from decimal import Decimal
|
|
5
|
+
from typing import Dict
|
|
6
|
+
|
|
7
|
+
from sqlalchemy import func, select, text
|
|
8
|
+
|
|
9
|
+
from intentkit.models.agent import Agent
|
|
10
|
+
from intentkit.models.credit import CreditEventTable, EventType, UpstreamType
|
|
11
|
+
from intentkit.models.db import get_session
|
|
12
|
+
from intentkit.utils.error import IntentKitAPIError
|
|
13
|
+
|
|
14
|
+
logger = logging.getLogger(__name__)
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
async def agent_action_cost(agent_id: str) -> Dict[str, Decimal]:
|
|
18
|
+
"""
|
|
19
|
+
Calculate various action cost metrics for an agent based on past three days of credit events.
|
|
20
|
+
|
|
21
|
+
Metrics calculated:
|
|
22
|
+
- avg_action_cost: average cost per action
|
|
23
|
+
- min_action_cost: minimum cost per action
|
|
24
|
+
- max_action_cost: maximum cost per action
|
|
25
|
+
- low_action_cost: average cost of the lowest 20% of actions
|
|
26
|
+
- medium_action_cost: average cost of the middle 60% of actions
|
|
27
|
+
- high_action_cost: average cost of the highest 20% of actions
|
|
28
|
+
|
|
29
|
+
Args:
|
|
30
|
+
agent_id: ID of the agent
|
|
31
|
+
|
|
32
|
+
Returns:
|
|
33
|
+
Dict[str, Decimal]: Dictionary containing all calculated cost metrics
|
|
34
|
+
"""
|
|
35
|
+
start_time = time.time()
|
|
36
|
+
default_value = Decimal("0")
|
|
37
|
+
|
|
38
|
+
agent = await Agent.get(agent_id)
|
|
39
|
+
if not agent:
|
|
40
|
+
raise IntentKitAPIError(
|
|
41
|
+
400, "AgentNotFound", f"Agent with ID {agent_id} does not exist."
|
|
42
|
+
)
|
|
43
|
+
|
|
44
|
+
async with get_session() as session:
|
|
45
|
+
# Calculate the date 3 days ago from now
|
|
46
|
+
three_days_ago = datetime.now(timezone.utc) - timedelta(days=3)
|
|
47
|
+
|
|
48
|
+
# First, count the number of distinct start_message_ids to determine if we have enough data
|
|
49
|
+
count_query = select(
|
|
50
|
+
func.count(func.distinct(CreditEventTable.start_message_id))
|
|
51
|
+
).where(
|
|
52
|
+
CreditEventTable.agent_id == agent_id,
|
|
53
|
+
CreditEventTable.created_at >= three_days_ago,
|
|
54
|
+
CreditEventTable.user_id != agent.owner,
|
|
55
|
+
CreditEventTable.upstream_type == UpstreamType.EXECUTOR,
|
|
56
|
+
CreditEventTable.event_type.in_([EventType.MESSAGE, EventType.SKILL_CALL]),
|
|
57
|
+
CreditEventTable.start_message_id.is_not(None),
|
|
58
|
+
)
|
|
59
|
+
|
|
60
|
+
result = await session.execute(count_query)
|
|
61
|
+
record_count = result.scalar_one()
|
|
62
|
+
|
|
63
|
+
# If we have fewer than 10 records, return default values
|
|
64
|
+
if record_count < 10:
|
|
65
|
+
time_cost = time.time() - start_time
|
|
66
|
+
logger.info(
|
|
67
|
+
f"agent_action_cost for {agent_id}: using default values (insufficient records: {record_count}) timeCost={time_cost:.3f}s"
|
|
68
|
+
)
|
|
69
|
+
return {
|
|
70
|
+
"avg_action_cost": default_value,
|
|
71
|
+
"min_action_cost": default_value,
|
|
72
|
+
"max_action_cost": default_value,
|
|
73
|
+
"low_action_cost": default_value,
|
|
74
|
+
"medium_action_cost": default_value,
|
|
75
|
+
"high_action_cost": default_value,
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
# Calculate the basic metrics (avg, min, max) directly in PostgreSQL
|
|
79
|
+
basic_metrics_query = text("""
|
|
80
|
+
WITH action_sums AS (
|
|
81
|
+
SELECT start_message_id, SUM(total_amount) AS action_cost
|
|
82
|
+
FROM credit_events
|
|
83
|
+
WHERE agent_id = :agent_id
|
|
84
|
+
AND created_at >= :three_days_ago
|
|
85
|
+
AND upstream_type = :upstream_type
|
|
86
|
+
AND event_type IN (:event_type_message, :event_type_skill_call)
|
|
87
|
+
AND start_message_id IS NOT NULL
|
|
88
|
+
GROUP BY start_message_id
|
|
89
|
+
)
|
|
90
|
+
SELECT
|
|
91
|
+
AVG(action_cost) AS avg_cost,
|
|
92
|
+
MIN(action_cost) AS min_cost,
|
|
93
|
+
MAX(action_cost) AS max_cost
|
|
94
|
+
FROM action_sums
|
|
95
|
+
""")
|
|
96
|
+
|
|
97
|
+
# Calculate the percentile-based metrics (low, medium, high) using window functions
|
|
98
|
+
percentile_metrics_query = text("""
|
|
99
|
+
WITH action_sums AS (
|
|
100
|
+
SELECT
|
|
101
|
+
start_message_id,
|
|
102
|
+
SUM(total_amount) AS action_cost,
|
|
103
|
+
NTILE(5) OVER (ORDER BY SUM(total_amount)) AS quintile
|
|
104
|
+
FROM credit_events
|
|
105
|
+
WHERE agent_id = :agent_id
|
|
106
|
+
AND created_at >= :three_days_ago
|
|
107
|
+
AND upstream_type = :upstream_type
|
|
108
|
+
AND event_type IN (:event_type_message, :event_type_skill_call)
|
|
109
|
+
AND start_message_id IS NOT NULL
|
|
110
|
+
GROUP BY start_message_id
|
|
111
|
+
)
|
|
112
|
+
SELECT
|
|
113
|
+
(SELECT AVG(action_cost) FROM action_sums WHERE quintile = 1) AS low_cost,
|
|
114
|
+
(SELECT AVG(action_cost) FROM action_sums WHERE quintile IN (2, 3, 4)) AS medium_cost,
|
|
115
|
+
(SELECT AVG(action_cost) FROM action_sums WHERE quintile = 5) AS high_cost
|
|
116
|
+
FROM action_sums
|
|
117
|
+
LIMIT 1
|
|
118
|
+
""")
|
|
119
|
+
|
|
120
|
+
# Bind parameters to prevent SQL injection and ensure correct types
|
|
121
|
+
params = {
|
|
122
|
+
"agent_id": agent_id,
|
|
123
|
+
"three_days_ago": three_days_ago,
|
|
124
|
+
"upstream_type": UpstreamType.EXECUTOR,
|
|
125
|
+
"event_type_message": EventType.MESSAGE,
|
|
126
|
+
"event_type_skill_call": EventType.SKILL_CALL,
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
# Execute the basic metrics query
|
|
130
|
+
basic_result = await session.execute(basic_metrics_query, params)
|
|
131
|
+
basic_row = basic_result.fetchone()
|
|
132
|
+
|
|
133
|
+
# Execute the percentile metrics query
|
|
134
|
+
percentile_result = await session.execute(percentile_metrics_query, params)
|
|
135
|
+
percentile_row = percentile_result.fetchone()
|
|
136
|
+
|
|
137
|
+
# If no results, return the default values
|
|
138
|
+
if not basic_row or basic_row[0] is None:
|
|
139
|
+
time_cost = time.time() - start_time
|
|
140
|
+
logger.info(
|
|
141
|
+
f"agent_action_cost for {agent_id}: using default values (no action costs found) timeCost={time_cost:.3f}s"
|
|
142
|
+
)
|
|
143
|
+
return {
|
|
144
|
+
"avg_action_cost": default_value,
|
|
145
|
+
"min_action_cost": default_value,
|
|
146
|
+
"max_action_cost": default_value,
|
|
147
|
+
"low_action_cost": default_value,
|
|
148
|
+
"medium_action_cost": default_value,
|
|
149
|
+
"high_action_cost": default_value,
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
# Extract and convert the values to Decimal for consistent precision
|
|
153
|
+
avg_cost = Decimal(str(basic_row[0] or 0)).quantize(Decimal("0.0001"))
|
|
154
|
+
min_cost = Decimal(str(basic_row[1] or 0)).quantize(Decimal("0.0001"))
|
|
155
|
+
max_cost = Decimal(str(basic_row[2] or 0)).quantize(Decimal("0.0001"))
|
|
156
|
+
|
|
157
|
+
# Extract percentile-based metrics
|
|
158
|
+
low_cost = (
|
|
159
|
+
Decimal(str(percentile_row[0] or 0)).quantize(Decimal("0.0001"))
|
|
160
|
+
if percentile_row and percentile_row[0] is not None
|
|
161
|
+
else default_value
|
|
162
|
+
)
|
|
163
|
+
medium_cost = (
|
|
164
|
+
Decimal(str(percentile_row[1] or 0)).quantize(Decimal("0.0001"))
|
|
165
|
+
if percentile_row and percentile_row[1] is not None
|
|
166
|
+
else default_value
|
|
167
|
+
)
|
|
168
|
+
high_cost = (
|
|
169
|
+
Decimal(str(percentile_row[2] or 0)).quantize(Decimal("0.0001"))
|
|
170
|
+
if percentile_row and percentile_row[2] is not None
|
|
171
|
+
else default_value
|
|
172
|
+
)
|
|
173
|
+
|
|
174
|
+
# Create the result dictionary
|
|
175
|
+
result = {
|
|
176
|
+
"avg_action_cost": avg_cost,
|
|
177
|
+
"min_action_cost": min_cost,
|
|
178
|
+
"max_action_cost": max_cost,
|
|
179
|
+
"low_action_cost": low_cost,
|
|
180
|
+
"medium_action_cost": medium_cost,
|
|
181
|
+
"high_action_cost": high_cost,
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
time_cost = time.time() - start_time
|
|
185
|
+
logger.info(
|
|
186
|
+
f"agent_action_cost for {agent_id}: avg={avg_cost}, min={min_cost}, max={max_cost}, "
|
|
187
|
+
f"low={low_cost}, medium={medium_cost}, high={high_cost} "
|
|
188
|
+
f"(records: {record_count}) timeCost={time_cost:.3f}s"
|
|
189
|
+
)
|
|
190
|
+
|
|
191
|
+
return result
|
intentkit/core/api.py
ADDED
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
"""Core API Router.
|
|
2
|
+
|
|
3
|
+
This module provides the core API endpoints for agent execution and management.
|
|
4
|
+
"""
|
|
5
|
+
|
|
6
|
+
from typing import Annotated
|
|
7
|
+
|
|
8
|
+
from fastapi import APIRouter, Body
|
|
9
|
+
from pydantic import AfterValidator
|
|
10
|
+
|
|
11
|
+
from intentkit.core.engine import execute_agent
|
|
12
|
+
from intentkit.models.chat import ChatMessage, ChatMessageCreate
|
|
13
|
+
|
|
14
|
+
core_router = APIRouter(prefix="/core", tags=["Core"])
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
@core_router.post("/execute", response_model=list[ChatMessage])
|
|
18
|
+
async def execute(
|
|
19
|
+
message: Annotated[
|
|
20
|
+
ChatMessageCreate, AfterValidator(ChatMessageCreate.model_validate)
|
|
21
|
+
] = Body(
|
|
22
|
+
ChatMessageCreate,
|
|
23
|
+
description="The chat message containing agent_id, chat_id and message content",
|
|
24
|
+
),
|
|
25
|
+
) -> list[ChatMessage]:
|
|
26
|
+
"""Execute an agent with the given input and return response lines.
|
|
27
|
+
|
|
28
|
+
**Request Body:**
|
|
29
|
+
* `message` - The chat message containing agent_id, chat_id and message content
|
|
30
|
+
|
|
31
|
+
**Returns:**
|
|
32
|
+
* `list[ChatMessage]` - Formatted response lines from agent execution
|
|
33
|
+
|
|
34
|
+
**Raises:**
|
|
35
|
+
* `HTTPException`:
|
|
36
|
+
- 400: If input parameters are invalid
|
|
37
|
+
- 404: If agent not found
|
|
38
|
+
- 500: For other server-side errors
|
|
39
|
+
"""
|
|
40
|
+
return await execute_agent(message)
|
intentkit/core/client.py
ADDED
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
"""Core Client Module.
|
|
2
|
+
|
|
3
|
+
This module provides client functions for core API endpoints with environment-aware routing.
|
|
4
|
+
"""
|
|
5
|
+
|
|
6
|
+
import httpx
|
|
7
|
+
|
|
8
|
+
from intentkit.config.config import config
|
|
9
|
+
from intentkit.core.engine import execute_agent as local_execute_agent
|
|
10
|
+
from intentkit.models.chat import ChatMessage, ChatMessageCreate
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
async def execute_agent(
|
|
14
|
+
message: ChatMessageCreate, debug: bool = False
|
|
15
|
+
) -> list[ChatMessage]:
|
|
16
|
+
"""Execute an agent with environment-aware routing.
|
|
17
|
+
|
|
18
|
+
In local environment, directly calls the local execute_agent function.
|
|
19
|
+
In other environments, makes HTTP request to the core API endpoint.
|
|
20
|
+
|
|
21
|
+
Args:
|
|
22
|
+
message (ChatMessage): The chat message containing agent_id, chat_id and message content
|
|
23
|
+
debug (bool): Enable debug mode
|
|
24
|
+
|
|
25
|
+
Returns:
|
|
26
|
+
list[ChatMessage]: Formatted response lines from agent execution
|
|
27
|
+
|
|
28
|
+
Raises:
|
|
29
|
+
HTTPException: For API errors (in non-local environment)
|
|
30
|
+
Exception: For other execution errors
|
|
31
|
+
"""
|
|
32
|
+
if config.env == "local":
|
|
33
|
+
return await local_execute_agent(message, debug)
|
|
34
|
+
|
|
35
|
+
# Make HTTP request in non-local environment
|
|
36
|
+
url = f"{config.internal_base_url}/core/execute"
|
|
37
|
+
async with httpx.AsyncClient() as client:
|
|
38
|
+
response = await client.post(
|
|
39
|
+
url,
|
|
40
|
+
json=message.model_dump(mode="json"),
|
|
41
|
+
timeout=180,
|
|
42
|
+
)
|
|
43
|
+
response.raise_for_status()
|
|
44
|
+
json_data = response.json()
|
|
45
|
+
return [ChatMessage.model_validate(msg) for msg in json_data]
|