intentkit 0.8.17.dev1__py3-none-any.whl → 0.8.17.dev2__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.

Files changed (272) hide show
  1. intentkit/__init__.py +1 -1
  2. intentkit/abstracts/agent.py +4 -5
  3. intentkit/abstracts/engine.py +5 -5
  4. intentkit/abstracts/graph.py +6 -5
  5. intentkit/abstracts/skill.py +5 -5
  6. intentkit/abstracts/twitter.py +4 -5
  7. intentkit/clients/cdp.py +19 -77
  8. intentkit/clients/twitter.py +26 -34
  9. intentkit/clients/web3.py +1 -3
  10. intentkit/config/config.py +4 -0
  11. intentkit/core/agent.py +15 -15
  12. intentkit/core/asset.py +1 -2
  13. intentkit/core/client.py +1 -1
  14. intentkit/core/credit.py +19 -20
  15. intentkit/core/engine.py +2 -4
  16. intentkit/core/node.py +2 -1
  17. intentkit/core/prompt.py +3 -4
  18. intentkit/core/scheduler.py +1 -1
  19. intentkit/core/statistics.py +6 -7
  20. intentkit/models/agent.py +125 -92
  21. intentkit/models/agent_data.py +62 -36
  22. intentkit/models/app_setting.py +6 -6
  23. intentkit/models/chat.py +27 -24
  24. intentkit/models/conversation.py +8 -8
  25. intentkit/models/credit.py +62 -64
  26. intentkit/models/db.py +8 -7
  27. intentkit/models/db_mig.py +2 -2
  28. intentkit/models/llm.py +12 -14
  29. intentkit/models/redis.py +2 -3
  30. intentkit/models/skill.py +25 -27
  31. intentkit/models/user.py +21 -22
  32. intentkit/skills/acolyt/ask.py +3 -4
  33. intentkit/skills/acolyt/base.py +1 -3
  34. intentkit/skills/aixbt/base.py +1 -3
  35. intentkit/skills/aixbt/projects.py +13 -13
  36. intentkit/skills/allora/base.py +1 -3
  37. intentkit/skills/allora/price.py +2 -3
  38. intentkit/skills/base.py +15 -22
  39. intentkit/skills/basename/__init__.py +3 -5
  40. intentkit/skills/carv/__init__.py +7 -8
  41. intentkit/skills/carv/base.py +6 -6
  42. intentkit/skills/carv/fetch_news.py +3 -3
  43. intentkit/skills/carv/onchain_query.py +4 -4
  44. intentkit/skills/carv/token_info_and_price.py +5 -5
  45. intentkit/skills/casino/base.py +1 -3
  46. intentkit/skills/casino/deck_draw.py +1 -2
  47. intentkit/skills/casino/deck_shuffle.py +1 -2
  48. intentkit/skills/casino/dice_roll.py +1 -2
  49. intentkit/skills/cdp/__init__.py +3 -5
  50. intentkit/skills/cdp/base.py +1 -3
  51. intentkit/skills/chainlist/base.py +1 -3
  52. intentkit/skills/chainlist/chain_lookup.py +18 -18
  53. intentkit/skills/common/base.py +1 -3
  54. intentkit/skills/common/current_time.py +1 -2
  55. intentkit/skills/cookiefun/base.py +1 -2
  56. intentkit/skills/cookiefun/get_account_details.py +7 -7
  57. intentkit/skills/cookiefun/get_account_feed.py +19 -19
  58. intentkit/skills/cookiefun/get_account_smart_followers.py +7 -7
  59. intentkit/skills/cookiefun/get_sectors.py +3 -3
  60. intentkit/skills/cookiefun/search_accounts.py +9 -9
  61. intentkit/skills/cryptocompare/api.py +2 -3
  62. intentkit/skills/cryptocompare/base.py +6 -6
  63. intentkit/skills/cryptocompare/fetch_news.py +3 -4
  64. intentkit/skills/cryptocompare/fetch_price.py +5 -6
  65. intentkit/skills/cryptocompare/fetch_top_exchanges.py +3 -4
  66. intentkit/skills/cryptocompare/fetch_top_market_cap.py +3 -4
  67. intentkit/skills/cryptocompare/fetch_top_volume.py +3 -4
  68. intentkit/skills/cryptocompare/fetch_trading_signals.py +4 -5
  69. intentkit/skills/cryptopanic/__init__.py +4 -4
  70. intentkit/skills/cryptopanic/base.py +1 -3
  71. intentkit/skills/cryptopanic/fetch_crypto_news.py +3 -5
  72. intentkit/skills/cryptopanic/fetch_crypto_sentiment.py +3 -3
  73. intentkit/skills/dapplooker/base.py +1 -3
  74. intentkit/skills/dapplooker/dapplooker_token_data.py +7 -7
  75. intentkit/skills/defillama/api.py +6 -9
  76. intentkit/skills/defillama/base.py +5 -6
  77. intentkit/skills/defillama/coins/fetch_batch_historical_prices.py +6 -8
  78. intentkit/skills/defillama/coins/fetch_block.py +4 -6
  79. intentkit/skills/defillama/coins/fetch_current_prices.py +6 -8
  80. intentkit/skills/defillama/coins/fetch_first_price.py +5 -7
  81. intentkit/skills/defillama/coins/fetch_historical_prices.py +7 -9
  82. intentkit/skills/defillama/coins/fetch_price_chart.py +7 -9
  83. intentkit/skills/defillama/coins/fetch_price_percentage.py +5 -7
  84. intentkit/skills/defillama/config/chains.py +1 -3
  85. intentkit/skills/defillama/fees/fetch_fees_overview.py +22 -24
  86. intentkit/skills/defillama/stablecoins/fetch_stablecoin_chains.py +14 -16
  87. intentkit/skills/defillama/stablecoins/fetch_stablecoin_charts.py +6 -8
  88. intentkit/skills/defillama/stablecoins/fetch_stablecoin_prices.py +3 -5
  89. intentkit/skills/defillama/stablecoins/fetch_stablecoins.py +5 -7
  90. intentkit/skills/defillama/tests/api_integration.test.py +1 -1
  91. intentkit/skills/defillama/tvl/fetch_chain_historical_tvl.py +2 -4
  92. intentkit/skills/defillama/tvl/fetch_chains.py +7 -9
  93. intentkit/skills/defillama/tvl/fetch_historical_tvl.py +2 -4
  94. intentkit/skills/defillama/tvl/fetch_protocol.py +30 -36
  95. intentkit/skills/defillama/tvl/fetch_protocol_current_tvl.py +1 -3
  96. intentkit/skills/defillama/tvl/fetch_protocols.py +35 -43
  97. intentkit/skills/defillama/volumes/fetch_dex_overview.py +40 -46
  98. intentkit/skills/defillama/volumes/fetch_dex_summary.py +33 -35
  99. intentkit/skills/defillama/volumes/fetch_options_overview.py +22 -26
  100. intentkit/skills/defillama/yields/fetch_pool_chart.py +8 -10
  101. intentkit/skills/defillama/yields/fetch_pools.py +24 -28
  102. intentkit/skills/dexscreener/__init__.py +2 -2
  103. intentkit/skills/dexscreener/base.py +3 -3
  104. intentkit/skills/dexscreener/get_pair_info.py +2 -2
  105. intentkit/skills/dexscreener/get_token_pairs.py +2 -2
  106. intentkit/skills/dexscreener/get_tokens_info.py +5 -5
  107. intentkit/skills/dexscreener/model/search_token_response.py +80 -82
  108. intentkit/skills/dexscreener/search_token.py +182 -182
  109. intentkit/skills/dexscreener/utils.py +15 -14
  110. intentkit/skills/dune_analytics/__init__.py +4 -4
  111. intentkit/skills/dune_analytics/base.py +1 -3
  112. intentkit/skills/dune_analytics/fetch_kol_buys.py +4 -4
  113. intentkit/skills/dune_analytics/fetch_nation_metrics.py +5 -5
  114. intentkit/skills/elfa/base.py +1 -3
  115. intentkit/skills/elfa/mention.py +19 -21
  116. intentkit/skills/elfa/stats.py +4 -4
  117. intentkit/skills/elfa/tokens.py +12 -12
  118. intentkit/skills/elfa/utils.py +25 -27
  119. intentkit/skills/enso/__init__.py +2 -2
  120. intentkit/skills/enso/base.py +5 -8
  121. intentkit/skills/enso/best_yield.py +4 -6
  122. intentkit/skills/enso/networks.py +1 -2
  123. intentkit/skills/enso/prices.py +1 -3
  124. intentkit/skills/enso/route.py +1 -3
  125. intentkit/skills/enso/tokens.py +1 -3
  126. intentkit/skills/enso/wallet.py +5 -5
  127. intentkit/skills/erc20/__init__.py +4 -6
  128. intentkit/skills/erc721/__init__.py +4 -6
  129. intentkit/skills/firecrawl/base.py +1 -3
  130. intentkit/skills/firecrawl/clear.py +1 -2
  131. intentkit/skills/firecrawl/crawl.py +9 -10
  132. intentkit/skills/firecrawl/query.py +1 -2
  133. intentkit/skills/firecrawl/scrape.py +7 -8
  134. intentkit/skills/firecrawl/utils.py +13 -13
  135. intentkit/skills/github/base.py +1 -3
  136. intentkit/skills/github/github_search.py +1 -2
  137. intentkit/skills/heurist/base.py +1 -3
  138. intentkit/skills/heurist/image_generation_animagine_xl.py +7 -8
  139. intentkit/skills/heurist/image_generation_arthemy_comics.py +7 -8
  140. intentkit/skills/heurist/image_generation_arthemy_real.py +7 -8
  141. intentkit/skills/heurist/image_generation_braindance.py +7 -8
  142. intentkit/skills/heurist/image_generation_cyber_realistic_xl.py +7 -8
  143. intentkit/skills/heurist/image_generation_flux_1_dev.py +7 -8
  144. intentkit/skills/heurist/image_generation_sdxl.py +7 -8
  145. intentkit/skills/http/base.py +1 -3
  146. intentkit/skills/http/get.py +7 -7
  147. intentkit/skills/http/post.py +9 -9
  148. intentkit/skills/http/put.py +9 -9
  149. intentkit/skills/lifi/__init__.py +4 -4
  150. intentkit/skills/lifi/base.py +1 -3
  151. intentkit/skills/lifi/token_execute.py +13 -13
  152. intentkit/skills/lifi/token_quote.py +6 -6
  153. intentkit/skills/lifi/utils.py +16 -16
  154. intentkit/skills/moralis/__init__.py +3 -3
  155. intentkit/skills/moralis/api.py +6 -7
  156. intentkit/skills/moralis/base.py +2 -4
  157. intentkit/skills/moralis/fetch_chain_portfolio.py +10 -11
  158. intentkit/skills/moralis/fetch_nft_portfolio.py +22 -22
  159. intentkit/skills/moralis/fetch_solana_portfolio.py +11 -12
  160. intentkit/skills/moralis/fetch_wallet_portfolio.py +8 -9
  161. intentkit/skills/morpho/__init__.py +4 -6
  162. intentkit/skills/nation/__init__.py +2 -2
  163. intentkit/skills/nation/base.py +1 -3
  164. intentkit/skills/nation/nft_check.py +3 -4
  165. intentkit/skills/onchain.py +2 -6
  166. intentkit/skills/openai/base.py +1 -3
  167. intentkit/skills/openai/dalle_image_generation.py +1 -3
  168. intentkit/skills/openai/gpt_image_generation.py +2 -3
  169. intentkit/skills/openai/gpt_image_to_image.py +2 -3
  170. intentkit/skills/openai/image_to_text.py +1 -2
  171. intentkit/skills/portfolio/base.py +6 -6
  172. intentkit/skills/portfolio/token_balances.py +21 -21
  173. intentkit/skills/portfolio/wallet_approvals.py +7 -7
  174. intentkit/skills/portfolio/wallet_defi_positions.py +3 -3
  175. intentkit/skills/portfolio/wallet_history.py +21 -21
  176. intentkit/skills/portfolio/wallet_net_worth.py +13 -13
  177. intentkit/skills/portfolio/wallet_nfts.py +19 -19
  178. intentkit/skills/portfolio/wallet_profitability.py +7 -7
  179. intentkit/skills/portfolio/wallet_profitability_summary.py +5 -5
  180. intentkit/skills/portfolio/wallet_stats.py +3 -3
  181. intentkit/skills/portfolio/wallet_swaps.py +19 -19
  182. intentkit/skills/pyth/__init__.py +3 -5
  183. intentkit/skills/slack/base.py +2 -4
  184. intentkit/skills/slack/get_channel.py +8 -8
  185. intentkit/skills/slack/get_message.py +9 -9
  186. intentkit/skills/slack/schedule_message.py +5 -5
  187. intentkit/skills/slack/send_message.py +3 -5
  188. intentkit/skills/supabase/base.py +1 -3
  189. intentkit/skills/supabase/delete_data.py +4 -4
  190. intentkit/skills/supabase/fetch_data.py +12 -12
  191. intentkit/skills/supabase/insert_data.py +4 -4
  192. intentkit/skills/supabase/invoke_function.py +6 -6
  193. intentkit/skills/supabase/update_data.py +6 -6
  194. intentkit/skills/supabase/upsert_data.py +4 -4
  195. intentkit/skills/superfluid/__init__.py +4 -6
  196. intentkit/skills/system/add_autonomous_task.py +8 -10
  197. intentkit/skills/system/edit_autonomous_task.py +12 -14
  198. intentkit/skills/system/list_autonomous_tasks.py +1 -3
  199. intentkit/skills/tavily/base.py +1 -3
  200. intentkit/skills/tavily/tavily_extract.py +1 -2
  201. intentkit/skills/tavily/tavily_search.py +1 -3
  202. intentkit/skills/token/base.py +5 -5
  203. intentkit/skills/token/erc20_transfers.py +19 -19
  204. intentkit/skills/token/token_analytics.py +3 -3
  205. intentkit/skills/token/token_price.py +13 -13
  206. intentkit/skills/token/token_search.py +9 -9
  207. intentkit/skills/twitter/base.py +3 -4
  208. intentkit/skills/twitter/follow_user.py +1 -2
  209. intentkit/skills/twitter/get_mentions.py +3 -4
  210. intentkit/skills/twitter/get_timeline.py +1 -2
  211. intentkit/skills/twitter/get_user_by_username.py +1 -2
  212. intentkit/skills/twitter/get_user_tweets.py +2 -3
  213. intentkit/skills/twitter/like_tweet.py +1 -2
  214. intentkit/skills/twitter/post_tweet.py +3 -4
  215. intentkit/skills/twitter/reply_tweet.py +3 -4
  216. intentkit/skills/twitter/retweet.py +1 -2
  217. intentkit/skills/twitter/search_tweets.py +1 -2
  218. intentkit/skills/unrealspeech/base.py +1 -3
  219. intentkit/skills/unrealspeech/text_to_speech.py +8 -8
  220. intentkit/skills/venice_audio/__init__.py +8 -9
  221. intentkit/skills/venice_audio/base.py +3 -4
  222. intentkit/skills/venice_audio/input.py +41 -41
  223. intentkit/skills/venice_audio/venice_audio.py +6 -6
  224. intentkit/skills/venice_image/__init__.py +5 -5
  225. intentkit/skills/venice_image/api.py +138 -138
  226. intentkit/skills/venice_image/base.py +3 -3
  227. intentkit/skills/venice_image/config.py +33 -35
  228. intentkit/skills/venice_image/image_enhance/image_enhance.py +2 -3
  229. intentkit/skills/venice_image/image_enhance/image_enhance_base.py +21 -23
  230. intentkit/skills/venice_image/image_enhance/image_enhance_input.py +38 -40
  231. intentkit/skills/venice_image/image_generation/image_generation_base.py +9 -9
  232. intentkit/skills/venice_image/image_generation/image_generation_fluently_xl.py +26 -26
  233. intentkit/skills/venice_image/image_generation/image_generation_flux_dev.py +27 -27
  234. intentkit/skills/venice_image/image_generation/image_generation_flux_dev_uncensored.py +26 -26
  235. intentkit/skills/venice_image/image_generation/image_generation_input.py +158 -158
  236. intentkit/skills/venice_image/image_generation/image_generation_lustify_sdxl.py +26 -26
  237. intentkit/skills/venice_image/image_generation/image_generation_pony_realism.py +26 -26
  238. intentkit/skills/venice_image/image_generation/image_generation_stable_diffusion_3_5.py +28 -28
  239. intentkit/skills/venice_image/image_generation/image_generation_venice_sd35.py +28 -28
  240. intentkit/skills/venice_image/image_upscale/image_upscale.py +3 -3
  241. intentkit/skills/venice_image/image_upscale/image_upscale_base.py +21 -23
  242. intentkit/skills/venice_image/image_upscale/image_upscale_input.py +22 -22
  243. intentkit/skills/venice_image/image_vision/image_vision.py +2 -2
  244. intentkit/skills/venice_image/image_vision/image_vision_base.py +17 -17
  245. intentkit/skills/venice_image/image_vision/image_vision_input.py +9 -9
  246. intentkit/skills/venice_image/utils.py +77 -78
  247. intentkit/skills/web_scraper/base.py +1 -3
  248. intentkit/skills/web_scraper/document_indexer.py +1 -2
  249. intentkit/skills/web_scraper/scrape_and_index.py +4 -5
  250. intentkit/skills/web_scraper/utils.py +25 -26
  251. intentkit/skills/web_scraper/website_indexer.py +10 -11
  252. intentkit/skills/weth/__init__.py +4 -6
  253. intentkit/skills/wow/__init__.py +4 -6
  254. intentkit/skills/x402/__init__.py +2 -2
  255. intentkit/skills/x402/ask_agent.py +7 -7
  256. intentkit/skills/x402/base.py +2 -1
  257. intentkit/skills/x402/http_request.py +10 -10
  258. intentkit/skills/xmtp/base.py +3 -3
  259. intentkit/skills/xmtp/price.py +2 -2
  260. intentkit/skills/xmtp/swap.py +2 -4
  261. intentkit/skills/xmtp/transfer.py +4 -6
  262. intentkit/utils/error.py +2 -2
  263. intentkit/utils/logging.py +2 -4
  264. intentkit/utils/s3.py +8 -9
  265. intentkit/utils/schema.py +5 -5
  266. intentkit/utils/slack_alert.py +7 -8
  267. {intentkit-0.8.17.dev1.dist-info → intentkit-0.8.17.dev2.dist-info}/METADATA +3 -4
  268. intentkit-0.8.17.dev2.dist-info/RECORD +464 -0
  269. intentkit/models/generator.py +0 -347
  270. intentkit-0.8.17.dev1.dist-info/RECORD +0 -465
  271. {intentkit-0.8.17.dev1.dist-info → intentkit-0.8.17.dev2.dist-info}/WHEEL +0 -0
  272. {intentkit-0.8.17.dev1.dist-info → intentkit-0.8.17.dev2.dist-info}/licenses/LICENSE +0 -0
