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
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import logging
|
|
2
|
-
from typing import Type
|
|
3
2
|
|
|
4
3
|
from pydantic import BaseModel, Field
|
|
5
4
|
|
|
@@ -35,24 +34,21 @@ class TwitterGetUserByUsername(TwitterBaseTool):
|
|
|
35
34
|
|
|
36
35
|
name: str = NAME
|
|
37
36
|
description: str = PROMPT
|
|
38
|
-
args_schema:
|
|
37
|
+
args_schema: type[BaseModel] = TwitterGetUserByUsernameInput
|
|
39
38
|
|
|
40
39
|
async def _arun(self, username: str, **kwargs):
|
|
40
|
+
context = self.get_context()
|
|
41
41
|
try:
|
|
42
|
-
context = self.get_context()
|
|
43
42
|
skill_config = context.agent.skill_config(self.category)
|
|
44
43
|
twitter = get_twitter_client(
|
|
45
44
|
agent_id=context.agent_id,
|
|
46
|
-
skill_store=self.skill_store,
|
|
47
45
|
config=skill_config,
|
|
48
46
|
)
|
|
49
47
|
client = await twitter.get_client()
|
|
50
48
|
|
|
51
49
|
# Check rate limit only when not using OAuth
|
|
52
50
|
if not twitter.use_key:
|
|
53
|
-
await self.check_rate_limit(
|
|
54
|
-
context.agent_id, max_requests=5, interval=60 * 24
|
|
55
|
-
)
|
|
51
|
+
await self.check_rate_limit(max_requests=5, interval=60 * 24)
|
|
56
52
|
|
|
57
53
|
user_data = await client.get_user(
|
|
58
54
|
username=username,
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import logging
|
|
2
|
-
from typing import List, Optional, Type
|
|
3
2
|
|
|
4
3
|
from pydantic import BaseModel, Field
|
|
5
4
|
|
|
@@ -21,7 +20,7 @@ class TwitterGetUserTweetsInput(BaseModel):
|
|
|
21
20
|
"""Input for TwitterGetUserTweets tool."""
|
|
22
21
|
|
|
23
22
|
user_id: str = Field(description="The Twitter user ID to fetch tweets from")
|
|
24
|
-
exclude:
|
|
23
|
+
exclude: list[str] | None = Field(
|
|
25
24
|
default=["replies", "retweets"],
|
|
26
25
|
description="Types of tweets to exclude (e.g., 'replies', 'retweets')",
|
|
27
26
|
)
|
|
@@ -41,9 +40,10 @@ class TwitterGetUserTweets(TwitterBaseTool):
|
|
|
41
40
|
|
|
42
41
|
name: str = NAME
|
|
43
42
|
description: str = PROMPT
|
|
44
|
-
args_schema:
|
|
43
|
+
args_schema: type[BaseModel] = TwitterGetUserTweetsInput
|
|
45
44
|
|
|
46
45
|
async def _arun(self, **kwargs):
|
|
46
|
+
context = self.get_context()
|
|
47
47
|
try:
|
|
48
48
|
user_id = kwargs.get("user_id")
|
|
49
49
|
if not user_id:
|
|
@@ -55,25 +55,19 @@ class TwitterGetUserTweets(TwitterBaseTool):
|
|
|
55
55
|
# Get exclude parameter with default
|
|
56
56
|
exclude = kwargs.get("exclude", ["replies", "retweets"])
|
|
57
57
|
|
|
58
|
-
context = self.get_context()
|
|
59
58
|
skill_config = context.agent.skill_config(self.category)
|
|
60
59
|
twitter = get_twitter_client(
|
|
61
60
|
agent_id=context.agent_id,
|
|
62
|
-
skill_store=self.skill_store,
|
|
63
61
|
config=skill_config,
|
|
64
62
|
)
|
|
65
63
|
client = await twitter.get_client()
|
|
66
64
|
|
|
67
65
|
# Check rate limit only when not using OAuth
|
|
68
66
|
if not twitter.use_key:
|
|
69
|
-
await self.check_rate_limit(
|
|
70
|
-
context.agent_id, max_requests=1, interval=15
|
|
71
|
-
)
|
|
67
|
+
await self.check_rate_limit(max_requests=1, interval=15)
|
|
72
68
|
|
|
73
69
|
# get since id from store
|
|
74
|
-
last = await self.
|
|
75
|
-
context.agent_id, self.name, user_id
|
|
76
|
-
)
|
|
70
|
+
last = await self.get_agent_skill_data(user_id)
|
|
77
71
|
last = last or {}
|
|
78
72
|
since_id = last.get("since_id")
|
|
79
73
|
|
|
@@ -112,9 +106,7 @@ class TwitterGetUserTweets(TwitterBaseTool):
|
|
|
112
106
|
# Update the since_id in store for the next request
|
|
113
107
|
if tweets.get("meta") and tweets["meta"].get("newest_id"):
|
|
114
108
|
last["since_id"] = tweets["meta"]["newest_id"]
|
|
115
|
-
await self.
|
|
116
|
-
context.agent_id, self.name, user_id, last
|
|
117
|
-
)
|
|
109
|
+
await self.save_agent_skill_data(user_id, last)
|
|
118
110
|
|
|
119
111
|
return tweets
|
|
120
112
|
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import logging
|
|
2
|
-
from typing import Type
|
|
3
2
|
|
|
4
3
|
from langchain_core.tools import ToolException
|
|
5
4
|
from pydantic import BaseModel, Field
|
|
@@ -32,24 +31,21 @@ class TwitterLikeTweet(TwitterBaseTool):
|
|
|
32
31
|
|
|
33
32
|
name: str = NAME
|
|
34
33
|
description: str = PROMPT
|
|
35
|
-
args_schema:
|
|
34
|
+
args_schema: type[BaseModel] = TwitterLikeTweetInput
|
|
36
35
|
|
|
37
36
|
async def _arun(self, tweet_id: str, **kwargs):
|
|
37
|
+
context = self.get_context()
|
|
38
38
|
try:
|
|
39
|
-
context = self.get_context()
|
|
40
39
|
skill_config = context.agent.skill_config(self.category)
|
|
41
40
|
twitter = get_twitter_client(
|
|
42
41
|
agent_id=context.agent_id,
|
|
43
|
-
skill_store=self.skill_store,
|
|
44
42
|
config=skill_config,
|
|
45
43
|
)
|
|
46
44
|
client = await twitter.get_client()
|
|
47
45
|
|
|
48
46
|
# Check rate limit only when not using OAuth
|
|
49
47
|
if not twitter.use_key:
|
|
50
|
-
await self.check_rate_limit(
|
|
51
|
-
context.agent_id, max_requests=100, interval=1440
|
|
52
|
-
)
|
|
48
|
+
await self.check_rate_limit(max_requests=100, interval=1440)
|
|
53
49
|
|
|
54
50
|
# Like the tweet using tweepy client
|
|
55
51
|
response = await client.like(tweet_id=tweet_id, user_auth=twitter.use_key)
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import logging
|
|
2
|
-
from typing import Optional, Type
|
|
3
2
|
|
|
4
3
|
from langchain_core.tools import ToolException
|
|
5
4
|
from pydantic import BaseModel, Field
|
|
6
5
|
|
|
7
6
|
from intentkit.clients import get_twitter_client
|
|
7
|
+
from intentkit.config.config import config
|
|
8
8
|
from intentkit.skills.twitter.base import TwitterBaseTool
|
|
9
9
|
|
|
10
10
|
NAME = "twitter_post_tweet"
|
|
@@ -23,7 +23,7 @@ class TwitterPostTweetInput(BaseModel):
|
|
|
23
23
|
description="Tweet text (280 chars for regular users, 25,000 bytes for verified)",
|
|
24
24
|
max_length=25000,
|
|
25
25
|
)
|
|
26
|
-
image:
|
|
26
|
+
image: str | None = Field(
|
|
27
27
|
default=None, description="Optional URL of an image to attach to the tweet"
|
|
28
28
|
)
|
|
29
29
|
|
|
@@ -41,36 +41,43 @@ class TwitterPostTweet(TwitterBaseTool):
|
|
|
41
41
|
|
|
42
42
|
name: str = NAME
|
|
43
43
|
description: str = PROMPT
|
|
44
|
-
args_schema:
|
|
44
|
+
args_schema: type[BaseModel] = TwitterPostTweetInput
|
|
45
45
|
|
|
46
46
|
async def _arun(
|
|
47
47
|
self,
|
|
48
48
|
text: str,
|
|
49
|
-
image:
|
|
49
|
+
image: str | None = None,
|
|
50
50
|
**kwargs,
|
|
51
51
|
):
|
|
52
|
+
context = self.get_context()
|
|
52
53
|
try:
|
|
53
|
-
context = self.get_context()
|
|
54
54
|
skill_config = context.agent.skill_config(self.category)
|
|
55
55
|
twitter = get_twitter_client(
|
|
56
56
|
agent_id=context.agent_id,
|
|
57
|
-
skill_store=self.skill_store,
|
|
58
57
|
config=skill_config,
|
|
59
58
|
)
|
|
60
59
|
client = await twitter.get_client()
|
|
61
60
|
|
|
62
61
|
# Check rate limit only when not using OAuth
|
|
63
62
|
if not twitter.use_key:
|
|
64
|
-
await self.check_rate_limit(
|
|
65
|
-
context.agent_id, max_requests=24, interval=1440
|
|
66
|
-
)
|
|
63
|
+
await self.check_rate_limit(max_requests=24, interval=1440)
|
|
67
64
|
|
|
68
65
|
media_ids = []
|
|
66
|
+
image_warning = ""
|
|
69
67
|
|
|
70
68
|
# Handle image upload if provided
|
|
71
69
|
if image:
|
|
72
|
-
#
|
|
73
|
-
|
|
70
|
+
# Validate image URL - must be from system's S3 CDN
|
|
71
|
+
aws_s3_cdn_url = config.aws_s3_cdn_url
|
|
72
|
+
if aws_s3_cdn_url and image.startswith(aws_s3_cdn_url):
|
|
73
|
+
# Use the TwitterClient method to upload the image
|
|
74
|
+
media_ids = await twitter.upload_media(context.agent_id, image)
|
|
75
|
+
else:
|
|
76
|
+
# Image is not from system's S3 CDN, skip upload but warn
|
|
77
|
+
image_warning = "Warning: The provided image URL is not from the system's S3 CDN and has been ignored. "
|
|
78
|
+
logger.warning(
|
|
79
|
+
f"Image URL validation failed for agent {context.agent_id}: {image}"
|
|
80
|
+
)
|
|
74
81
|
|
|
75
82
|
# Post tweet using tweepy client
|
|
76
83
|
tweet_params = {"text": text, "user_auth": twitter.use_key}
|
|
@@ -79,7 +86,11 @@ class TwitterPostTweet(TwitterBaseTool):
|
|
|
79
86
|
|
|
80
87
|
response = await client.create_tweet(**tweet_params)
|
|
81
88
|
if "data" in response and "id" in response["data"]:
|
|
82
|
-
|
|
89
|
+
# Return response with warning if image was ignored
|
|
90
|
+
result = (
|
|
91
|
+
f"{image_warning}Tweet posted successfully. Response: {response}"
|
|
92
|
+
)
|
|
93
|
+
return result
|
|
83
94
|
else:
|
|
84
95
|
logger.error(f"Error posting tweet: {str(response)}")
|
|
85
96
|
raise ToolException("Failed to post tweet.")
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import logging
|
|
2
|
-
from typing import Optional, Type
|
|
3
2
|
|
|
4
3
|
from langchain_core.tools import ToolException
|
|
5
4
|
from pydantic import BaseModel, Field
|
|
6
5
|
|
|
7
6
|
from intentkit.clients import get_twitter_client
|
|
7
|
+
from intentkit.config.config import config
|
|
8
8
|
from intentkit.skills.twitter.base import TwitterBaseTool
|
|
9
9
|
|
|
10
10
|
NAME = "twitter_reply_tweet"
|
|
@@ -24,7 +24,7 @@ class TwitterReplyTweetInput(BaseModel):
|
|
|
24
24
|
description="Tweet text (280 chars for regular users, 25,000 bytes for verified)",
|
|
25
25
|
max_length=25000,
|
|
26
26
|
)
|
|
27
|
-
image:
|
|
27
|
+
image: str | None = Field(
|
|
28
28
|
default=None, description="Optional URL of an image to attach to the reply"
|
|
29
29
|
)
|
|
30
30
|
|
|
@@ -42,37 +42,44 @@ class TwitterReplyTweet(TwitterBaseTool):
|
|
|
42
42
|
|
|
43
43
|
name: str = NAME
|
|
44
44
|
description: str = PROMPT
|
|
45
|
-
args_schema:
|
|
45
|
+
args_schema: type[BaseModel] = TwitterReplyTweetInput
|
|
46
46
|
|
|
47
47
|
async def _arun(
|
|
48
48
|
self,
|
|
49
49
|
tweet_id: str,
|
|
50
50
|
text: str,
|
|
51
|
-
image:
|
|
51
|
+
image: str | None = None,
|
|
52
52
|
**kwargs,
|
|
53
53
|
):
|
|
54
|
+
context = self.get_context()
|
|
54
55
|
try:
|
|
55
|
-
context = self.get_context()
|
|
56
56
|
skill_config = context.agent.skill_config(self.category)
|
|
57
57
|
twitter = get_twitter_client(
|
|
58
58
|
agent_id=context.agent_id,
|
|
59
|
-
skill_store=self.skill_store,
|
|
60
59
|
config=skill_config,
|
|
61
60
|
)
|
|
62
61
|
client = await twitter.get_client()
|
|
63
62
|
|
|
64
63
|
# Check rate limit only when not using OAuth
|
|
65
64
|
if not twitter.use_key:
|
|
66
|
-
await self.check_rate_limit(
|
|
67
|
-
context.agent_id, max_requests=48, interval=1440
|
|
68
|
-
)
|
|
65
|
+
await self.check_rate_limit(max_requests=48, interval=1440)
|
|
69
66
|
|
|
70
67
|
media_ids = []
|
|
68
|
+
image_warning = ""
|
|
71
69
|
|
|
72
70
|
# Handle image upload if provided
|
|
73
71
|
if image:
|
|
74
|
-
#
|
|
75
|
-
|
|
72
|
+
# Validate image URL - must be from system's S3 CDN
|
|
73
|
+
aws_s3_cdn_url = config.aws_s3_cdn_url
|
|
74
|
+
if aws_s3_cdn_url and image.startswith(aws_s3_cdn_url):
|
|
75
|
+
# Use the TwitterClient method to upload the image
|
|
76
|
+
media_ids = await twitter.upload_media(context.agent_id, image)
|
|
77
|
+
else:
|
|
78
|
+
# Image is not from system's S3 CDN, skip upload but warn
|
|
79
|
+
image_warning = "Warning: The provided image URL is not from the system's S3 CDN and has been ignored. "
|
|
80
|
+
logger.warning(
|
|
81
|
+
f"Image URL validation failed for agent {context.agent_id}: {image}"
|
|
82
|
+
)
|
|
76
83
|
|
|
77
84
|
# Post reply tweet using tweepy client
|
|
78
85
|
tweet_params = {
|
|
@@ -87,7 +94,9 @@ class TwitterReplyTweet(TwitterBaseTool):
|
|
|
87
94
|
response = await client.create_tweet(**tweet_params)
|
|
88
95
|
|
|
89
96
|
if "data" in response and "id" in response["data"]:
|
|
90
|
-
|
|
97
|
+
# Return response with warning if image was ignored
|
|
98
|
+
result = f"{image_warning}Reply tweet posted successfully. Response: {response}"
|
|
99
|
+
return result
|
|
91
100
|
else:
|
|
92
101
|
logger.error(f"Error replying to tweet: {str(response)}")
|
|
93
102
|
raise ToolException("Failed to post reply tweet.")
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import logging
|
|
2
|
-
from typing import Type
|
|
3
2
|
|
|
4
3
|
from langchain_core.tools import ToolException
|
|
5
4
|
from pydantic import BaseModel, Field
|
|
@@ -32,24 +31,21 @@ class TwitterRetweet(TwitterBaseTool):
|
|
|
32
31
|
|
|
33
32
|
name: str = NAME
|
|
34
33
|
description: str = PROMPT
|
|
35
|
-
args_schema:
|
|
34
|
+
args_schema: type[BaseModel] = TwitterRetweetInput
|
|
36
35
|
|
|
37
36
|
async def _arun(self, tweet_id: str, **kwargs):
|
|
37
|
+
context = self.get_context()
|
|
38
38
|
try:
|
|
39
|
-
context = self.get_context()
|
|
40
39
|
skill_config = context.agent.skill_config(self.category)
|
|
41
40
|
twitter = get_twitter_client(
|
|
42
41
|
agent_id=context.agent_id,
|
|
43
|
-
skill_store=self.skill_store,
|
|
44
42
|
config=skill_config,
|
|
45
43
|
)
|
|
46
44
|
client = await twitter.get_client()
|
|
47
45
|
|
|
48
46
|
# Check rate limit only when not using OAuth
|
|
49
47
|
if not twitter.use_key:
|
|
50
|
-
await self.check_rate_limit(
|
|
51
|
-
context.agent_id, max_requests=5, interval=15
|
|
52
|
-
)
|
|
48
|
+
await self.check_rate_limit(max_requests=5, interval=15)
|
|
53
49
|
|
|
54
50
|
# Get authenticated user's ID
|
|
55
51
|
user_id = twitter.self_id
|
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
"description": "Integration with X API enabling social media interactions including retrieving posts, mentions, user information, and posting content with media support",
|
|
6
6
|
"x-icon": "https://ai.service.crestal.dev/skills/twitter/twitter.png",
|
|
7
7
|
"x-tags": [
|
|
8
|
+
"Communication",
|
|
8
9
|
"Social"
|
|
9
10
|
],
|
|
10
11
|
"properties": {
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import datetime
|
|
2
2
|
import logging
|
|
3
|
-
from typing import Type
|
|
4
3
|
|
|
5
4
|
from pydantic import BaseModel, Field
|
|
6
5
|
|
|
@@ -33,30 +32,25 @@ class TwitterSearchTweets(TwitterBaseTool):
|
|
|
33
32
|
|
|
34
33
|
name: str = NAME
|
|
35
34
|
description: str = PROMPT
|
|
36
|
-
args_schema:
|
|
35
|
+
args_schema: type[BaseModel] = TwitterSearchTweetsInput
|
|
37
36
|
|
|
38
37
|
async def _arun(self, query: str, **kwargs):
|
|
38
|
+
context = self.get_context()
|
|
39
39
|
max_results = 10
|
|
40
40
|
try:
|
|
41
|
-
context = self.get_context()
|
|
42
41
|
skill_config = context.agent.skill_config(self.category)
|
|
43
42
|
twitter = get_twitter_client(
|
|
44
43
|
agent_id=context.agent_id,
|
|
45
|
-
skill_store=self.skill_store,
|
|
46
44
|
config=skill_config,
|
|
47
45
|
)
|
|
48
46
|
client = await twitter.get_client()
|
|
49
47
|
|
|
50
48
|
# Check rate limit only when not using OAuth
|
|
51
49
|
if not twitter.use_key:
|
|
52
|
-
await self.check_rate_limit(
|
|
53
|
-
context.agent_id, max_requests=1, interval=15
|
|
54
|
-
)
|
|
50
|
+
await self.check_rate_limit(max_requests=1, interval=15)
|
|
55
51
|
|
|
56
52
|
# Get since_id from store to avoid duplicate results
|
|
57
|
-
last = await self.
|
|
58
|
-
context.agent_id, self.name, query
|
|
59
|
-
)
|
|
53
|
+
last = await self.get_agent_skill_data(query)
|
|
60
54
|
last = last or {}
|
|
61
55
|
since_id = last.get("since_id")
|
|
62
56
|
|
|
@@ -104,9 +98,7 @@ class TwitterSearchTweets(TwitterBaseTool):
|
|
|
104
98
|
if tweets.get("meta") and tweets.get("meta").get("newest_id"):
|
|
105
99
|
last["since_id"] = tweets["meta"]["newest_id"]
|
|
106
100
|
last["timestamp"] = datetime.datetime.now().isoformat()
|
|
107
|
-
await self.
|
|
108
|
-
context.agent_id, self.name, query, last
|
|
109
|
-
)
|
|
101
|
+
await self.save_agent_skill_data(query, last)
|
|
110
102
|
|
|
111
103
|
return tweets
|
|
112
104
|
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
from typing import TypedDict
|
|
2
2
|
|
|
3
|
-
from intentkit.abstracts.skill import SkillStoreABC
|
|
4
3
|
from intentkit.skills.base import SkillConfig, SkillState
|
|
5
4
|
from intentkit.skills.unrealspeech.base import UnrealSpeechBaseTool
|
|
6
5
|
from intentkit.skills.unrealspeech.text_to_speech import TextToSpeech
|
|
@@ -23,7 +22,6 @@ class Config(SkillConfig):
|
|
|
23
22
|
async def get_skills(
|
|
24
23
|
config: "Config",
|
|
25
24
|
is_private: bool,
|
|
26
|
-
store: SkillStoreABC,
|
|
27
25
|
**_,
|
|
28
26
|
) -> list[UnrealSpeechBaseTool]:
|
|
29
27
|
"""Get all UnrealSpeech tools."""
|
|
@@ -37,19 +35,16 @@ async def get_skills(
|
|
|
37
35
|
available_skills.append(skill_name)
|
|
38
36
|
|
|
39
37
|
# Get each skill using the cached getter
|
|
40
|
-
return [get_unrealspeech_skill(name
|
|
38
|
+
return [get_unrealspeech_skill(name) for name in available_skills]
|
|
41
39
|
|
|
42
40
|
|
|
43
41
|
def get_unrealspeech_skill(
|
|
44
42
|
name: str,
|
|
45
|
-
store: SkillStoreABC,
|
|
46
43
|
) -> UnrealSpeechBaseTool:
|
|
47
44
|
"""Get an UnrealSpeech skill by name."""
|
|
48
45
|
if name == "text_to_speech":
|
|
49
46
|
if name not in _cache:
|
|
50
|
-
_cache[name] = TextToSpeech(
|
|
51
|
-
skill_store=store,
|
|
52
|
-
)
|
|
47
|
+
_cache[name] = TextToSpeech()
|
|
53
48
|
return _cache[name]
|
|
54
49
|
else:
|
|
55
50
|
raise ValueError(f"Unknown UnrealSpeech skill: {name}")
|
|
@@ -1,9 +1,6 @@
|
|
|
1
|
-
from
|
|
2
|
-
|
|
3
|
-
from langchain.tools.base import ToolException
|
|
1
|
+
from langchain_core.tools.base import ToolException
|
|
4
2
|
from pydantic import BaseModel, Field
|
|
5
3
|
|
|
6
|
-
from intentkit.abstracts.skill import SkillStoreABC
|
|
7
4
|
from intentkit.skills.base import IntentKitSkill
|
|
8
5
|
|
|
9
6
|
|
|
@@ -12,10 +9,7 @@ class UnrealSpeechBaseTool(IntentKitSkill):
|
|
|
12
9
|
|
|
13
10
|
name: str = Field(description="The name of the tool")
|
|
14
11
|
description: str = Field(description="A description of what the tool does")
|
|
15
|
-
args_schema:
|
|
16
|
-
skill_store: SkillStoreABC = Field(
|
|
17
|
-
description="The skill store for persisting data"
|
|
18
|
-
)
|
|
12
|
+
args_schema: type[BaseModel]
|
|
19
13
|
|
|
20
14
|
def get_api_key(self) -> str:
|
|
21
15
|
context = self.get_context()
|
|
@@ -5,10 +5,7 @@
|
|
|
5
5
|
"description": "Convert text to natural-sounding speech with various voices and customization options",
|
|
6
6
|
"x-icon": "https://ai.service.crestal.dev/skills/unrealspeech/unrealspeech.jpg",
|
|
7
7
|
"x-tags": [
|
|
8
|
-
"Audio"
|
|
9
|
-
"Speech",
|
|
10
|
-
"Text-to-Speech",
|
|
11
|
-
"Voice"
|
|
8
|
+
"Audio"
|
|
12
9
|
],
|
|
13
10
|
"properties": {
|
|
14
11
|
"enabled": {
|
|
@@ -97,4 +94,4 @@
|
|
|
97
94
|
}
|
|
98
95
|
},
|
|
99
96
|
"additionalProperties": true
|
|
100
|
-
}
|
|
97
|
+
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import logging
|
|
2
2
|
import os
|
|
3
|
-
from typing import Any,
|
|
3
|
+
from typing import Any, Literal
|
|
4
4
|
|
|
5
5
|
import httpx
|
|
6
6
|
from langchain_core.callbacks.manager import CallbackManagerForToolRun
|
|
@@ -31,7 +31,7 @@ class TextToSpeechInput(BaseModel):
|
|
|
31
31
|
default=0.0,
|
|
32
32
|
)
|
|
33
33
|
|
|
34
|
-
timestamp_type:
|
|
34
|
+
timestamp_type: Literal["word", "sentence"] | None = Field(
|
|
35
35
|
description="The type of timestamps to include in the response. 'word' for word-level timestamps, 'sentence' for sentence-level, or None for no timestamps.",
|
|
36
36
|
default="word",
|
|
37
37
|
)
|
|
@@ -52,9 +52,9 @@ class TextToSpeech(UnrealSpeechBaseTool):
|
|
|
52
52
|
"Returns URLs to the generated audio file and word-level timestamps.\n"
|
|
53
53
|
"Provides various voice options and speech customization parameters."
|
|
54
54
|
)
|
|
55
|
-
args_schema:
|
|
55
|
+
args_schema: type[BaseModel] = TextToSpeechInput
|
|
56
56
|
|
|
57
|
-
def get_env_var(self, env_var_name: str) ->
|
|
57
|
+
def get_env_var(self, env_var_name: str) -> str | None:
|
|
58
58
|
"""Helper method to get environment variables."""
|
|
59
59
|
return os.environ.get(env_var_name)
|
|
60
60
|
|
|
@@ -64,11 +64,11 @@ class TextToSpeech(UnrealSpeechBaseTool):
|
|
|
64
64
|
voice_id: str = "af_sarah",
|
|
65
65
|
bitrate: str = "192k",
|
|
66
66
|
speed: float = 0.0,
|
|
67
|
-
timestamp_type:
|
|
68
|
-
config:
|
|
69
|
-
run_manager:
|
|
67
|
+
timestamp_type: Literal["word", "sentence"] | None = "word",
|
|
68
|
+
config: Any | None = None,
|
|
69
|
+
run_manager: CallbackManagerForToolRun | None = None,
|
|
70
70
|
**kwargs,
|
|
71
|
-
) ->
|
|
71
|
+
) -> dict[str, Any]:
|
|
72
72
|
"""Run the tool to convert text to speech."""
|
|
73
73
|
|
|
74
74
|
# Get the API key from context config if available
|