codemie-sdk-python 0.1.691__py3-none-any.whl → 0.1.693__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
@@ -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
+ )
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: codemie-sdk-python
3
- Version: 0.1.691
3
+ Version: 0.1.693
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
@@ -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
@@ -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.691.dist-info/METADATA,sha256=5Ik4BOiQjqb5jMGCNjQ5pNYNJfoNzP1Ea64_l1EpWyY,47441
80
- codemie_sdk_python-0.1.691.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
81
- codemie_sdk_python-0.1.691.dist-info/RECORD,,
79
+ codemie_sdk_python-0.1.693.dist-info/METADATA,sha256=ttRmWG0jDWKnF8N9kyS-tW83GnZ6d3r-iiNIT7F5JVg,47441
80
+ codemie_sdk_python-0.1.693.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
81
+ codemie_sdk_python-0.1.693.dist-info/RECORD,,