@@ -1,347 +0,0 @@
1
- """Agent Generation Log Model.
2
-
3
- This module defines the database models for logging agent generation operations,
4
- including token usage, prompts, AI responses, and generation metadata.
5
- """
6
-
7
- from datetime import datetime, timezone
8
- from typing import Annotated, Optional
9
-
10
- from epyxid import XID
11
- from intentkit.models.base import Base
12
- from pydantic import BaseModel, ConfigDict, Field
13
- from sqlalchemy import (
14
- Boolean,
15
- Column,
16
- DateTime,
17
- Integer,
18
- String,
19
- Text,
20
- func,
21
- select,
22
- )
23
- from sqlalchemy.dialects.postgresql import JSON, JSONB
24
- from sqlalchemy.ext.asyncio import AsyncSession
25
-
26
-
27
- class AgentGenerationLogTable(Base):
28
- """Agent generation log database table model."""
29
-
30
- __tablename__ = "agent_generation_logs"
31
-
32
- id = Column(
33
- String,
34
- primary_key=True,
35
- )
36
- user_id = Column(
37
- String,
38
- nullable=True,
39
- )
40
- prompt = Column(
41
- Text,
42
- nullable=False,
43
- )
44
- existing_agent_id = Column(
45
- String,
46
- nullable=True,
47
- )
48
- is_update = Column(
49
- Boolean,
50
- default=False,
51
- nullable=False,
52
- )
53
- generated_agent_schema = Column(
54
- JSON().with_variant(JSONB(), "postgresql"),
55
- nullable=True,
56
- )
57
- identified_skills = Column(
58
- JSON().with_variant(JSONB(), "postgresql"),
59
- nullable=True,
60
- )
61
- # LLM API response data
62
- llm_model = Column(
63
- String,
64
- nullable=True,
65
- )
66
- total_tokens = Column(
67
- Integer,
68
- default=0,
69
- )
70
- input_tokens = Column(
71
- Integer,
72
- default=0,
73
- )
74
- cached_input_tokens = Column(
75
- Integer,
76
- default=0,
77
- )
78
- output_tokens = Column(
79
- Integer,
80
- default=0,
81
- )
82
- input_tokens_details = Column(
83
- JSON().with_variant(JSONB(), "postgresql"),
84
- nullable=True,
85
- )
86
- completion_tokens_details = Column(
87
- JSON().with_variant(JSONB(), "postgresql"),
88
- nullable=True,
89
- )
90
- # Performance metrics
91
- generation_time_ms = Column(
92
- Integer,
93
- nullable=True,
94
- )
95
- retry_count = Column(
96
- Integer,
97
- default=0,
98
- )
99
- validation_errors = Column(
100
- JSON().with_variant(JSONB(), "postgresql"),
101
- nullable=True,
102
- )
103
- # Status and results
104
- success = Column(
105
- Boolean,
106
- default=False,
107
- nullable=False,
108
- )
109
- error_message = Column(
110
- Text,
111
- nullable=True,
112
- )
113
- # Timestamps
114
- created_at = Column(
115
- DateTime(timezone=True),
116
- nullable=False,
117
- server_default=func.now(),
118
- )
119
- completed_at = Column(
120
- DateTime(timezone=True),
121
- nullable=True,
122
- )
123
-
124
-
125
- class AgentGenerationLogCreate(BaseModel):
126
- """Model for creating agent generation log entries."""
127
-
128
- model_config = ConfigDict(
129
- use_enum_values=True,
130
- from_attributes=True,
131
- )
132
-
133
- id: Annotated[
134
- str,
135
- Field(
136
- default_factory=lambda: str(XID()),
137
- description="Unique identifier for the generation log",
138
- ),
139
- ]
140
- user_id: Optional[str] = Field(
141
- None,
142
- description="User ID who initiated the generation",
143
- )
144
- prompt: str = Field(
145
- ...,
146
- description="The original prompt used for generation",
147
- )
148
- existing_agent_id: Optional[str] = Field(
149
- None,
150
- description="ID of existing agent if this is an update operation",
151
- )
152
- is_update: bool = Field(
153
- False,
154
- description="Whether this is an update to existing agent",
155
- )
156
-
157
-
158
- class AgentGenerationLog(BaseModel):
159
- """Agent generation log model."""
160
-
161
- model_config = ConfigDict(
162
- use_enum_values=True,
163
- from_attributes=True,
164
- )
165
-
166
- id: str
167
- user_id: Optional[str] = None
168
- prompt: str
169
- existing_agent_id: Optional[str] = None
170
- is_update: bool = False
171
- generated_agent_schema: Optional[dict] = None
172
- identified_skills: Optional[dict] = None
173
- llm_model: Optional[str] = None
174
- total_tokens: int = 0
175
- input_tokens: int = 0
176
- cached_input_tokens: int = 0
177
- output_tokens: int = 0
178
- input_tokens_details: Optional[dict] = None
179
- completion_tokens_details: Optional[dict] = None
180
- generation_time_ms: Optional[int] = None
181
- retry_count: int = 0
182
- validation_errors: Optional[dict] = None
183
- success: bool = False
184
- error_message: Optional[str] = None
185
- created_at: datetime
186
- completed_at: Optional[datetime] = None
187
-
188
- @classmethod
189
- async def create(
190
- cls,
191
- session: AsyncSession,
192
- log_data: AgentGenerationLogCreate,
193
- ) -> "AgentGenerationLog":
194
- """Create a new agent generation log entry.
195
-
196
- Args:
197
- session: Database session
198
- log_data: Log data to create
199
-
200
- Returns:
201
- Created log instance
202
- """
203
- # Create database record
204
- log_record = AgentGenerationLogTable(
205
- id=log_data.id,
206
- user_id=log_data.user_id,
207
- prompt=log_data.prompt,
208
- existing_agent_id=log_data.existing_agent_id,
209
- is_update=log_data.is_update,
210
- )
211
-
212
- session.add(log_record)
213
- await session.commit()
214
- await session.refresh(log_record)
215
-
216
- return cls.model_validate(log_record)
217
-
218
- async def update_completion(
219
- self,
220
- session: AsyncSession,
221
- generated_agent_schema: Optional[dict] = None,
222
- identified_skills: Optional[dict] = None,
223
- llm_model: Optional[str] = None,
224
- total_tokens: int = 0,
225
- input_tokens: int = 0,
226
- cached_input_tokens: int = 0,
227
- output_tokens: int = 0,
228
- input_tokens_details: Optional[dict] = None,
229
- completion_tokens_details: Optional[dict] = None,
230
- generation_time_ms: Optional[int] = None,
231
- retry_count: int = 0,
232
- validation_errors: Optional[dict] = None,
233
- success: bool = False,
234
- error_message: Optional[str] = None,
235
- ) -> None:
236
- """Update the log entry with completion data.
237
-
238
- Args:
239
- session: Database session
240
- generated_agent_schema: The generated agent schema
241
- identified_skills: Skills identified during generation
242
- llm_model: LLM model used
243
- total_tokens: Total tokens used
244
- input_tokens: Input tokens used
245
- cached_input_tokens: Cached input tokens used (for cost calculation)
246
- output_tokens: Output tokens used
247
- input_tokens_details: Detailed input token breakdown
248
- completion_tokens_details: Detailed completion token breakdown
249
- generation_time_ms: Generation time in milliseconds
250
- retry_count: Number of retries attempted
251
- validation_errors: Any validation errors encountered
252
- success: Whether generation was successful
253
- error_message: Error message if generation failed
254
- """
255
- # Get the database record
256
- log_record = await session.get(AgentGenerationLogTable, self.id)
257
- if not log_record:
258
- return
259
-
260
- # Update fields
261
- log_record.generated_agent_schema = generated_agent_schema
262
- log_record.identified_skills = identified_skills
263
- log_record.llm_model = llm_model
264
- log_record.total_tokens = total_tokens
265
- log_record.input_tokens = input_tokens
266
- log_record.cached_input_tokens = cached_input_tokens
267
- log_record.output_tokens = output_tokens
268
- log_record.input_tokens_details = input_tokens_details
269
- log_record.completion_tokens_details = completion_tokens_details
270
- log_record.generation_time_ms = generation_time_ms
271
- log_record.retry_count = retry_count
272
- log_record.validation_errors = validation_errors
273
- log_record.success = success
274
- log_record.error_message = error_message
275
- log_record.completed_at = datetime.now(timezone.utc)
276
-
277
- session.add(log_record)
278
- await session.commit()
279
- await session.refresh(log_record)
280
-
281
- # Update this instance
282
- self.generated_agent_schema = log_record.generated_agent_schema
283
- self.identified_skills = log_record.identified_skills
284
- self.llm_model = log_record.llm_model
285
- self.total_tokens = log_record.total_tokens
286
- self.input_tokens = log_record.input_tokens
287
- self.cached_input_tokens = log_record.cached_input_tokens
288
- self.output_tokens = log_record.output_tokens
289
- self.input_tokens_details = log_record.input_tokens_details
290
- self.completion_tokens_details = log_record.completion_tokens_details
291
- self.generation_time_ms = log_record.generation_time_ms
292
- self.retry_count = log_record.retry_count
293
- self.validation_errors = log_record.validation_errors
294
- self.success = log_record.success
295
- self.error_message = log_record.error_message
296
- self.completed_at = log_record.completed_at
297
-
298
- @classmethod
299
- async def get_by_id(
300
- cls,
301
- session: AsyncSession,
302
- log_id: str,
303
- ) -> Optional["AgentGenerationLog"]:
304
- """Get an agent generation log by ID.
305
-
306
- Args:
307
- session: Database session
308
- log_id: Log ID
309
-
310
- Returns:
311
- Log instance if found, None otherwise
312
- """
313
- result = await session.execute(
314
- select(AgentGenerationLogTable).where(AgentGenerationLogTable.id == log_id)
315
- )
316
- log_record = result.scalar_one_or_none()
317
-
318
- if log_record:
319
- return cls.model_validate(log_record)
320
- return None
321
-
322
- @classmethod
323
- async def get_by_user(
324
- cls,
325
- session: AsyncSession,
326
- user_id: str,
327
- limit: int = 50,
328
- ) -> list["AgentGenerationLog"]:
329
- """Get agent generation logs for a user.
330
-
331
- Args:
332
- session: Database session
333
- user_id: User ID
334
- limit: Maximum number of logs to return
335
-
336
- Returns:
337
- List of log instances
338
- """
339
- result = await session.execute(
340
- select(AgentGenerationLogTable)
341
- .where(AgentGenerationLogTable.user_id == user_id)
342
- .order_by(AgentGenerationLogTable.created_at.desc())
343
- .limit(limit)
344
- )
345
- log_records = result.scalars().all()
346
-
347
- return [cls.model_validate(record) for record in log_records]