codemie-sdk-python 0.1.690__py3-none-any.whl → 0.1.692__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.
codemie_sdk/__init__.py CHANGED
@@ -93,6 +93,13 @@ from .models.analytics import (
93
93
  UsersListResponse,
94
94
  AnalyticsQueryParams,
95
95
  PaginatedAnalyticsQueryParams,
96
+ CliAnalyticsQueryParams,
97
+ CliAnalyticsSessionsQueryParams,
98
+ CliAnalyticsCostResponse,
99
+ CliAnalyticsUsersResponse,
100
+ CliAnalyticsSessionsResponse,
101
+ CliAnalyticsSessionDetailResponse,
102
+ CliAnalyticsRepositoriesResponse,
96
103
  )
97
104
  from .services.customer_config_service import CustomerConfigService
98
105
  from .services.vendor_assistant import VendorAssistantService
@@ -253,6 +260,13 @@ __all__ = [
253
260
  "UsersListResponse",
254
261
  "AnalyticsQueryParams",
255
262
  "PaginatedAnalyticsQueryParams",
263
+ "CliAnalyticsQueryParams",
264
+ "CliAnalyticsSessionsQueryParams",
265
+ "CliAnalyticsCostResponse",
266
+ "CliAnalyticsUsersResponse",
267
+ "CliAnalyticsSessionsResponse",
268
+ "CliAnalyticsSessionDetailResponse",
269
+ "CliAnalyticsRepositoriesResponse",
256
270
  "AnalyticsService",
257
271
  "CustomerConfigService",
258
272
  "MermaidDiagramRequest",
@@ -146,3 +146,193 @@ class PaginatedAnalyticsQueryParams(AnalyticsQueryParams):
146
146
 
147
147
  page: int = Field(0, description="Zero-indexed page number")
148
148
  per_page: int = Field(20, description="Items per page")
149
+
150
+
151
+ # ── CLI Analytics: /v1/analytics/cli-analytics/* ─────────────────────────────
152
+
153
+
154
+ class CliAnalyticsQueryParams(AnalyticsQueryParams):
155
+ """Filters shared by the /v1/analytics/cli-analytics/* read endpoints."""
156
+
157
+ repositories: str | None = Field(
158
+ None, description="Comma-separated repository names"
159
+ )
160
+
161
+
162
+ class CliAnalyticsSessionsQueryParams(CliAnalyticsQueryParams):
163
+ """Query parameters of the CLI Analytics session list."""
164
+
165
+ page: int | None = Field(None, description="Zero-indexed page number")
166
+ per_page: int | None = Field(None, description="Items per page")
167
+ is_unattributed: bool | None = Field(
168
+ None, description="Only sessions with no attributed repository"
169
+ )
170
+
171
+
172
+ class CliAnalyticsMetadata(BaseModel):
173
+ """Metadata of CLI Analytics responses."""
174
+
175
+ model_config = ConfigDict(extra="ignore")
176
+
177
+ timestamp: str = Field(description="ISO 8601 timestamp when response generated")
178
+ data_as_of: str = Field(description="ISO 8601 date/datetime of the newest data")
179
+ execution_time_ms: float = Field(description="Query execution time in milliseconds")
180
+
181
+
182
+ class CliAnalyticsCostKpis(BaseModel):
183
+ """Totals of the CLI Analytics cost breakdown."""
184
+
185
+ model_config = ConfigDict(extra="ignore")
186
+
187
+ total_sessions: int
188
+ total_cost_usd: float
189
+ total_tokens: int
190
+ avg_cost_per_session: float
191
+
192
+
193
+ class CliAnalyticsCostByUser(BaseModel):
194
+ """Cost of one user."""
195
+
196
+ model_config = ConfigDict(extra="ignore")
197
+
198
+ developer_name: str
199
+ cost_usd: float
200
+
201
+
202
+ class CliAnalyticsCostByModel(BaseModel):
203
+ """Cost of one model."""
204
+
205
+ model_config = ConfigDict(extra="ignore")
206
+
207
+ model_name: str
208
+ cost_usd: float
209
+
210
+
211
+ class CliAnalyticsCostData(BaseModel):
212
+ """Cost breakdown data."""
213
+
214
+ model_config = ConfigDict(extra="ignore")
215
+
216
+ kpis: CliAnalyticsCostKpis
217
+ cost_by_user: list[CliAnalyticsCostByUser] = Field(default_factory=list)
218
+ cost_by_model: list[CliAnalyticsCostByModel] = Field(default_factory=list)
219
+
220
+
221
+ class CliAnalyticsCostResponse(BaseModel):
222
+ """Response of GET /v1/analytics/cli-analytics/cost."""
223
+
224
+ model_config = ConfigDict(extra="ignore")
225
+
226
+ data: CliAnalyticsCostData
227
+ metadata: CliAnalyticsMetadata
228
+
229
+
230
+ class CliAnalyticsUserRow(BaseModel):
231
+ """One user of the CLI Analytics user leaderboard."""
232
+
233
+ model_config = ConfigDict(extra="ignore")
234
+
235
+ developer_name: str = Field(description="Resolved user email")
236
+ session_count: int
237
+ input_tokens: int
238
+ output_tokens: int
239
+ cache_read_tokens: int
240
+ cache_creation_tokens: int
241
+ cost_usd: float
242
+
243
+
244
+ class CliAnalyticsUsersData(BaseModel):
245
+ """User leaderboard data."""
246
+
247
+ model_config = ConfigDict(extra="ignore")
248
+
249
+ rows: list[CliAnalyticsUserRow]
250
+ avg_session_duration_ms: int | None = None
251
+ total_count: int | None = None
252
+
253
+
254
+ class CliAnalyticsUsersResponse(BaseModel):
255
+ """Response of GET /v1/analytics/cli-analytics/users."""
256
+
257
+ model_config = ConfigDict(extra="ignore")
258
+
259
+ data: CliAnalyticsUsersData
260
+ metadata: CliAnalyticsMetadata
261
+
262
+
263
+ class CliAnalyticsSessionRow(BaseModel):
264
+ """One CLI session."""
265
+
266
+ model_config = ConfigDict(extra="ignore")
267
+
268
+ trace_id: str = Field(description="Session id")
269
+ developer_name: str = Field(description="Resolved user email")
270
+ repository: str | None = Field(None, description="None when unattributed")
271
+ branch: str | None = None
272
+ start_time: str = Field(description="ISO 8601 session start")
273
+ duration_ms: int = Field(description="Session start to its last event")
274
+ model_name: str
275
+ input_tokens: int
276
+ output_tokens: int
277
+ cache_read_tokens: int = 0
278
+ cache_creation_tokens: int = 0
279
+ cost_usd: float
280
+
281
+
282
+ class CliAnalyticsSessionsData(BaseModel):
283
+ """Session list data."""
284
+
285
+ model_config = ConfigDict(extra="ignore")
286
+
287
+ sessions: list[CliAnalyticsSessionRow]
288
+ page: int
289
+ per_page: int
290
+ total: int
291
+
292
+
293
+ class CliAnalyticsSessionsResponse(BaseModel):
294
+ """Response of GET /v1/analytics/cli-analytics/sessions."""
295
+
296
+ model_config = ConfigDict(extra="ignore")
297
+
298
+ data: CliAnalyticsSessionsData
299
+ metadata: CliAnalyticsMetadata
300
+
301
+
302
+ class CliAnalyticsSessionDetailResponse(BaseModel):
303
+ """Response of GET /v1/analytics/cli-analytics/sessions/{trace_id}."""
304
+
305
+ model_config = ConfigDict(extra="ignore")
306
+
307
+ data: CliAnalyticsSessionRow
308
+ metadata: CliAnalyticsMetadata
309
+
310
+
311
+ class CliAnalyticsRepositoryRow(BaseModel):
312
+ """One repository (or repository branch) of the CLI Analytics breakdown."""
313
+
314
+ model_config = ConfigDict(extra="ignore")
315
+
316
+ repository: str | None = Field(None, description="None for unattributed sessions")
317
+ branch: str | None = None
318
+ session_count: int
319
+ cost_usd: float
320
+ project_name: str | None = None
321
+
322
+
323
+ class CliAnalyticsRepositoriesData(BaseModel):
324
+ """Repository breakdown data."""
325
+
326
+ model_config = ConfigDict(extra="ignore")
327
+
328
+ rows: list[CliAnalyticsRepositoryRow]
329
+ pagination: PaginationMetadata
330
+
331
+
332
+ class CliAnalyticsRepositoriesResponse(BaseModel):
333
+ """Response of GET /v1/analytics/cli-analytics/repositories."""
334
+
335
+ model_config = ConfigDict(extra="ignore")
336
+
337
+ data: CliAnalyticsRepositoriesData
338
+ metadata: CliAnalyticsMetadata
@@ -176,6 +176,24 @@ class ProjectUpdateRequest(BaseModel):
176
176
  chargeback_attribution: str | None = None
177
177
 
178
178
 
179
+ class ProjectOwnershipUpdateRequest(BaseModel):
180
+ """Request to transfer project ownership to another user."""
181
+
182
+ model_config = ConfigDict(extra="ignore")
183
+
184
+ user_id: str
185
+
186
+
187
+ class ProjectOwnershipUpdateResponse(BaseModel):
188
+ """Response after transferring project ownership."""
189
+
190
+ model_config = ConfigDict(extra="ignore")
191
+
192
+ name: str
193
+ created_by: str
194
+ message: str
195
+
196
+
179
197
  class ProjectDeleteResponse(BaseModel):
180
198
  """Response after deleting a project."""
181
199
 
@@ -4,6 +4,13 @@ import json
4
4
 
5
5
  from ..models.analytics import (
6
6
  AnalyticsQueryParams,
7
+ CliAnalyticsCostResponse,
8
+ CliAnalyticsQueryParams,
9
+ CliAnalyticsRepositoriesResponse,
10
+ CliAnalyticsSessionDetailResponse,
11
+ CliAnalyticsSessionsQueryParams,
12
+ CliAnalyticsSessionsResponse,
13
+ CliAnalyticsUsersResponse,
7
14
  PaginatedAnalyticsQueryParams,
8
15
  SummariesResponse,
9
16
  TabularResponse,
@@ -581,3 +588,93 @@ class AnalyticsService:
581
588
  params=kwargs if kwargs else None,
582
589
  wrap_response=False,
583
590
  )
591
+
592
+ # ── CLI Analytics: /v1/analytics/cli-analytics/* ─────────────────────────
593
+
594
+ def ingest_cli_analytics_event_hooks(self, events: list[dict]) -> None:
595
+ """POST /v1/analytics/cli-analytics/event-hooks — send CLI hook events.
596
+
597
+ The endpoint takes NDJSON (one event per line); each event is posted as
598
+ its own single-line body.
599
+
600
+ Args:
601
+ events: Hook events, e.g. ``agent.session.start``, ``agent.usage.request``
602
+ """
603
+ for event in events:
604
+ self._api.post(
605
+ "/v1/analytics/cli-analytics/event-hooks",
606
+ dict,
607
+ json_data=event,
608
+ wrap_response=False,
609
+ extra_headers={"Content-Type": "application/x-ndjson"},
610
+ )
611
+
612
+ def ingest_cli_analytics_logs(self, payload: dict) -> None:
613
+ """POST /v1/analytics/cli-analytics/logs — send OTLP logs as JSON.
614
+
615
+ Args:
616
+ payload: An OTLP ``ExportLogsServiceRequest`` in its JSON form
617
+ """
618
+ self._api.post(
619
+ "/v1/analytics/cli-analytics/logs",
620
+ dict,
621
+ json_data=payload,
622
+ wrap_response=False,
623
+ )
624
+
625
+ def get_cli_analytics_cost(
626
+ self, params: CliAnalyticsQueryParams | None = None
627
+ ) -> CliAnalyticsCostResponse:
628
+ """GET /v1/analytics/cli-analytics/cost — session, token and cost totals."""
629
+ return self._api.get(
630
+ "/v1/analytics/cli-analytics/cost",
631
+ CliAnalyticsCostResponse,
632
+ params=params.model_dump(exclude_none=True) if params else {},
633
+ wrap_response=False,
634
+ )
635
+
636
+ def get_cli_analytics_users(
637
+ self, params: CliAnalyticsQueryParams | None = None
638
+ ) -> CliAnalyticsUsersResponse:
639
+ """GET /v1/analytics/cli-analytics/users — per-user sessions and tokens."""
640
+ return self._api.get(
641
+ "/v1/analytics/cli-analytics/users",
642
+ CliAnalyticsUsersResponse,
643
+ params=params.model_dump(exclude_none=True) if params else {},
644
+ wrap_response=False,
645
+ )
646
+
647
+ def get_cli_analytics_sessions(
648
+ self, params: CliAnalyticsSessionsQueryParams | None = None
649
+ ) -> CliAnalyticsSessionsResponse:
650
+ """GET /v1/analytics/cli-analytics/sessions — paginated session list."""
651
+ return self._api.get(
652
+ "/v1/analytics/cli-analytics/sessions",
653
+ CliAnalyticsSessionsResponse,
654
+ params=params.model_dump(exclude_none=True) if params else {},
655
+ wrap_response=False,
656
+ )
657
+
658
+ def get_cli_analytics_session(
659
+ self, trace_id: str
660
+ ) -> CliAnalyticsSessionDetailResponse:
661
+ """GET /v1/analytics/cli-analytics/sessions/{trace_id} — session detail."""
662
+ return self._api.get(
663
+ f"/v1/analytics/cli-analytics/sessions/{trace_id}",
664
+ CliAnalyticsSessionDetailResponse,
665
+ wrap_response=False,
666
+ )
667
+
668
+ def get_cli_analytics_repositories(
669
+ self, params: CliAnalyticsQueryParams | None = None
670
+ ) -> CliAnalyticsRepositoriesResponse:
671
+ """GET /v1/analytics/cli-analytics/repositories — per-repository breakdown.
672
+
673
+ Without pagination parameters the endpoint returns every repository branch.
674
+ """
675
+ return self._api.get(
676
+ "/v1/analytics/cli-analytics/repositories",
677
+ CliAnalyticsRepositoriesResponse,
678
+ params=params.model_dump(exclude_none=True) if params else {},
679
+ wrap_response=False,
680
+ )
@@ -30,6 +30,8 @@ from ..models.project import (
30
30
  ProjectCreateResponse,
31
31
  ProjectDeleteResponse,
32
32
  ProjectDetailResponse,
33
+ ProjectOwnershipUpdateRequest,
34
+ ProjectOwnershipUpdateResponse,
33
35
  ProjectUpdateRequest,
34
36
  ProjectUpdateResponse,
35
37
  )
@@ -217,6 +219,33 @@ class ProjectService:
217
219
  response_model=ProjectDeleteResponse,
218
220
  )
