intentkit 0.8.6.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 +10 -5
- intentkit/abstracts/skill.py +6 -144
- intentkit/abstracts/twitter.py +4 -5
- intentkit/clients/__init__.py +3 -2
- intentkit/clients/cdp.py +53 -92
- intentkit/clients/twitter.py +56 -57
- intentkit/clients/web3.py +1 -3
- intentkit/config/config.py +5 -0
- intentkit/core/agent.py +16 -388
- intentkit/core/asset.py +64 -18
- intentkit/core/client.py +1 -1
- intentkit/core/credit.py +19 -20
- intentkit/core/engine.py +26 -11
- intentkit/core/node.py +2 -1
- intentkit/core/prompt.py +53 -15
- intentkit/core/scheduler.py +9 -9
- intentkit/core/statistics.py +6 -7
- intentkit/models/agent.py +256 -176
- intentkit/models/agent_data.py +62 -36
- intentkit/models/agent_schema.json +6 -9
- intentkit/models/app_setting.py +6 -6
- intentkit/models/chat.py +28 -24
- intentkit/models/conversation.py +8 -8
- intentkit/models/credit.py +62 -64
- intentkit/models/db.py +8 -7
- intentkit/models/db_mig.py +2 -2
- intentkit/models/llm.csv +15 -12
- intentkit/models/llm.py +18 -16
- intentkit/models/redis.py +2 -3
- intentkit/models/skill.py +62 -66
- intentkit/models/skills.csv +30 -26
- intentkit/models/user.py +46 -21
- intentkit/skills/acolyt/__init__.py +2 -9
- intentkit/skills/acolyt/ask.py +3 -4
- intentkit/skills/acolyt/base.py +4 -9
- intentkit/skills/aixbt/__init__.py +2 -13
- intentkit/skills/aixbt/base.py +1 -7
- intentkit/skills/aixbt/projects.py +14 -15
- intentkit/skills/allora/__init__.py +2 -9
- intentkit/skills/allora/base.py +4 -9
- intentkit/skills/allora/price.py +3 -4
- intentkit/skills/base.py +175 -52
- intentkit/skills/basename/__init__.py +4 -8
- 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/token_info_and_price.py +5 -5
- intentkit/skills/casino/__init__.py +4 -15
- intentkit/skills/casino/base.py +1 -7
- intentkit/skills/casino/deck_draw.py +5 -8
- intentkit/skills/casino/deck_shuffle.py +6 -6
- intentkit/skills/casino/dice_roll.py +2 -4
- intentkit/skills/cdp/__init__.py +3 -10
- intentkit/skills/cdp/base.py +1 -7
- intentkit/skills/cdp/schema.json +1 -17
- intentkit/skills/chainlist/__init__.py +2 -7
- intentkit/skills/chainlist/base.py +1 -7
- intentkit/skills/chainlist/chain_lookup.py +18 -18
- intentkit/skills/common/__init__.py +2 -9
- intentkit/skills/common/base.py +1 -7
- intentkit/skills/common/current_time.py +1 -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/search_accounts.py +9 -9
- intentkit/skills/cryptocompare/__init__.py +7 -24
- intentkit/skills/cryptocompare/api.py +2 -3
- intentkit/skills/cryptocompare/base.py +10 -24
- 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/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/dapplooker/__init__.py +2 -9
- intentkit/skills/dapplooker/base.py +4 -9
- intentkit/skills/dapplooker/dapplooker_token_data.py +7 -7
- intentkit/skills/defillama/__init__.py +24 -74
- intentkit/skills/defillama/api.py +6 -9
- intentkit/skills/defillama/base.py +8 -19
- 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/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/__init__.py +97 -102
- intentkit/skills/dexscreener/base.py +125 -130
- intentkit/skills/dexscreener/get_pair_info.py +4 -5
- intentkit/skills/dexscreener/get_token_pairs.py +4 -5
- intentkit/skills/dexscreener/get_tokens_info.py +7 -8
- intentkit/skills/dexscreener/model/search_token_response.py +80 -82
- intentkit/skills/dexscreener/search_token.py +182 -184
- intentkit/skills/dexscreener/utils.py +15 -14
- 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/elfa/__init__.py +5 -18
- intentkit/skills/elfa/base.py +10 -14
- intentkit/skills/elfa/mention.py +19 -21
- 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 +9 -15
- intentkit/skills/enso/best_yield.py +5 -7
- intentkit/skills/enso/networks.py +3 -9
- intentkit/skills/enso/prices.py +2 -4
- intentkit/skills/enso/route.py +6 -12
- intentkit/skills/enso/tokens.py +4 -16
- intentkit/skills/enso/wallet.py +6 -6
- intentkit/skills/erc20/__init__.py +5 -11
- intentkit/skills/erc721/__init__.py +5 -9
- intentkit/skills/firecrawl/__init__.py +5 -18
- intentkit/skills/firecrawl/base.py +4 -9
- intentkit/skills/firecrawl/clear.py +4 -8
- intentkit/skills/firecrawl/crawl.py +19 -19
- intentkit/skills/firecrawl/query.py +4 -3
- intentkit/skills/firecrawl/scrape.py +17 -22
- 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/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/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/lifi/__init__.py +5 -10
- intentkit/skills/lifi/base.py +1 -7
- intentkit/skills/lifi/token_execute.py +14 -17
- intentkit/skills/lifi/token_quote.py +7 -9
- intentkit/skills/lifi/utils.py +16 -16
- 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/morpho/__init__.py +5 -9
- intentkit/skills/nation/__init__.py +4 -9
- intentkit/skills/nation/base.py +5 -10
- intentkit/skills/nation/nft_check.py +3 -4
- 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 +32 -0
- intentkit/skills/portfolio/__init__.py +11 -35
- intentkit/skills/portfolio/base.py +33 -19
- 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 +4 -10
- intentkit/skills/skills.toml +4 -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/send_message.py +3 -5
- intentkit/skills/supabase/__init__.py +7 -23
- intentkit/skills/supabase/base.py +1 -7
- intentkit/skills/supabase/delete_data.py +4 -4
- intentkit/skills/supabase/fetch_data.py +12 -12
- intentkit/skills/supabase/insert_data.py +4 -4
- intentkit/skills/supabase/invoke_function.py +6 -6
- intentkit/skills/supabase/update_data.py +6 -6
- intentkit/skills/supabase/upsert_data.py +4 -4
- intentkit/skills/superfluid/__init__.py +5 -9
- 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/tavily/__init__.py +3 -12
- intentkit/skills/tavily/base.py +4 -9
- 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/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 +22 -34
- intentkit/skills/twitter/follow_user.py +2 -6
- intentkit/skills/twitter/get_mentions.py +5 -12
- intentkit/skills/twitter/get_timeline.py +4 -12
- intentkit/skills/twitter/get_user_by_username.py +2 -6
- intentkit/skills/twitter/get_user_tweets.py +5 -13
- intentkit/skills/twitter/like_tweet.py +2 -6
- intentkit/skills/twitter/post_tweet.py +6 -9
- intentkit/skills/twitter/reply_tweet.py +6 -9
- intentkit/skills/twitter/retweet.py +2 -6
- intentkit/skills/twitter/search_tweets.py +4 -12
- intentkit/skills/unrealspeech/__init__.py +2 -7
- intentkit/skills/unrealspeech/base.py +2 -8
- 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/venice_audio.py +7 -11
- 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/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/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 +5 -11
- intentkit/skills/wow/__init__.py +5 -11
- 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 +5 -5
- intentkit/skills/xmtp/price.py +6 -6
- intentkit/skills/xmtp/swap.py +6 -8
- intentkit/skills/xmtp/transfer.py +4 -6
- intentkit/utils/error.py +2 -2
- intentkit/utils/logging.py +2 -4
- intentkit/utils/s3.py +8 -9
- intentkit/utils/schema.py +100 -0
- intentkit/utils/slack_alert.py +7 -8
- {intentkit-0.8.6.dev2.dist-info → intentkit-0.8.17.dist-info}/METADATA +3 -4
- intentkit-0.8.17.dist-info/RECORD +466 -0
- intentkit/models/generator.py +0 -347
- intentkit-0.8.6.dev2.dist-info/RECORD +0 -457
- {intentkit-0.8.6.dev2.dist-info → intentkit-0.8.17.dist-info}/WHEEL +0 -0
- {intentkit-0.8.6.dev2.dist-info → intentkit-0.8.17.dist-info}/licenses/LICENSE +0 -0
intentkit/models/agent_data.py
CHANGED
|
@@ -1,7 +1,9 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
1
3
|
import logging
|
|
2
|
-
from datetime import
|
|
4
|
+
from datetime import UTC, datetime
|
|
3
5
|
from decimal import Decimal
|
|
4
|
-
from typing import Annotated, Any
|
|
6
|
+
from typing import Annotated, Any
|
|
5
7
|
|
|
6
8
|
from intentkit.models.base import Base
|
|
7
9
|
from intentkit.models.db import get_session
|
|
@@ -60,6 +62,9 @@ class AgentDataTable(Base):
|
|
|
60
62
|
telegram_id = Column(String, nullable=True, comment="Telegram user ID")
|
|
61
63
|
telegram_username = Column(String, nullable=True, comment="Telegram username")
|
|
62
64
|
telegram_name = Column(String, nullable=True, comment="Telegram display name")
|
|
65
|
+
discord_id = Column(String, nullable=True, comment="Discord user ID")
|
|
66
|
+
discord_username = Column(String, nullable=True, comment="Discord username")
|
|
67
|
+
discord_name = Column(String, nullable=True, comment="Discord display name")
|
|
63
68
|
error_message = Column(String, nullable=True, comment="Last error message")
|
|
64
69
|
api_key = Column(
|
|
65
70
|
String, nullable=True, unique=True, comment="API key for the agent"
|
|
@@ -77,7 +82,7 @@ class AgentDataTable(Base):
|
|
|
77
82
|
DateTime(timezone=True),
|
|
78
83
|
nullable=False,
|
|
79
84
|
server_default=func.now(),
|
|
80
|
-
onupdate=lambda: datetime.now(
|
|
85
|
+
onupdate=lambda: datetime.now(UTC),
|
|
81
86
|
comment="Timestamp when the agent data was last updated",
|
|
82
87
|
)
|
|
83
88
|
|
|
@@ -94,70 +99,70 @@ class AgentData(BaseModel):
|
|
|
94
99
|
),
|
|
95
100
|
]
|
|
96
101
|
evm_wallet_address: Annotated[
|
|
97
|
-
|
|
102
|
+
str | None,
|
|
98
103
|
PydanticField(
|
|
99
104
|
default=None,
|
|
100
105
|
description="EVM wallet address",
|
|
101
106
|
),
|
|
102
107
|
] = None
|
|
103
108
|
solana_wallet_address: Annotated[
|
|
104
|
-
|
|
109
|
+
str | None,
|
|
105
110
|
PydanticField(
|
|
106
111
|
default=None,
|
|
107
112
|
description="Solana wallet address",
|
|
108
113
|
),
|
|
109
114
|
] = None
|
|
110
115
|
cdp_wallet_data: Annotated[
|
|
111
|
-
|
|
116
|
+
str | None,
|
|
112
117
|
PydanticField(
|
|
113
118
|
default=None,
|
|
114
119
|
description="CDP wallet data",
|
|
115
120
|
),
|
|
116
121
|
] = None
|
|
117
122
|
twitter_id: Annotated[
|
|
118
|
-
|
|
123
|
+
str | None,
|
|
119
124
|
PydanticField(
|
|
120
125
|
default=None,
|
|
121
126
|
description="Twitter user ID",
|
|
122
127
|
),
|
|
123
128
|
] = None
|
|
124
129
|
twitter_username: Annotated[
|
|
125
|
-
|
|
130
|
+
str | None,
|
|
126
131
|
PydanticField(
|
|
127
132
|
default=None,
|
|
128
133
|
description="Twitter username",
|
|
129
134
|
),
|
|
130
135
|
] = None
|
|
131
136
|
twitter_name: Annotated[
|
|
132
|
-
|
|
137
|
+
str | None,
|
|
133
138
|
PydanticField(
|
|
134
139
|
default=None,
|
|
135
140
|
description="Twitter display name",
|
|
136
141
|
),
|
|
137
142
|
] = None
|
|
138
143
|
twitter_access_token: Annotated[
|
|
139
|
-
|
|
144
|
+
str | None,
|
|
140
145
|
PydanticField(
|
|
141
146
|
default=None,
|
|
142
147
|
description="Twitter access token",
|
|
143
148
|
),
|
|
144
149
|
] = None
|
|
145
150
|
twitter_access_token_expires_at: Annotated[
|
|
146
|
-
|
|
151
|
+
datetime | None,
|
|
147
152
|
PydanticField(
|
|
148
153
|
default=None,
|
|
149
154
|
description="Twitter access token expiration time",
|
|
150
155
|
),
|
|
151
156
|
] = None
|
|
152
157
|
twitter_refresh_token: Annotated[
|
|
153
|
-
|
|
158
|
+
str | None,
|
|
154
159
|
PydanticField(
|
|
155
160
|
default=None,
|
|
156
161
|
description="Twitter refresh token",
|
|
157
162
|
),
|
|
158
163
|
] = None
|
|
159
164
|
twitter_self_key_refreshed_at: Annotated[
|
|
160
|
-
|
|
165
|
+
datetime | None,
|
|
161
166
|
PydanticField(
|
|
162
167
|
default=None,
|
|
163
168
|
description="Twitter self-key userinfo last refresh time",
|
|
@@ -171,42 +176,63 @@ class AgentData(BaseModel):
|
|
|
171
176
|
),
|
|
172
177
|
] = None
|
|
173
178
|
telegram_id: Annotated[
|
|
174
|
-
|
|
179
|
+
str | None,
|
|
175
180
|
PydanticField(
|
|
176
181
|
default=None,
|
|
177
182
|
description="Telegram user ID",
|
|
178
183
|
),
|
|
179
184
|
] = None
|
|
180
185
|
telegram_username: Annotated[
|
|
181
|
-
|
|
186
|
+
str | None,
|
|
182
187
|
PydanticField(
|
|
183
188
|
default=None,
|
|
184
189
|
description="Telegram username",
|
|
185
190
|
),
|
|
186
191
|
] = None
|
|
187
192
|
telegram_name: Annotated[
|
|
188
|
-
|
|
193
|
+
str | None,
|
|
189
194
|
PydanticField(
|
|
190
195
|
default=None,
|
|
191
196
|
description="Telegram display name",
|
|
192
197
|
),
|
|
193
198
|
] = None
|
|
199
|
+
discord_id: Annotated[
|
|
200
|
+
str | None,
|
|
201
|
+
PydanticField(
|
|
202
|
+
default=None,
|
|
203
|
+
description="Discord user ID",
|
|
204
|
+
),
|
|
205
|
+
] = None
|
|
206
|
+
discord_username: Annotated[
|
|
207
|
+
str | None,
|
|
208
|
+
PydanticField(
|
|
209
|
+
default=None,
|
|
210
|
+
description="Discord username",
|
|
211
|
+
),
|
|
212
|
+
] = None
|
|
213
|
+
discord_name: Annotated[
|
|
214
|
+
str | None,
|
|
215
|
+
PydanticField(
|
|
216
|
+
default=None,
|
|
217
|
+
description="Discord display name",
|
|
218
|
+
),
|
|
219
|
+
] = None
|
|
194
220
|
error_message: Annotated[
|
|
195
|
-
|
|
221
|
+
str | None,
|
|
196
222
|
PydanticField(
|
|
197
223
|
default=None,
|
|
198
224
|
description="Last error message",
|
|
199
225
|
),
|
|
200
226
|
] = None
|
|
201
227
|
api_key: Annotated[
|
|
202
|
-
|
|
228
|
+
str | None,
|
|
203
229
|
PydanticField(
|
|
204
230
|
default=None,
|
|
205
231
|
description="API key for the agent",
|
|
206
232
|
),
|
|
207
233
|
] = None
|
|
208
234
|
api_key_public: Annotated[
|
|
209
|
-
|
|
235
|
+
str | None,
|
|
210
236
|
PydanticField(
|
|
211
237
|
default=None,
|
|
212
238
|
description="Public API key for the agent",
|
|
@@ -215,14 +241,14 @@ class AgentData(BaseModel):
|
|
|
215
241
|
created_at: Annotated[
|
|
216
242
|
datetime,
|
|
217
243
|
PydanticField(
|
|
218
|
-
default_factory=lambda: datetime.now(
|
|
244
|
+
default_factory=lambda: datetime.now(UTC),
|
|
219
245
|
description="Timestamp when the agent data was created",
|
|
220
246
|
),
|
|
221
247
|
]
|
|
222
248
|
updated_at: Annotated[
|
|
223
249
|
datetime,
|
|
224
250
|
PydanticField(
|
|
225
|
-
default_factory=lambda: datetime.now(
|
|
251
|
+
default_factory=lambda: datetime.now(UTC),
|
|
226
252
|
description="Timestamp when the agent data was last updated",
|
|
227
253
|
),
|
|
228
254
|
]
|
|
@@ -247,7 +273,7 @@ class AgentData(BaseModel):
|
|
|
247
273
|
return cls.model_construct(id=agent_id)
|
|
248
274
|
|
|
249
275
|
@classmethod
|
|
250
|
-
async def get_by_api_key(cls, api_key: str) ->
|
|
276
|
+
async def get_by_api_key(cls, api_key: str) -> AgentData | None:
|
|
251
277
|
"""Get agent data by API key.
|
|
252
278
|
|
|
253
279
|
Args:
|
|
@@ -356,7 +382,7 @@ class AgentPluginDataTable(Base):
|
|
|
356
382
|
DateTime(timezone=True),
|
|
357
383
|
nullable=False,
|
|
358
384
|
server_default=func.now(),
|
|
359
|
-
onupdate=lambda: datetime.now(
|
|
385
|
+
onupdate=lambda: datetime.now(UTC),
|
|
360
386
|
)
|
|
361
387
|
|
|
362
388
|
|
|
@@ -388,28 +414,28 @@ class AgentPluginData(BaseModel):
|
|
|
388
414
|
PydanticField(description="Key for this specific piece of data"),
|
|
389
415
|
]
|
|
390
416
|
data: Annotated[
|
|
391
|
-
|
|
417
|
+
dict[str, Any],
|
|
392
418
|
PydanticField(default=None, description="JSON data stored for this key"),
|
|
393
419
|
]
|
|
394
420
|
created_at: Annotated[
|
|
395
421
|
datetime,
|
|
396
422
|
PydanticField(
|
|
397
423
|
description="Timestamp when this data was created",
|
|
398
|
-
default_factory=lambda: datetime.now(
|
|
424
|
+
default_factory=lambda: datetime.now(UTC),
|
|
399
425
|
),
|
|
400
426
|
]
|
|
401
427
|
updated_at: Annotated[
|
|
402
428
|
datetime,
|
|
403
429
|
PydanticField(
|
|
404
430
|
description="Timestamp when this data was last updated",
|
|
405
|
-
default_factory=lambda: datetime.now(
|
|
431
|
+
default_factory=lambda: datetime.now(UTC),
|
|
406
432
|
),
|
|
407
433
|
]
|
|
408
434
|
|
|
409
435
|
@classmethod
|
|
410
436
|
async def get(
|
|
411
437
|
cls, agent_id: str, plugin: str, key: str
|
|
412
|
-
) ->
|
|
438
|
+
) -> "AgentPluginData" | None:
|
|
413
439
|
"""Get plugin data for an agent.
|
|
414
440
|
|
|
415
441
|
Args:
|
|
@@ -513,7 +539,7 @@ class AgentQuotaTable(Base):
|
|
|
513
539
|
DateTime(timezone=True),
|
|
514
540
|
nullable=False,
|
|
515
541
|
server_default=func.now(),
|
|
516
|
-
onupdate=lambda: datetime.now(
|
|
542
|
+
onupdate=lambda: datetime.now(UTC),
|
|
517
543
|
)
|
|
518
544
|
|
|
519
545
|
|
|
@@ -547,7 +573,7 @@ class AgentQuota(BaseModel):
|
|
|
547
573
|
int, PydanticField(default=99999999, description="Daily message limit")
|
|
548
574
|
]
|
|
549
575
|
last_message_time: Annotated[
|
|
550
|
-
|
|
576
|
+
datetime | None,
|
|
551
577
|
PydanticField(default=None, description="Last message timestamp"),
|
|
552
578
|
]
|
|
553
579
|
autonomous_count_total: Annotated[
|
|
@@ -578,7 +604,7 @@ class AgentQuota(BaseModel):
|
|
|
578
604
|
),
|
|
579
605
|
]
|
|
580
606
|
last_autonomous_time: Annotated[
|
|
581
|
-
|
|
607
|
+
datetime | None,
|
|
582
608
|
PydanticField(default=None, description="Last autonomous operation timestamp"),
|
|
583
609
|
]
|
|
584
610
|
twitter_count_total: Annotated[
|
|
@@ -603,7 +629,7 @@ class AgentQuota(BaseModel):
|
|
|
603
629
|
PydanticField(default=99999999, description="Daily Twitter operations limit"),
|
|
604
630
|
]
|
|
605
631
|
last_twitter_time: Annotated[
|
|
606
|
-
|
|
632
|
+
datetime | None,
|
|
607
633
|
PydanticField(default=None, description="Last Twitter operation timestamp"),
|
|
608
634
|
]
|
|
609
635
|
free_income_daily: Annotated[
|
|
@@ -638,14 +664,14 @@ class AgentQuota(BaseModel):
|
|
|
638
664
|
datetime,
|
|
639
665
|
PydanticField(
|
|
640
666
|
description="Timestamp when this quota was created",
|
|
641
|
-
default_factory=lambda: datetime.now(
|
|
667
|
+
default_factory=lambda: datetime.now(UTC),
|
|
642
668
|
),
|
|
643
669
|
]
|
|
644
670
|
updated_at: Annotated[
|
|
645
671
|
datetime,
|
|
646
672
|
PydanticField(
|
|
647
673
|
description="Timestamp when this quota was last updated",
|
|
648
|
-
default_factory=lambda: datetime.now(
|
|
674
|
+
default_factory=lambda: datetime.now(UTC),
|
|
649
675
|
),
|
|
650
676
|
]
|
|
651
677
|
|
|
@@ -770,7 +796,7 @@ class AgentQuota(BaseModel):
|
|
|
770
796
|
quota_record.message_count_total += 1
|
|
771
797
|
quota_record.message_count_monthly += 1
|
|
772
798
|
quota_record.message_count_daily += 1
|
|
773
|
-
quota_record.last_message_time = datetime.now(
|
|
799
|
+
quota_record.last_message_time = datetime.now(UTC)
|
|
774
800
|
db.add(quota_record)
|
|
775
801
|
await db.commit()
|
|
776
802
|
|
|
@@ -790,7 +816,7 @@ class AgentQuota(BaseModel):
|
|
|
790
816
|
# Update record
|
|
791
817
|
quota_record.autonomous_count_total += 1
|
|
792
818
|
quota_record.autonomous_count_monthly += 1
|
|
793
|
-
quota_record.last_autonomous_time = datetime.now(
|
|
819
|
+
quota_record.last_autonomous_time = datetime.now(UTC)
|
|
794
820
|
db.add(quota_record)
|
|
795
821
|
await db.commit()
|
|
796
822
|
|
|
@@ -811,7 +837,7 @@ class AgentQuota(BaseModel):
|
|
|
811
837
|
# Update record
|
|
812
838
|
quota_record.twitter_count_total += 1
|
|
813
839
|
quota_record.twitter_count_daily += 1
|
|
814
|
-
quota_record.last_twitter_time = datetime.now(
|
|
840
|
+
quota_record.last_twitter_time = datetime.now(UTC)
|
|
815
841
|
db.add(quota_record)
|
|
816
842
|
await db.commit()
|
|
817
843
|
|
|
@@ -158,7 +158,8 @@
|
|
|
158
158
|
"trim",
|
|
159
159
|
"summarize"
|
|
160
160
|
],
|
|
161
|
-
"x-group": "llm"
|
|
161
|
+
"x-group": "llm",
|
|
162
|
+
"x-advanced": true
|
|
162
163
|
},
|
|
163
164
|
"temperature": {
|
|
164
165
|
"title": "Temperature",
|
|
@@ -168,7 +169,8 @@
|
|
|
168
169
|
"minimum": 0.0,
|
|
169
170
|
"maximum": 1.5,
|
|
170
171
|
"x-group": "llm",
|
|
171
|
-
"x-step": 0.1
|
|
172
|
+
"x-step": 0.1,
|
|
173
|
+
"x-advanced": true
|
|
172
174
|
},
|
|
173
175
|
"frequency_penalty": {
|
|
174
176
|
"title": "Frequency Penalty",
|
|
@@ -346,16 +348,11 @@
|
|
|
346
348
|
"description": "Default Network, please note that some CDP Wallet native skills like swap only support the base network.",
|
|
347
349
|
"default": "base-mainnet",
|
|
348
350
|
"enum": [
|
|
351
|
+
"base-mainnet",
|
|
349
352
|
"ethereum-mainnet",
|
|
350
|
-
"ethereum-sepolia",
|
|
351
353
|
"polygon-mainnet",
|
|
352
|
-
"polygon-mumbai",
|
|
353
|
-
"base-mainnet",
|
|
354
|
-
"base-sepolia",
|
|
355
354
|
"arbitrum-mainnet",
|
|
356
|
-
"
|
|
357
|
-
"optimism-mainnet",
|
|
358
|
-
"optimism-sepolia"
|
|
355
|
+
"optimism-mainnet"
|
|
359
356
|
],
|
|
360
357
|
"x-group": "onchain"
|
|
361
358
|
}
|
intentkit/models/app_setting.py
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import time
|
|
2
|
-
from datetime import
|
|
2
|
+
from datetime import UTC, datetime
|
|
3
3
|
from decimal import ROUND_HALF_UP, Decimal
|
|
4
4
|
from enum import Enum
|
|
5
|
-
from typing import Annotated, Any
|
|
5
|
+
from typing import Annotated, Any
|
|
6
6
|
|
|
7
7
|
from intentkit.models.base import Base
|
|
8
8
|
from intentkit.models.db import get_session
|
|
@@ -33,7 +33,7 @@ DEFAULT_SYSTEM_MESSAGES = {
|
|
|
33
33
|
}
|
|
34
34
|
|
|
35
35
|
# In-memory cache for app settings
|
|
36
|
-
_cache:
|
|
36
|
+
_cache: dict[str, dict[str, Any]] = {}
|
|
37
37
|
_cache_ttl = 180 # 3 minutes in seconds
|
|
38
38
|
|
|
39
39
|
|
|
@@ -59,7 +59,7 @@ class AppSettingTable(Base):
|
|
|
59
59
|
DateTime(timezone=True),
|
|
60
60
|
nullable=False,
|
|
61
61
|
server_default=func.now(),
|
|
62
|
-
onupdate=lambda: datetime.now(
|
|
62
|
+
onupdate=lambda: datetime.now(UTC),
|
|
63
63
|
)
|
|
64
64
|
|
|
65
65
|
|
|
@@ -117,7 +117,7 @@ class PaymentSettings(BaseModel):
|
|
|
117
117
|
Field(default=False, description="Whether agent whitelist is enabled"),
|
|
118
118
|
]
|
|
119
119
|
agent_whitelist: Annotated[
|
|
120
|
-
|
|
120
|
+
list[str],
|
|
121
121
|
Field(default_factory=list, description="List of whitelisted agent IDs"),
|
|
122
122
|
]
|
|
123
123
|
|
|
@@ -133,7 +133,7 @@ class PaymentSettings(BaseModel):
|
|
|
133
133
|
"""Round decimal values to 4 decimal places."""
|
|
134
134
|
if isinstance(v, Decimal):
|
|
135
135
|
return v.quantize(Decimal("0.0001"), rounding=ROUND_HALF_UP)
|
|
136
|
-
elif isinstance(v,
|
|
136
|
+
elif isinstance(v, int | float):
|
|
137
137
|
return Decimal(str(v)).quantize(Decimal("0.0001"), rounding=ROUND_HALF_UP)
|
|
138
138
|
return v
|
|
139
139
|
|
intentkit/models/chat.py
CHANGED
|
@@ -1,7 +1,9 @@
|
|
|
1
|
-
from
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from datetime import UTC, datetime
|
|
2
4
|
from decimal import Decimal
|
|
3
5
|
from enum import Enum
|
|
4
|
-
from typing import Annotated,
|
|
6
|
+
from typing import Annotated, NotRequired, TypedDict
|
|
5
7
|
|
|
6
8
|
from epyxid import XID
|
|
7
9
|
from intentkit.models.app_setting import AppSetting, SystemMessageType
|
|
@@ -43,10 +45,12 @@ class AuthorType(str, Enum):
|
|
|
43
45
|
SKILL = "skill"
|
|
44
46
|
TELEGRAM = "telegram"
|
|
45
47
|
TWITTER = "twitter"
|
|
48
|
+
DISCORD = "discord"
|
|
46
49
|
WEB = "web"
|
|
47
50
|
SYSTEM = "system"
|
|
48
51
|
API = "api"
|
|
49
52
|
XMTP = "xmtp"
|
|
53
|
+
X402 = "x402"
|
|
50
54
|
|
|
51
55
|
|
|
52
56
|
class ChatMessageAttachment(TypedDict):
|
|
@@ -64,7 +68,7 @@ class ChatMessageAttachment(TypedDict):
|
|
|
64
68
|
),
|
|
65
69
|
]
|
|
66
70
|
url: Annotated[
|
|
67
|
-
|
|
71
|
+
str | None,
|
|
68
72
|
Field(
|
|
69
73
|
...,
|
|
70
74
|
description="URL of the attachment",
|
|
@@ -72,7 +76,7 @@ class ChatMessageAttachment(TypedDict):
|
|
|
72
76
|
),
|
|
73
77
|
]
|
|
74
78
|
json: Annotated[
|
|
75
|
-
|
|
79
|
+
dict | None,
|
|
76
80
|
Field(
|
|
77
81
|
None,
|
|
78
82
|
description="JSON data of the attachment",
|
|
@@ -113,7 +117,7 @@ class ChatMessageRequest(BaseModel):
|
|
|
113
117
|
),
|
|
114
118
|
]
|
|
115
119
|
app_id: Annotated[
|
|
116
|
-
|
|
120
|
+
str | None,
|
|
117
121
|
Field(
|
|
118
122
|
None,
|
|
119
123
|
description="Optional application identifier",
|
|
@@ -140,21 +144,21 @@ class ChatMessageRequest(BaseModel):
|
|
|
140
144
|
),
|
|
141
145
|
]
|
|
142
146
|
search_mode: Annotated[
|
|
143
|
-
|
|
147
|
+
bool | None,
|
|
144
148
|
Field(
|
|
145
149
|
None,
|
|
146
150
|
description="Optional flag to enable search mode",
|
|
147
151
|
),
|
|
148
152
|
]
|
|
149
153
|
super_mode: Annotated[
|
|
150
|
-
|
|
154
|
+
bool | None,
|
|
151
155
|
Field(
|
|
152
156
|
None,
|
|
153
157
|
description="Optional flag to enable super mode",
|
|
154
158
|
),
|
|
155
159
|
]
|
|
156
160
|
attachments: Annotated[
|
|
157
|
-
|
|
161
|
+
list[ChatMessageAttachment] | None,
|
|
158
162
|
Field(
|
|
159
163
|
None,
|
|
160
164
|
description="Optional list of attachments (links, images, or files)",
|
|
@@ -308,29 +312,29 @@ class ChatMessageCreate(BaseModel):
|
|
|
308
312
|
]
|
|
309
313
|
chat_id: Annotated[str, Field(description="ID of the chat this message belongs to")]
|
|
310
314
|
user_id: Annotated[
|
|
311
|
-
|
|
315
|
+
str | None,
|
|
312
316
|
Field(description="ID of the user this message belongs to or reply to"),
|
|
313
317
|
]
|
|
314
318
|
author_id: Annotated[str, Field(description="ID of the message author")]
|
|
315
319
|
author_type: Annotated[AuthorType, Field(description="Type of the message author")]
|
|
316
320
|
model: Annotated[
|
|
317
|
-
|
|
321
|
+
str | None, Field(None, description="LLM model used if applicable")
|
|
318
322
|
]
|
|
319
323
|
thread_type: Annotated[
|
|
320
|
-
|
|
324
|
+
AuthorType | None,
|
|
321
325
|
Field(None, description="Author Type of the message thread start"),
|
|
322
326
|
]
|
|
323
327
|
reply_to: Annotated[
|
|
324
|
-
|
|
328
|
+
str | None,
|
|
325
329
|
Field(None, description="ID of the message this message is a reply to"),
|
|
326
330
|
]
|
|
327
331
|
message: Annotated[str, Field(description="Content of the message")]
|
|
328
332
|
attachments: Annotated[
|
|
329
|
-
|
|
333
|
+
list[ChatMessageAttachment] | None,
|
|
330
334
|
Field(None, description="List of attachments in the message"),
|
|
331
335
|
]
|
|
332
336
|
skill_calls: Annotated[
|
|
333
|
-
|
|
337
|
+
list[ChatMessageSkillCall] | None,
|
|
334
338
|
Field(None, description="Skill call details"),
|
|
335
339
|
]
|
|
336
340
|
input_tokens: Annotated[
|
|
@@ -343,11 +347,11 @@ class ChatMessageCreate(BaseModel):
|
|
|
343
347
|
float, Field(0.0, description="Time cost for the message in seconds")
|
|
344
348
|
]
|
|
345
349
|
credit_event_id: Annotated[
|
|
346
|
-
|
|
350
|
+
str | None,
|
|
347
351
|
Field(None, description="ID of the credit event for this message"),
|
|
348
352
|
]
|
|
349
353
|
credit_cost: Annotated[
|
|
350
|
-
|
|
354
|
+
Decimal | None,
|
|
351
355
|
Field(None, description="Credit cost for the message in credits"),
|
|
352
356
|
]
|
|
353
357
|
cold_start_cost: Annotated[
|
|
@@ -355,19 +359,19 @@ class ChatMessageCreate(BaseModel):
|
|
|
355
359
|
Field(0.0, description="Cost for the cold start of the message in seconds"),
|
|
356
360
|
]
|
|
357
361
|
app_id: Annotated[
|
|
358
|
-
|
|
362
|
+
str | None,
|
|
359
363
|
Field(None, description="Optional application identifier"),
|
|
360
364
|
]
|
|
361
365
|
search_mode: Annotated[
|
|
362
|
-
|
|
366
|
+
bool | None,
|
|
363
367
|
Field(None, description="Optional flag to enable search mode"),
|
|
364
368
|
]
|
|
365
369
|
super_mode: Annotated[
|
|
366
|
-
|
|
370
|
+
bool | None,
|
|
367
371
|
Field(None, description="Optional flag to enable super mode"),
|
|
368
372
|
]
|
|
369
373
|
error_type: Annotated[
|
|
370
|
-
|
|
374
|
+
SystemMessageType | None,
|
|
371
375
|
Field(None, description="Optional error type, used when author_type is system"),
|
|
372
376
|
]
|
|
373
377
|
|
|
@@ -526,7 +530,7 @@ class ChatMessage(ChatMessageCreate):
|
|
|
526
530
|
return ChatMessage.model_validate(sanitized_data)
|
|
527
531
|
|
|
528
532
|
@classmethod
|
|
529
|
-
async def get(cls, message_id: str) ->
|
|
533
|
+
async def get(cls, message_id: str) -> ChatMessage | None:
|
|
530
534
|
async with get_session() as db:
|
|
531
535
|
raw = await db.get(ChatMessageTable, message_id)
|
|
532
536
|
if raw:
|
|
@@ -569,7 +573,7 @@ class ChatTable(Base):
|
|
|
569
573
|
DateTime(timezone=True),
|
|
570
574
|
nullable=False,
|
|
571
575
|
server_default=func.now(),
|
|
572
|
-
onupdate=lambda: datetime.now(
|
|
576
|
+
onupdate=lambda: datetime.now(UTC),
|
|
573
577
|
)
|
|
574
578
|
|
|
575
579
|
|
|
@@ -624,7 +628,7 @@ class Chat(ChatCreate):
|
|
|
624
628
|
]
|
|
625
629
|
|
|
626
630
|
@classmethod
|
|
627
|
-
async def get(cls, id: str) ->
|
|
631
|
+
async def get(cls, id: str) -> "Chat" | None:
|
|
628
632
|
"""Get a chat by its ID.
|
|
629
633
|
|
|
630
634
|
Args:
|
|
@@ -688,7 +692,7 @@ class Chat(ChatCreate):
|
|
|
688
692
|
return self
|
|
689
693
|
|
|
690
694
|
@classmethod
|
|
691
|
-
async def get_by_agent_user(cls, agent_id: str, user_id: str) ->
|
|
695
|
+
async def get_by_agent_user(cls, agent_id: str, user_id: str) -> list["Chat"]:
|
|
692
696
|
"""Get all chats for a specific agent and user.
|
|
693
697
|
|
|
694
698
|
Args:
|
intentkit/models/conversation.py
CHANGED
|
@@ -5,7 +5,7 @@ related to agent generation sessions.
|
|
|
5
5
|
"""
|
|
6
6
|
|
|
7
7
|
from datetime import datetime
|
|
8
|
-
from typing import Annotated
|
|
8
|
+
from typing import Annotated
|
|
9
9
|
|
|
10
10
|
from epyxid import XID
|
|
11
11
|
from intentkit.models.base import Base
|
|
@@ -103,7 +103,7 @@ class ConversationProjectCreate(BaseModel):
|
|
|
103
103
|
),
|
|
104
104
|
]
|
|
105
105
|
user_id: Annotated[
|
|
106
|
-
|
|
106
|
+
str | None,
|
|
107
107
|
Field(None, description="User ID associated with this project"),
|
|
108
108
|
]
|
|
109
109
|
|
|
@@ -144,7 +144,7 @@ class ConversationProject(ConversationProjectCreate):
|
|
|
144
144
|
]
|
|
145
145
|
|
|
146
146
|
@classmethod
|
|
147
|
-
async def get(cls, project_id: str) ->
|
|
147
|
+
async def get(cls, project_id: str) -> "ConversationProject" | None:
|
|
148
148
|
"""Get a conversation project by ID."""
|
|
149
149
|
async with get_session() as db:
|
|
150
150
|
result = await db.execute(
|
|
@@ -179,8 +179,8 @@ class ConversationProject(ConversationProjectCreate):
|
|
|
179
179
|
|
|
180
180
|
@classmethod
|
|
181
181
|
async def get_by_user(
|
|
182
|
-
cls, user_id:
|
|
183
|
-
) ->
|
|
182
|
+
cls, user_id: str | None = None, limit: int = 50
|
|
183
|
+
) -> list["ConversationProject"]:
|
|
184
184
|
"""Get conversation projects by user ID."""
|
|
185
185
|
async with get_session() as db:
|
|
186
186
|
query = select(ConversationProjectTable).order_by(
|
|
@@ -213,7 +213,7 @@ class ConversationMessageCreate(BaseModel):
|
|
|
213
213
|
role: Annotated[str, Field(description="Role of the message sender")]
|
|
214
214
|
content: Annotated[str, Field(description="Content of the message")]
|
|
215
215
|
message_metadata: Annotated[
|
|
216
|
-
|
|
216
|
+
dict | None,
|
|
217
217
|
Field(None, description="Additional metadata for the message"),
|
|
218
218
|
]
|
|
219
219
|
|
|
@@ -255,8 +255,8 @@ class ConversationMessage(ConversationMessageCreate):
|
|
|
255
255
|
|
|
256
256
|
@classmethod
|
|
257
257
|
async def get_by_project(
|
|
258
|
-
cls, project_id: str, user_id:
|
|
259
|
-
) ->
|
|
258
|
+
cls, project_id: str, user_id: str | None = None
|
|
259
|
+
) -> list["ConversationMessage"]:
|
|
260
260
|
"""Get conversation messages for a project."""
|
|
261
261
|
async with get_session() as db:
|
|
262
262
|
# First check if project exists and user has access
|