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
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
"""Casino skills for card games and dice rolling."""
|
|
2
|
+
|
|
3
|
+
import logging
|
|
4
|
+
from typing import TypedDict
|
|
5
|
+
|
|
6
|
+
from intentkit.skills.base import SkillConfig, SkillState
|
|
7
|
+
from intentkit.skills.casino.base import CasinoBaseTool
|
|
8
|
+
from intentkit.skills.casino.deck_draw import CasinoDeckDraw
|
|
9
|
+
from intentkit.skills.casino.deck_shuffle import CasinoDeckShuffle
|
|
10
|
+
from intentkit.skills.casino.dice_roll import CasinoDiceRoll
|
|
11
|
+
|
|
12
|
+
# Cache skills at the system level, because they are stateless
|
|
13
|
+
_cache: dict[str, CasinoBaseTool] = {}
|
|
14
|
+
|
|
15
|
+
logger = logging.getLogger(__name__)
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
class SkillStates(TypedDict):
|
|
19
|
+
deck_shuffle: SkillState
|
|
20
|
+
deck_draw: SkillState
|
|
21
|
+
dice_roll: SkillState
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
class Config(SkillConfig):
|
|
25
|
+
"""Configuration for Casino skills."""
|
|
26
|
+
|
|
27
|
+
states: SkillStates
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
async def get_skills(
|
|
31
|
+
config: "Config",
|
|
32
|
+
is_private: bool,
|
|
33
|
+
**_,
|
|
34
|
+
) -> list[CasinoBaseTool]:
|
|
35
|
+
"""Get all Casino skills.
|
|
36
|
+
|
|
37
|
+
Args:
|
|
38
|
+
config: The configuration for Casino skills.
|
|
39
|
+
is_private: Whether to include private skills.
|
|
40
|
+
|
|
41
|
+
Returns:
|
|
42
|
+
A list of Casino skills.
|
|
43
|
+
"""
|
|
44
|
+
available_skills = []
|
|
45
|
+
|
|
46
|
+
# Include skills based on their state
|
|
47
|
+
for skill_name, state in config["states"].items():
|
|
48
|
+
if state == "disabled":
|
|
49
|
+
continue
|
|
50
|
+
elif state == "public" or (state == "private" and is_private):
|
|
51
|
+
available_skills.append(skill_name)
|
|
52
|
+
|
|
53
|
+
# Get each skill using the cached getter
|
|
54
|
+
result = []
|
|
55
|
+
for name in available_skills:
|
|
56
|
+
skill = get_casino_skill(name)
|
|
57
|
+
if skill:
|
|
58
|
+
result.append(skill)
|
|
59
|
+
return result
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
def get_casino_skill(
|
|
63
|
+
name: str,
|
|
64
|
+
) -> CasinoBaseTool:
|
|
65
|
+
"""Get a Casino skill by name.
|
|
66
|
+
|
|
67
|
+
Args:
|
|
68
|
+
name: The name of the skill to get
|
|
69
|
+
|
|
70
|
+
Returns:
|
|
71
|
+
The requested Casino skill
|
|
72
|
+
"""
|
|
73
|
+
if name == "deck_shuffle":
|
|
74
|
+
if name not in _cache:
|
|
75
|
+
_cache[name] = CasinoDeckShuffle()
|
|
76
|
+
return _cache[name]
|
|
77
|
+
elif name == "deck_draw":
|
|
78
|
+
if name not in _cache:
|
|
79
|
+
_cache[name] = CasinoDeckDraw()
|
|
80
|
+
return _cache[name]
|
|
81
|
+
elif name == "dice_roll":
|
|
82
|
+
if name not in _cache:
|
|
83
|
+
_cache[name] = CasinoDiceRoll()
|
|
84
|
+
return _cache[name]
|
|
85
|
+
else:
|
|
86
|
+
raise ValueError(f"Unknown Casino skill: {name}")
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
"""Base class for Casino tools."""
|
|
2
|
+
|
|
3
|
+
from pydantic import BaseModel, Field
|
|
4
|
+
|
|
5
|
+
from intentkit.skills.base import IntentKitSkill
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
class CasinoBaseTool(IntentKitSkill):
|
|
9
|
+
"""Base class for Casino tools."""
|
|
10
|
+
|
|
11
|
+
name: str = Field(description="The name of the tool")
|
|
12
|
+
description: str = Field(description="A description of what the tool does")
|
|
13
|
+
args_schema: type[BaseModel]
|
|
14
|
+
|
|
15
|
+
@property
|
|
16
|
+
def category(self) -> str:
|
|
17
|
+
return "casino"
|
|
Binary file
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
"""Card drawing skill using Deck of Cards API."""
|
|
2
|
+
|
|
3
|
+
import logging
|
|
4
|
+
|
|
5
|
+
try:
|
|
6
|
+
import httpx
|
|
7
|
+
except ImportError:
|
|
8
|
+
raise ImportError(
|
|
9
|
+
"httpx is required for Casino skills. Install it with: pip install httpx"
|
|
10
|
+
)
|
|
11
|
+
from pydantic import BaseModel, Field
|
|
12
|
+
|
|
13
|
+
from intentkit.skills.casino.base import CasinoBaseTool
|
|
14
|
+
from intentkit.skills.casino.utils import (
|
|
15
|
+
CURRENT_DECK_KEY,
|
|
16
|
+
DECK_STORAGE_KEY,
|
|
17
|
+
ENDPOINTS,
|
|
18
|
+
RATE_LIMITS,
|
|
19
|
+
format_card_info,
|
|
20
|
+
validate_card_count,
|
|
21
|
+
)
|
|
22
|
+
|
|
23
|
+
NAME = "casino_deck_draw"
|
|
24
|
+
PROMPT = (
|
|
25
|
+
"Draw cards from the current deck. If no deck exists, a new one will be created. "
|
|
26
|
+
"Returns detailed card information including images."
|
|
27
|
+
)
|
|
28
|
+
|
|
29
|
+
logger = logging.getLogger(__name__)
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
class CasinoDeckDrawInput(BaseModel):
|
|
33
|
+
"""Input for CasinoDeckDraw tool."""
|
|
34
|
+
|
|
35
|
+
count: int = Field(default=1, description="Number of cards to draw (1-10)")
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
class CasinoDeckDraw(CasinoBaseTool):
|
|
39
|
+
"""Tool for drawing cards from a deck.
|
|
40
|
+
|
|
41
|
+
This tool uses the Deck of Cards API to draw cards from the current deck.
|
|
42
|
+
|
|
43
|
+
Attributes:
|
|
44
|
+
name: The name of the tool.
|
|
45
|
+
description: A description of what the tool does.
|
|
46
|
+
args_schema: The schema for the tool's input arguments.
|
|
47
|
+
"""
|
|
48
|
+
|
|
49
|
+
name: str = NAME
|
|
50
|
+
description: str = PROMPT
|
|
51
|
+
args_schema: type[BaseModel] = CasinoDeckDrawInput
|
|
52
|
+
|
|
53
|
+
async def _arun(self, count: int = 1, **kwargs) -> dict:
|
|
54
|
+
try:
|
|
55
|
+
context = self.get_context()
|
|
56
|
+
|
|
57
|
+
# Apply rate limit using built-in user_rate_limit method
|
|
58
|
+
rate_config = RATE_LIMITS["deck_draw"]
|
|
59
|
+
await self.user_rate_limit(
|
|
60
|
+
rate_config["max_requests"],
|
|
61
|
+
rate_config["interval"],
|
|
62
|
+
"deck_draw",
|
|
63
|
+
)
|
|
64
|
+
|
|
65
|
+
# Validate count
|
|
66
|
+
count = validate_card_count(count)
|
|
67
|
+
|
|
68
|
+
# Get current deck info
|
|
69
|
+
deck_info = await self.get_agent_skill_data_raw(
|
|
70
|
+
DECK_STORAGE_KEY, CURRENT_DECK_KEY
|
|
71
|
+
)
|
|
72
|
+
|
|
73
|
+
deck_id = "new" # Default to new deck
|
|
74
|
+
if deck_info and deck_info.get("deck_id"):
|
|
75
|
+
deck_id = deck_info["deck_id"]
|
|
76
|
+
|
|
77
|
+
# Build API URL
|
|
78
|
+
url = ENDPOINTS["deck_draw"].format(deck_id=deck_id)
|
|
79
|
+
params = {"count": count}
|
|
80
|
+
|
|
81
|
+
async with httpx.AsyncClient() as client:
|
|
82
|
+
response = await client.get(url, params=params)
|
|
83
|
+
|
|
84
|
+
if response.status_code == 200:
|
|
85
|
+
data = response.json()
|
|
86
|
+
|
|
87
|
+
if data.get("success"):
|
|
88
|
+
# Update deck info
|
|
89
|
+
if deck_id == "new":
|
|
90
|
+
deck_info = {
|
|
91
|
+
"deck_id": data["deck_id"],
|
|
92
|
+
"deck_count": 1,
|
|
93
|
+
"jokers_enabled": False,
|
|
94
|
+
"remaining": data["remaining"],
|
|
95
|
+
"shuffled": True,
|
|
96
|
+
}
|
|
97
|
+
else:
|
|
98
|
+
deck_info["remaining"] = data["remaining"]
|
|
99
|
+
|
|
100
|
+
await self.save_agent_skill_data_raw(
|
|
101
|
+
DECK_STORAGE_KEY,
|
|
102
|
+
CURRENT_DECK_KEY,
|
|
103
|
+
deck_info,
|
|
104
|
+
)
|
|
105
|
+
|
|
106
|
+
# Format card information with images
|
|
107
|
+
cards = [
|
|
108
|
+
format_card_info(card) for card in data.get("cards", [])
|
|
109
|
+
]
|
|
110
|
+
|
|
111
|
+
return {
|
|
112
|
+
"success": True,
|
|
113
|
+
"cards_drawn": cards,
|
|
114
|
+
"remaining_cards": data["remaining"],
|
|
115
|
+
"deck_id": data["deck_id"],
|
|
116
|
+
"message": f"Drew {len(cards)} card{'s' if len(cards) > 1 else ''} "
|
|
117
|
+
f"({data['remaining']} remaining)",
|
|
118
|
+
}
|
|
119
|
+
else:
|
|
120
|
+
return {"success": False, "error": "Failed to draw cards"}
|
|
121
|
+
else:
|
|
122
|
+
logger.error(f"Deck API error: {response.status_code}")
|
|
123
|
+
return {"success": False, "error": "Failed to draw cards"}
|
|
124
|
+
|
|
125
|
+
except Exception as e:
|
|
126
|
+
logger.error(f"Error drawing cards: {str(e)}")
|
|
127
|
+
raise type(e)(f"[agent:{context.agent_id}]: {e}") from e
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
"""Deck shuffling skill using Deck of Cards API."""
|
|
2
|
+
|
|
3
|
+
import logging
|
|
4
|
+
|
|
5
|
+
try:
|
|
6
|
+
import httpx
|
|
7
|
+
except ImportError:
|
|
8
|
+
raise ImportError(
|
|
9
|
+
"httpx is required for Casino skills. Install it with: pip install httpx"
|
|
10
|
+
)
|
|
11
|
+
from pydantic import BaseModel, Field
|
|
12
|
+
|
|
13
|
+
from intentkit.skills.casino.base import CasinoBaseTool
|
|
14
|
+
from intentkit.skills.casino.utils import (
|
|
15
|
+
CURRENT_DECK_KEY,
|
|
16
|
+
DECK_STORAGE_KEY,
|
|
17
|
+
ENDPOINTS,
|
|
18
|
+
RATE_LIMITS,
|
|
19
|
+
validate_deck_count,
|
|
20
|
+
)
|
|
21
|
+
|
|
22
|
+
NAME = "casino_deck_shuffle"
|
|
23
|
+
PROMPT = (
|
|
24
|
+
"Create and shuffle a new deck of cards. You can specify the number of decks "
|
|
25
|
+
"to use (default is 1) and optionally include jokers."
|
|
26
|
+
)
|
|
27
|
+
|
|
28
|
+
logger = logging.getLogger(__name__)
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
class CasinoDeckShuffleInput(BaseModel):
|
|
32
|
+
"""Input for CasinoDeckShuffle tool."""
|
|
33
|
+
|
|
34
|
+
deck_count: int = Field(
|
|
35
|
+
default=1, description="Number of decks to use (1-6, default 1)"
|
|
36
|
+
)
|
|
37
|
+
jokers_enabled: bool = Field(
|
|
38
|
+
default=False, description="Whether to include jokers in the deck"
|
|
39
|
+
)
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
class CasinoDeckShuffle(CasinoBaseTool):
|
|
43
|
+
"""Tool for creating and shuffling card decks.
|
|
44
|
+
|
|
45
|
+
This tool uses the Deck of Cards API to create new shuffled decks.
|
|
46
|
+
|
|
47
|
+
Attributes:
|
|
48
|
+
name: The name of the tool.
|
|
49
|
+
description: A description of what the tool does.
|
|
50
|
+
args_schema: The schema for the tool's input arguments.
|
|
51
|
+
"""
|
|
52
|
+
|
|
53
|
+
name: str = NAME
|
|
54
|
+
description: str = PROMPT
|
|
55
|
+
args_schema: type[BaseModel] = CasinoDeckShuffleInput
|
|
56
|
+
|
|
57
|
+
async def _arun(
|
|
58
|
+
self, deck_count: int = 1, jokers_enabled: bool = False, **kwargs
|
|
59
|
+
) -> dict:
|
|
60
|
+
try:
|
|
61
|
+
context = self.get_context()
|
|
62
|
+
|
|
63
|
+
# Apply rate limit using built-in user_rate_limit method
|
|
64
|
+
rate_config = RATE_LIMITS["deck_shuffle"]
|
|
65
|
+
await self.user_rate_limit(
|
|
66
|
+
rate_config["max_requests"],
|
|
67
|
+
rate_config["interval"],
|
|
68
|
+
"deck_shuffle",
|
|
69
|
+
)
|
|
70
|
+
|
|
71
|
+
# Validate deck count
|
|
72
|
+
deck_count = validate_deck_count(deck_count)
|
|
73
|
+
|
|
74
|
+
# Build API URL and parameters
|
|
75
|
+
url = ENDPOINTS["deck_new_shuffle"]
|
|
76
|
+
params = {"deck_count": deck_count}
|
|
77
|
+
|
|
78
|
+
if jokers_enabled:
|
|
79
|
+
params["jokers_enabled"] = "true"
|
|
80
|
+
|
|
81
|
+
async with httpx.AsyncClient() as client:
|
|
82
|
+
response = await client.get(url, params=params)
|
|
83
|
+
|
|
84
|
+
if response.status_code == 200:
|
|
85
|
+
data = response.json()
|
|
86
|
+
|
|
87
|
+
# Store deck info for the agent
|
|
88
|
+
deck_info = {
|
|
89
|
+
"deck_id": data["deck_id"],
|
|
90
|
+
"deck_count": deck_count,
|
|
91
|
+
"jokers_enabled": jokers_enabled,
|
|
92
|
+
"remaining": data["remaining"],
|
|
93
|
+
"shuffled": data["shuffled"],
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
await self.save_agent_skill_data_raw(
|
|
97
|
+
DECK_STORAGE_KEY,
|
|
98
|
+
CURRENT_DECK_KEY,
|
|
99
|
+
deck_info,
|
|
100
|
+
)
|
|
101
|
+
|
|
102
|
+
return {
|
|
103
|
+
"success": True,
|
|
104
|
+
"deck_id": data["deck_id"],
|
|
105
|
+
"deck_count": deck_count,
|
|
106
|
+
"jokers_enabled": jokers_enabled,
|
|
107
|
+
"remaining_cards": data["remaining"],
|
|
108
|
+
"message": f"Created and shuffled {'a new deck' if deck_count == 1 else f'{deck_count} decks'} "
|
|
109
|
+
f"with {data['remaining']} cards"
|
|
110
|
+
+ (" (including jokers)" if jokers_enabled else ""),
|
|
111
|
+
}
|
|
112
|
+
else:
|
|
113
|
+
logger.error(f"Deck API error: {response.status_code}")
|
|
114
|
+
return {"success": False, "error": "Failed to create deck"}
|
|
115
|
+
|
|
116
|
+
except Exception as e:
|
|
117
|
+
logger.error(f"Error shuffling deck: {str(e)}")
|
|
118
|
+
raise type(e)(f"[agent:{context.agent_id}]: {e}") from e
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
"""Quantum dice rolling skill using QRandom API."""
|
|
2
|
+
|
|
3
|
+
import logging
|
|
4
|
+
|
|
5
|
+
try:
|
|
6
|
+
import httpx
|
|
7
|
+
except ImportError:
|
|
8
|
+
raise ImportError(
|
|
9
|
+
"httpx is required for Casino skills. Install it with: pip install httpx"
|
|
10
|
+
)
|
|
11
|
+
from pydantic import BaseModel, Field
|
|
12
|
+
|
|
13
|
+
from intentkit.skills.casino.base import CasinoBaseTool
|
|
14
|
+
from intentkit.skills.casino.utils import (
|
|
15
|
+
ENDPOINTS,
|
|
16
|
+
RATE_LIMITS,
|
|
17
|
+
get_dice_visual,
|
|
18
|
+
validate_dice_count,
|
|
19
|
+
)
|
|
20
|
+
|
|
21
|
+
NAME = "casino_dice_roll"
|
|
22
|
+
PROMPT = (
|
|
23
|
+
"Roll quantum random dice using true quantum randomness. "
|
|
24
|
+
"Can roll multiple 6-sided dice at once for games."
|
|
25
|
+
)
|
|
26
|
+
|
|
27
|
+
logger = logging.getLogger(__name__)
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
class CasinoDiceRollInput(BaseModel):
|
|
31
|
+
"""Input for CasinoDiceRoll tool."""
|
|
32
|
+
|
|
33
|
+
dice_count: int = Field(default=1, description="Number of dice to roll (1-10)")
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
class CasinoDiceRoll(CasinoBaseTool):
|
|
37
|
+
"""Tool for rolling quantum random dice.
|
|
38
|
+
|
|
39
|
+
This tool uses the QRandom API to generate truly random dice rolls
|
|
40
|
+
using quantum randomness.
|
|
41
|
+
|
|
42
|
+
Attributes:
|
|
43
|
+
name: The name of the tool.
|
|
44
|
+
description: A description of what the tool does.
|
|
45
|
+
args_schema: The schema for the tool's input arguments.
|
|
46
|
+
"""
|
|
47
|
+
|
|
48
|
+
name: str = NAME
|
|
49
|
+
description: str = PROMPT
|
|
50
|
+
args_schema: type[BaseModel] = CasinoDiceRollInput
|
|
51
|
+
|
|
52
|
+
async def _arun(self, dice_count: int = 1, **kwargs) -> dict:
|
|
53
|
+
try:
|
|
54
|
+
context = self.get_context()
|
|
55
|
+
|
|
56
|
+
# Apply rate limit using built-in user_rate_limit method
|
|
57
|
+
rate_config = RATE_LIMITS["dice_roll"]
|
|
58
|
+
await self.user_rate_limit(
|
|
59
|
+
rate_config["max_requests"],
|
|
60
|
+
rate_config["interval"],
|
|
61
|
+
"dice_roll",
|
|
62
|
+
)
|
|
63
|
+
|
|
64
|
+
# Validate dice count
|
|
65
|
+
dice_count = validate_dice_count(dice_count)
|
|
66
|
+
|
|
67
|
+
# Build API URL
|
|
68
|
+
url = ENDPOINTS["dice_roll"]
|
|
69
|
+
params = {"n": dice_count}
|
|
70
|
+
|
|
71
|
+
async with httpx.AsyncClient() as client:
|
|
72
|
+
response = await client.get(url, params=params)
|
|
73
|
+
|
|
74
|
+
if response.status_code == 200:
|
|
75
|
+
data = response.json()
|
|
76
|
+
|
|
77
|
+
dice_results = data.get("dice", [])
|
|
78
|
+
total = sum(dice_results)
|
|
79
|
+
|
|
80
|
+
# Generate dice emoji representation
|
|
81
|
+
dice_visual = get_dice_visual(dice_results)
|
|
82
|
+
|
|
83
|
+
return {
|
|
84
|
+
"success": True,
|
|
85
|
+
"dice_results": dice_results,
|
|
86
|
+
"dice_visual": dice_visual,
|
|
87
|
+
"total": total,
|
|
88
|
+
"dice_count": len(dice_results),
|
|
89
|
+
"quantum_signature": data.get("signature", ""),
|
|
90
|
+
"quantum_id": data.get("id", ""),
|
|
91
|
+
"message": f"Rolled {len(dice_results)} dice: {' '.join(dice_visual)} "
|
|
92
|
+
f"(Total: {total})",
|
|
93
|
+
}
|
|
94
|
+
else:
|
|
95
|
+
logger.error(f"QRandom API error: {response.status_code}")
|
|
96
|
+
return {"success": False, "error": "Failed to roll dice"}
|
|
97
|
+
|
|
98
|
+
except Exception as e:
|
|
99
|
+
logger.error(f"Error rolling dice: {str(e)}")
|
|
100
|
+
raise type(e)(f"[agent:{context.agent_id}]: {e}") from e
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
3
|
+
"type": "object",
|
|
4
|
+
"title": "Casino",
|
|
5
|
+
"description": "Casino gaming skills including card decks and quantum dice rolling for interactive games with users",
|
|
6
|
+
"x-icon": "https://ai.service.crestal.dev/skills/casino/casino.png",
|
|
7
|
+
"x-tags": [
|
|
8
|
+
"Entertainment"
|
|
9
|
+
],
|
|
10
|
+
"properties": {
|
|
11
|
+
"enabled": {
|
|
12
|
+
"type": "boolean",
|
|
13
|
+
"title": "Enabled",
|
|
14
|
+
"description": "Whether this skill is enabled",
|
|
15
|
+
"default": false
|
|
16
|
+
},
|
|
17
|
+
"states": {
|
|
18
|
+
"type": "object",
|
|
19
|
+
"properties": {
|
|
20
|
+
"deck_shuffle": {
|
|
21
|
+
"type": "string",
|
|
22
|
+
"title": "Shuffle Card Deck",
|
|
23
|
+
"enum": [
|
|
24
|
+
"disabled",
|
|
25
|
+
"public",
|
|
26
|
+
"private"
|
|
27
|
+
],
|
|
28
|
+
"x-enum-title": [
|
|
29
|
+
"Disabled",
|
|
30
|
+
"Agent Owner + All Users",
|
|
31
|
+
"Agent Owner Only"
|
|
32
|
+
],
|
|
33
|
+
"description": "Create and shuffle new card decks with customizable options",
|
|
34
|
+
"default": "disabled"
|
|
35
|
+
},
|
|
36
|
+
"deck_draw": {
|
|
37
|
+
"type": "string",
|
|
38
|
+
"title": "Draw Cards",
|
|
39
|
+
"enum": [
|
|
40
|
+
"disabled",
|
|
41
|
+
"public",
|
|
42
|
+
"private"
|
|
43
|
+
],
|
|
44
|
+
"x-enum-title": [
|
|
45
|
+
"Disabled",
|
|
46
|
+
"Agent Owner + All Users",
|
|
47
|
+
"Agent Owner Only"
|
|
48
|
+
],
|
|
49
|
+
"description": "Draw cards from the current deck with detailed card information and images",
|
|
50
|
+
"default": "disabled"
|
|
51
|
+
},
|
|
52
|
+
"dice_roll": {
|
|
53
|
+
"type": "string",
|
|
54
|
+
"title": "Roll Quantum Dice",
|
|
55
|
+
"enum": [
|
|
56
|
+
"disabled",
|
|
57
|
+
"public",
|
|
58
|
+
"private"
|
|
59
|
+
],
|
|
60
|
+
"x-enum-title": [
|
|
61
|
+
"Disabled",
|
|
62
|
+
"Agent Owner + All Users",
|
|
63
|
+
"Agent Owner Only"
|
|
64
|
+
],
|
|
65
|
+
"description": "Roll dice using quantum random number generation for true randomness",
|
|
66
|
+
"default": "disabled"
|
|
67
|
+
}
|
|
68
|
+
},
|
|
69
|
+
"description": "States for each Casino skill"
|
|
70
|
+
}
|
|
71
|
+
},
|
|
72
|
+
"required": [
|
|
73
|
+
"states",
|
|
74
|
+
"enabled"
|
|
75
|
+
],
|
|
76
|
+
"additionalProperties": true
|
|
77
|
+
}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Casino Skills Utilities
|
|
3
|
+
|
|
4
|
+
Common constants, URLs, and helper functions for Casino skills.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
# API URLs
|
|
8
|
+
DECK_OF_CARDS_API_BASE = "https://www.deckofcardsapi.com/api/deck"
|
|
9
|
+
QRANDOM_API_BASE = "https://qrandom.io/api/random"
|
|
10
|
+
|
|
11
|
+
# API Endpoints
|
|
12
|
+
ENDPOINTS = {
|
|
13
|
+
"deck_new_shuffle": f"{DECK_OF_CARDS_API_BASE}/new/shuffle/",
|
|
14
|
+
"deck_draw": f"{DECK_OF_CARDS_API_BASE}/{{deck_id}}/draw/",
|
|
15
|
+
"dice_roll": f"{QRANDOM_API_BASE}/dice",
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
# Rate Limits (requests per minute)
|
|
19
|
+
RATE_LIMITS = {
|
|
20
|
+
"deck_shuffle": {"max_requests": 20, "interval": 60},
|
|
21
|
+
"deck_draw": {"max_requests": 30, "interval": 60},
|
|
22
|
+
"dice_roll": {"max_requests": 15, "interval": 60},
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
# Storage Keys
|
|
26
|
+
DECK_STORAGE_KEY = "casino_deck"
|
|
27
|
+
CURRENT_DECK_KEY = "current_deck"
|
|
28
|
+
|
|
29
|
+
# Dice visual representation
|
|
30
|
+
DICE_EMOJI = ["⚀", "⚁", "⚂", "⚃", "⚄", "⚅"]
|
|
31
|
+
|
|
32
|
+
# Card back image URL for display
|
|
33
|
+
CARD_BACK_IMAGE = "https://www.deckofcardsapi.com/static/img/back.png"
|
|
34
|
+
|
|
35
|
+
# Validation limits
|
|
36
|
+
MAX_DECK_COUNT = 6
|
|
37
|
+
MIN_DECK_COUNT = 1
|
|
38
|
+
MAX_CARDS_DRAW = 10
|
|
39
|
+
MIN_CARDS_DRAW = 1
|
|
40
|
+
MAX_DICE_COUNT = 10
|
|
41
|
+
MIN_DICE_COUNT = 1
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
def get_dice_visual(dice_results: list[int]) -> list[str]:
|
|
45
|
+
"""Convert dice numbers to emoji representation.
|
|
46
|
+
|
|
47
|
+
Args:
|
|
48
|
+
dice_results: List of dice roll results (1-6)
|
|
49
|
+
|
|
50
|
+
Returns:
|
|
51
|
+
List of dice emoji strings
|
|
52
|
+
"""
|
|
53
|
+
return [DICE_EMOJI[result - 1] for result in dice_results if 1 <= result <= 6]
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
def validate_deck_count(count: int) -> int:
|
|
57
|
+
"""Validate and normalize deck count.
|
|
58
|
+
|
|
59
|
+
Args:
|
|
60
|
+
count: Requested deck count
|
|
61
|
+
|
|
62
|
+
Returns:
|
|
63
|
+
Normalized deck count within valid range
|
|
64
|
+
"""
|
|
65
|
+
return max(MIN_DECK_COUNT, min(MAX_DECK_COUNT, count))
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
def validate_card_count(count: int) -> int:
|
|
69
|
+
"""Validate and normalize card draw count.
|
|
70
|
+
|
|
71
|
+
Args:
|
|
72
|
+
count: Requested card count
|
|
73
|
+
|
|
74
|
+
Returns:
|
|
75
|
+
Normalized card count within valid range
|
|
76
|
+
"""
|
|
77
|
+
return max(MIN_CARDS_DRAW, min(MAX_CARDS_DRAW, count))
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
def validate_dice_count(count: int) -> int:
|
|
81
|
+
"""Validate and normalize dice count.
|
|
82
|
+
|
|
83
|
+
Args:
|
|
84
|
+
count: Requested dice count
|
|
85
|
+
|
|
86
|
+
Returns:
|
|
87
|
+
Normalized dice count within valid range
|
|
88
|
+
"""
|
|
89
|
+
return max(MIN_DICE_COUNT, min(MAX_DICE_COUNT, count))
|
|
90
|
+
|
|
91
|
+
|
|
92
|
+
def format_card_info(card: dict) -> dict:
|
|
93
|
+
"""Format card information for consistent output.
|
|
94
|
+
|
|
95
|
+
Args:
|
|
96
|
+
card: Raw card data from Deck of Cards API
|
|
97
|
+
|
|
98
|
+
Returns:
|
|
99
|
+
Formatted card information
|
|
100
|
+
"""
|
|
101
|
+
return {
|
|
102
|
+
"value": card["value"],
|
|
103
|
+
"suit": card["suit"],
|
|
104
|
+
"code": card["code"],
|
|
105
|
+
"image": card["image"],
|
|
106
|
+
"svg_image": card["images"]["svg"],
|
|
107
|
+
}
|