219
221
 
222
+ def transfer_ownership(
223
+ self,
224
+ project_name: str,
225
+ user_id: str,
226
+ ) -> ProjectOwnershipUpdateResponse:
227
+ """Transfer ownership of a project to another active user.
228
+
229
+ Args:
230
+ project_name: Project name
231
+ user_id: ID of the user who becomes the new owner
232
+
233
+ Returns:
234
+ ProjectOwnershipUpdateResponse with the project name, new owner id and message
235
+
236
+ Raises:
237
+ HTTPException: 404 if the project or the target user is not found, or the
238
+ caller may not manage the project; 403 if the project is personal
239
+ """
240
+ payload = ProjectOwnershipUpdateRequest(user_id=user_id)
241
+
242
+ return self._api.put(
243
+ f"/v1/projects/{project_name}/ownership",
244
+ response_model=ProjectOwnershipUpdateResponse,
245
+ json_data=payload.model_dump(),
246
+ wrap_response=False,
247
+ )
248
+
220
249
  # Assignment endpoints
221
250
 
222
251
  def assign_user_to_project(
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: codemie-sdk-python
3
- Version: 0.1.690
3
+ Version: 0.1.692
4
4
  Summary: CodeMie SDK for Python
5
5
  Author: Vadym Vlasenko
6
6
  Author-email: vadym_vlasenko@epam.com
@@ -1,4 +1,4 @@
1
- codemie_sdk/__init__.py,sha256=4l9nNwAgobEYrjLYkOuGYBH-KDagfp-03QPkn1aXcmg,8310
1
+ codemie_sdk/__init__.py,sha256=9pK9aoMg0gpyYA1WqOjxGVMOX0tuRUszLdenKikbDIc,8800
2
2
  codemie_sdk/auth/__init__.py,sha256=IksEj223xEZtJ-cQ0AT9L0Bs9psIJ8QNzDXrPTUQ3xQ,126
3
3
  codemie_sdk/auth/credentials.py,sha256=hO0X3EQWZSlIm0ABhiJo4fIIndm2blB0JZWMaWvsuTE,7774
4
4
  codemie_sdk/builders/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -13,7 +13,7 @@ codemie_sdk/models/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuF
13
13
  codemie_sdk/models/a2a.py,sha256=zCNLiwwg78rok04hMlGPcQQS1IbEV4OaMcA_1KxQ9xs,1588
14
14
  codemie_sdk/models/activity_event.py,sha256=KDEzzUEfs1J9ALNo4mLP-Rq7jeTM4g-P4A5A7Z4YjzM,1072
15
15
  codemie_sdk/models/admin.py,sha256=2UGaO60ZrHHcDcV9thYBVxDyUCvtfPQhs10WswhGFJs,2298
16
- codemie_sdk/models/analytics.py,sha256=B29Cqt2Mvqohfjz-keRV5gFBpTKw_iIkF2ARxmEUv-Y,4953
16
+ codemie_sdk/models/analytics.py,sha256=B9lLAddL_LylXsoOukiPqbz4HVd2itmuB6iaEbhpKiQ,10194
17
17
  codemie_sdk/models/assistant.py,sha256=BkMMIBKA3fibL98PsyEtlIcvZql63oVdI9Pgy9YnemI,22230
18
18
  codemie_sdk/models/categories.py,sha256=eq7_sw-sevNLeWpjaW3N055Xcgbbevs0Bl_rj--maUk,2303
19
19
  codemie_sdk/models/common.py,sha256=ipNNdQlv4Ct1UyIAknjJbrdjjvv0lZJYK6dnPm8wai4,1170
@@ -27,7 +27,7 @@ codemie_sdk/models/integration.py,sha256=yBV28vZ8oN0oNRNHdDPL3UUSJqNga1YodABIfX8
27
27
  codemie_sdk/models/llm.py,sha256=ViADvsSAkc85YQyPUkGE3ZvMc5pnHWHO0_rOkLSTfu4,1333
28
28
  codemie_sdk/models/mcp_config.py,sha256=mvD2utb4fthjNGAIkZKEkTtHSQQyF2WEYrA7tn-e0Lo,2184
29
29
  codemie_sdk/models/mermaid.py,sha256=dhRgX-itvfyrt0LUg5pbSo0CTH5PewiegqcZn3hWggU,675
30
- codemie_sdk/models/project.py,sha256=_iE45WdlAufZIW0XyqwxExOhHhSVY-YLs--68phj5tQ,6983
30
+ codemie_sdk/models/project.py,sha256=MWBWg_G373v8OHX_INqvZZg6TlRY0w8G_HDBqPa_CL0,7370
31
31
  codemie_sdk/models/skill.py,sha256=KE4lsF8TMxIQa_UE0oRDMT6XIEHqKjsDyi0HYKEp1mM,6918
32
32
  codemie_sdk/models/task.py,sha256=YHu5DRnECS2wnqIWZ_YH8Z72p1I4aV3xWFW5joxN_8Q,1442
33
33
  codemie_sdk/models/user.py,sha256=YqPWzTgIKF-7Jw6aV7RD__su1iahEJPGaDR6Px-B4bU,3848
@@ -45,7 +45,7 @@ codemie_sdk/models/workspace.py,sha256=xYnVO1Pnd0l0PSBe2pwP80C2ZvYBc2ESo6OH_G0cO
45
45
  codemie_sdk/services/a2a.py,sha256=JI_heDKmQ1qYGIES_6qPosHRyVb73tKs4v7uTGpzXx4,1026
46
46
  codemie_sdk/services/activity_event.py,sha256=KoD0DyeqJ0CmQPA4PAXH4uGIAQCgcJbYwDnv-MCckGc,3630
47
47
  codemie_sdk/services/admin.py,sha256=yk1xdBXDjpdW4OMOdBaURkZhAxak9h-TppKyhStLekc,4006
48
- codemie_sdk/services/analytics.py,sha256=JtBhlilU2uHjVmqzf_4TyF-j6vVVDMK6n_YJ07hCxZ4,19360
48
+ codemie_sdk/services/analytics.py,sha256=wcbbzm9L4YLXy7I054jM8LYlIQnz3gB2K56--OkVT4g,23148
49
49
  codemie_sdk/services/assistant.py,sha256=3fHK2cJERgNJJfkvdih0h7bRHdHjlIJHBcS7EcnJ90E,22135
50
50
  codemie_sdk/services/categories.py,sha256=1qd98JCcMNdpbos0O1WpMApT6TurE7OuI7zoYewnwk8,5030
51
51
  codemie_sdk/services/codemie_guardrails.py,sha256=O3yCeIQYG8W7z-sVRR4Cw9UVncqP9lPVNxUSaUZrh7I,2833
@@ -59,7 +59,7 @@ codemie_sdk/services/integration.py,sha256=n4ggDedJ2GCI5mTgZNfrYE49uzLsp_BKYKMdT
59
59
  codemie_sdk/services/llm.py,sha256=GQWIi359f99uU4YRnAdpbyae1kXp1G5OpVgJNIIn7-8,1132
60
60
  codemie_sdk/services/mcp_configs.py,sha256=MrCiWJ6-ezXE9NOTgOfHDhfyQokaumGp1rwB4IAKXzs,2466
61
61
  codemie_sdk/services/mermaid.py,sha256=7cLykdrJVW576raUbON3yhuWnbGaXl8rX1QfVwbu2JE,2246
62
- codemie_sdk/services/project.py,sha256=ajs5ZEc7L9k6qJGjX28_LF6mrExC-uYvWhd3AuQBX_w,13309
62
+ codemie_sdk/services/project.py,sha256=2O57E63mkt5Z-OwTksxiKplRDHwh6MV_COaztXO7j4A,14298
63
63
  codemie_sdk/services/project_budget_groups.py,sha256=B7QJt3sh_LV3lfwALZlxUq0SLR30BWafHcS6eHyOh8Y,5471
64
64
  codemie_sdk/services/skill.py,sha256=0mExdeKTMNqkEpKafD0ya1WyLj9CMCFaprkggKYqnQg,13216
65
65
  codemie_sdk/services/task.py,sha256=UaYh__xGF7VKWCJKPrncVjTvx46Gz1AN9XczPVL71oA,1052
@@ -76,6 +76,6 @@ codemie_sdk/services/workflow_execution_state.py,sha256=u1xmGvaHjqvQS5ujhyvJ_Ac7
76
76
  codemie_sdk/services/workspace.py,sha256=eLwZ0fhi1BfOesrXaQlTdOll8q7ENP9b_jb5eybKSVw,5038
77
77
  codemie_sdk/utils/__init__.py,sha256=EzK_UrS5KHmAnE73Hci9LaObB5omjVUhIq4svh0gfwo,137
78
78
  codemie_sdk/utils/http.py,sha256=PWejBKa5pwzQ5eLVhdN8lYKEu1B1QtwGTRmZfnGFL6c,14158
79
- codemie_sdk_python-0.1.690.dist-info/METADATA,sha256=6nvAIpO__3TgP63FlWNCzHfoExuIW6sRZZVyX5n_LE0,47441
80
- codemie_sdk_python-0.1.690.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
81
- codemie_sdk_python-0.1.690.dist-info/RECORD,,
79
+ codemie_sdk_python-0.1.692.dist-info/METADATA,sha256=ay9di79CYESHDIo4qGdC0AynO_AYQJYp_mu2gT-f32c,47441
80
+ codemie_sdk_python-0.1.692.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
81
+ codemie_sdk_python-0.1.692.dist-info/RECORD,,