codemie-sdk-python 0.1.434__tar.gz → 0.1.436__tar.gz

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.
Files changed (60) hide show
  1. {codemie_sdk_python-0.1.434 → codemie_sdk_python-0.1.436}/PKG-INFO +1 -1
  2. {codemie_sdk_python-0.1.434 → codemie_sdk_python-0.1.436}/pyproject.toml +1 -1
  3. {codemie_sdk_python-0.1.434 → codemie_sdk_python-0.1.436}/src/codemie_sdk/__init__.py +10 -0
  4. {codemie_sdk_python-0.1.434 → codemie_sdk_python-0.1.436}/src/codemie_sdk/models/skill.py +88 -0
  5. {codemie_sdk_python-0.1.434 → codemie_sdk_python-0.1.436}/src/codemie_sdk/services/skill.py +86 -0
  6. {codemie_sdk_python-0.1.434 → codemie_sdk_python-0.1.436}/README.md +0 -0
  7. {codemie_sdk_python-0.1.434 → codemie_sdk_python-0.1.436}/src/codemie_sdk/auth/__init__.py +0 -0
  8. {codemie_sdk_python-0.1.434 → codemie_sdk_python-0.1.436}/src/codemie_sdk/auth/credentials.py +0 -0
  9. {codemie_sdk_python-0.1.434 → codemie_sdk_python-0.1.436}/src/codemie_sdk/client/__init__.py +0 -0
  10. {codemie_sdk_python-0.1.434 → codemie_sdk_python-0.1.436}/src/codemie_sdk/client/client.py +0 -0
  11. {codemie_sdk_python-0.1.434 → codemie_sdk_python-0.1.436}/src/codemie_sdk/exceptions.py +0 -0
  12. {codemie_sdk_python-0.1.434 → codemie_sdk_python-0.1.436}/src/codemie_sdk/models/__init__.py +0 -0
  13. {codemie_sdk_python-0.1.434 → codemie_sdk_python-0.1.436}/src/codemie_sdk/models/admin.py +0 -0
  14. {codemie_sdk_python-0.1.434 → codemie_sdk_python-0.1.436}/src/codemie_sdk/models/analytics.py +0 -0
  15. {codemie_sdk_python-0.1.434 → codemie_sdk_python-0.1.436}/src/codemie_sdk/models/assistant.py +0 -0
  16. {codemie_sdk_python-0.1.434 → codemie_sdk_python-0.1.436}/src/codemie_sdk/models/categories.py +0 -0
  17. {codemie_sdk_python-0.1.434 → codemie_sdk_python-0.1.436}/src/codemie_sdk/models/common.py +0 -0
  18. {codemie_sdk_python-0.1.434 → codemie_sdk_python-0.1.436}/src/codemie_sdk/models/conversation.py +0 -0
  19. {codemie_sdk_python-0.1.434 → codemie_sdk_python-0.1.436}/src/codemie_sdk/models/datasource.py +0 -0
  20. {codemie_sdk_python-0.1.434 → codemie_sdk_python-0.1.436}/src/codemie_sdk/models/errors.py +0 -0
  21. {codemie_sdk_python-0.1.434 → codemie_sdk_python-0.1.436}/src/codemie_sdk/models/file_operation.py +0 -0
  22. {codemie_sdk_python-0.1.434 → codemie_sdk_python-0.1.436}/src/codemie_sdk/models/guardrails.py +0 -0
  23. {codemie_sdk_python-0.1.434 → codemie_sdk_python-0.1.436}/src/codemie_sdk/models/integration.py +0 -0
  24. {codemie_sdk_python-0.1.434 → codemie_sdk_python-0.1.436}/src/codemie_sdk/models/llm.py +0 -0
  25. {codemie_sdk_python-0.1.434 → codemie_sdk_python-0.1.436}/src/codemie_sdk/models/mermaid.py +0 -0
  26. {codemie_sdk_python-0.1.434 → codemie_sdk_python-0.1.436}/src/codemie_sdk/models/project.py +0 -0
  27. {codemie_sdk_python-0.1.434 → codemie_sdk_python-0.1.436}/src/codemie_sdk/models/task.py +0 -0
  28. {codemie_sdk_python-0.1.434 → codemie_sdk_python-0.1.436}/src/codemie_sdk/models/user.py +0 -0
  29. {codemie_sdk_python-0.1.434 → codemie_sdk_python-0.1.436}/src/codemie_sdk/models/vendor_assistant.py +0 -0
  30. {codemie_sdk_python-0.1.434 → codemie_sdk_python-0.1.436}/src/codemie_sdk/models/vendor_guardrail.py +0 -0
  31. {codemie_sdk_python-0.1.434 → codemie_sdk_python-0.1.436}/src/codemie_sdk/models/vendor_knowledgebase.py +0 -0
  32. {codemie_sdk_python-0.1.434 → codemie_sdk_python-0.1.436}/src/codemie_sdk/models/vendor_workflow.py +0 -0
  33. {codemie_sdk_python-0.1.434 → codemie_sdk_python-0.1.436}/src/codemie_sdk/models/workflow.py +0 -0
  34. {codemie_sdk_python-0.1.434 → codemie_sdk_python-0.1.436}/src/codemie_sdk/models/workflow_execution_payload.py +0 -0
  35. {codemie_sdk_python-0.1.434 → codemie_sdk_python-0.1.436}/src/codemie_sdk/models/workflow_state.py +0 -0
  36. {codemie_sdk_python-0.1.434 → codemie_sdk_python-0.1.436}/src/codemie_sdk/models/workflow_thoughts.py +0 -0
  37. {codemie_sdk_python-0.1.434 → codemie_sdk_python-0.1.436}/src/codemie_sdk/services/admin.py +0 -0
  38. {codemie_sdk_python-0.1.434 → codemie_sdk_python-0.1.436}/src/codemie_sdk/services/analytics.py +0 -0
  39. {codemie_sdk_python-0.1.434 → codemie_sdk_python-0.1.436}/src/codemie_sdk/services/assistant.py +0 -0
  40. {codemie_sdk_python-0.1.434 → codemie_sdk_python-0.1.436}/src/codemie_sdk/services/categories.py +0 -0
  41. {codemie_sdk_python-0.1.434 → codemie_sdk_python-0.1.436}/src/codemie_sdk/services/codemie_guardrails.py +0 -0
  42. {codemie_sdk_python-0.1.434 → codemie_sdk_python-0.1.436}/src/codemie_sdk/services/conversation.py +0 -0
  43. {codemie_sdk_python-0.1.434 → codemie_sdk_python-0.1.436}/src/codemie_sdk/services/datasource.py +0 -0
  44. {codemie_sdk_python-0.1.434 → codemie_sdk_python-0.1.436}/src/codemie_sdk/services/files.py +0 -0
  45. {codemie_sdk_python-0.1.434 → codemie_sdk_python-0.1.436}/src/codemie_sdk/services/integration.py +0 -0
  46. {codemie_sdk_python-0.1.434 → codemie_sdk_python-0.1.436}/src/codemie_sdk/services/llm.py +0 -0
  47. {codemie_sdk_python-0.1.434 → codemie_sdk_python-0.1.436}/src/codemie_sdk/services/mermaid.py +0 -0
  48. {codemie_sdk_python-0.1.434 → codemie_sdk_python-0.1.436}/src/codemie_sdk/services/project.py +0 -0
  49. {codemie_sdk_python-0.1.434 → codemie_sdk_python-0.1.436}/src/codemie_sdk/services/task.py +0 -0
  50. {codemie_sdk_python-0.1.434 → codemie_sdk_python-0.1.436}/src/codemie_sdk/services/user.py +0 -0
  51. {codemie_sdk_python-0.1.434 → codemie_sdk_python-0.1.436}/src/codemie_sdk/services/vendor_assistant.py +0 -0
  52. {codemie_sdk_python-0.1.434 → codemie_sdk_python-0.1.436}/src/codemie_sdk/services/vendor_guardrail.py +0 -0
  53. {codemie_sdk_python-0.1.434 → codemie_sdk_python-0.1.436}/src/codemie_sdk/services/vendor_knowledgebase.py +0 -0
  54. {codemie_sdk_python-0.1.434 → codemie_sdk_python-0.1.436}/src/codemie_sdk/services/vendor_workflow.py +0 -0
  55. {codemie_sdk_python-0.1.434 → codemie_sdk_python-0.1.436}/src/codemie_sdk/services/webhook.py +0 -0
  56. {codemie_sdk_python-0.1.434 → codemie_sdk_python-0.1.436}/src/codemie_sdk/services/workflow.py +0 -0
  57. {codemie_sdk_python-0.1.434 → codemie_sdk_python-0.1.436}/src/codemie_sdk/services/workflow_execution.py +0 -0
  58. {codemie_sdk_python-0.1.434 → codemie_sdk_python-0.1.436}/src/codemie_sdk/services/workflow_execution_state.py +0 -0
  59. {codemie_sdk_python-0.1.434 → codemie_sdk_python-0.1.436}/src/codemie_sdk/utils/__init__.py +0 -0
  60. {codemie_sdk_python-0.1.434 → codemie_sdk_python-0.1.436}/src/codemie_sdk/utils/http.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: codemie-sdk-python
3
- Version: 0.1.434
3
+ Version: 0.1.436
4
4
  Summary: CodeMie SDK for Python
5
5
  Author: Vadym Vlasenko
6
6
  Author-email: vadym_vlasenko@epam.com
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "codemie-sdk-python"
3
- version = "0.1.434"
3
+ version = "0.1.436"
4
4
  description = "CodeMie SDK for Python"
5
5
  authors = [
6
6
  "Vadym Vlasenko <vadym_vlasenko@epam.com>",
@@ -125,6 +125,11 @@ from .models.skill import (
125
125
  SkillDetailResponse,
126
126
  SkillListResponse,
127
127
  SkillListPaginatedResponse,
128
+ SkillEventRequest,
129
+ SkillEventItem,
130
+ SkillStatsItem,
131
+ SingleSkillStatsResponse,
132
+ SkillPagination,
128
133
  )
129
134
  from .services.skill import SkillService
130
135
 
@@ -221,5 +226,10 @@ __all__ = [
221
226
  "SkillDetailResponse",
222
227
  "SkillListResponse",
223
228
  "SkillListPaginatedResponse",
229
+ "SkillEventRequest",
230
+ "SkillEventItem",
231
+ "SkillStatsItem",
232
+ "SingleSkillStatsResponse",
233
+ "SkillPagination",
224
234
  "SkillService",
225
235
  ]
@@ -2,6 +2,7 @@
2
2
 
3
3
  from datetime import datetime
4
4
  from enum import Enum
5
+ from typing import Any, Literal
5
6
 
6
7
  from pydantic import BaseModel, ConfigDict, Field
7
8
 
@@ -122,3 +123,90 @@ class SkillReactionResponse(BaseModel):
122
123
  reaction: str
123
124
  reaction_at: str = Field(alias="reactionAt")
124
125
  resource_type: str | None = Field(None, alias="resourceType")
126
+
127
+
128
+ class SkillPagination(BaseModel):
129
+ """Shared pagination envelope for skills statistics endpoints."""
130
+
131
+ model_config = ConfigDict(extra="ignore")
132
+
133
+ page: int
134
+ per_page: int
135
+ total: int
136
+ pages: int
137
+
138
+
139
+ class SkillEventRequest(BaseModel):
140
+ """Request body for POST /v1/skills/events."""
141
+
142
+ session_id: str
143
+ command: Literal["add", "update", "remove", "list", "find"]
144
+ status: Literal["started", "completed", "failed"]
145
+ scope: Literal["global", "project", "unknown"] | None = None
146
+ error_code: str | None = None
147
+ agent_selection_mode: (
148
+ Literal["explicit", "auto_detected", "prompted", "upstream"] | None
149
+ ) = None
150
+ target_agents: list[str] | None = None
151
+ source: str | None = None
152
+ skill_name: str | None = None
153
+ skill_slug: str | None = None
154
+ skill_id: str | None = None
155
+ agent: str = "codemie-skills"
156
+ agent_version: str | None = None
157
+ repository: str | None = None
158
+ branch: str | None = None
159
+ project: str | None = None
160
+ attributes: dict[str, Any] | None = None
161
+
162
+
163
+ class SkillEventItem(BaseModel):
164
+ """Single row from the raw event log."""
165
+
166
+ model_config = ConfigDict(extra="ignore")
167
+
168
+ skill_slug: str | None = None
169
+ source: str | None = None
170
+ target_agents: list[str] = Field(default_factory=list)
171
+ date: datetime
172
+ command: str
173
+ user_id: str
174
+
175
+
176
+ class SkillEventsPaginatedResponse(BaseModel):
177
+ """Paginated response from GET /v1/skills/events."""
178
+
179
+ model_config = ConfigDict(extra="ignore")
180
+
181
+ data: list[SkillEventItem]
182
+ pagination: SkillPagination
183
+
184
+
185
+ class SkillStatsItem(BaseModel):
186
+ """Per-skill aggregated stats item."""
187
+
188
+ model_config = ConfigDict(extra="ignore")
189
+
190
+ skill_slug: str | None = None
191
+ installs: int
192
+ removals: int
193
+ by_agent: dict[str, int] = Field(default_factory=dict)
194
+
195
+
196
+ class SkillStatsPaginatedResponse(BaseModel):
197
+ """Paginated response from GET /v1/skills/events/stats."""
198
+
199
+ model_config = ConfigDict(extra="ignore")
200
+
201
+ data: list[SkillStatsItem]
202
+ pagination: SkillPagination
203
+
204
+
205
+ class SingleSkillStatsResponse(BaseModel):
206
+ """Response from GET /v1/skills/events/{slug}/stats."""
207
+
208
+ model_config = ConfigDict(extra="ignore")
209
+
210
+ installs: int
211
+ removals: int
212
+ by_agent: dict[str, int] = Field(default_factory=dict)
@@ -11,10 +11,14 @@ from ..models.skill import (
11
11
  SkillCategory,
12
12
  SkillCreateRequest,
13
13
  SkillDetailResponse,
14
+ SkillEventItem,
15
+ SkillEventRequest,
14
16
  SkillImportRequest,
15
17
  SkillListPaginatedResponse,
16
18
  SkillListResponse,
19
+ SkillStatsItem,
17
20
  SkillUpdateRequest,
21
+ SingleSkillStatsResponse,
18
22
  )
19
23
  from ..utils.http import ApiRequestHandler, TokenSource
20
24
 
@@ -302,3 +306,85 @@ class SkillService:
302
306
  Removal confirmation
303
307
  """
304
308
  return self._api.delete(f"/v1/skills/{skill_id}/reactions", dict)
309
+
310
+ # Statistics / Event Log
311
+
312
+ def record_event(self, request: SkillEventRequest) -> dict:
313
+ """Record a skill lifecycle event.
314
+
315
+ Args:
316
+ request: Skill event request
317
+
318
+ Returns:
319
+ Confirmation dict
320
+ """
321
+ return self._api.post(
322
+ "/v1/skills/events",
323
+ dict,
324
+ json_data=request.model_dump(exclude_none=True),
325
+ )
326
+
327
+ def get_events(
328
+ self,
329
+ from_: str | None = None,
330
+ to: str | None = None,
331
+ limit: int = 100,
332
+ offset: int = 0,
333
+ ) -> list[SkillEventItem]:
334
+ """Get raw skill event log.
335
+
336
+ Args:
337
+ from_: ISO datetime lower bound (inclusive)
338
+ to: ISO datetime upper bound (inclusive)
339
+ limit: Maximum number of results
340
+ offset: Pagination offset
341
+
342
+ Returns:
343
+ List of skill event items
344
+ """
345
+ params: dict[str, Any] = {"limit": limit, "offset": offset}
346
+ if from_ is not None:
347
+ params["from"] = from_
348
+ if to is not None:
349
+ params["to"] = to
350
+ return self._api.get("/v1/skills/events", list[SkillEventItem], params=params)
351
+
352
+ def get_events_stats(
353
+ self,
354
+ from_: str | None = None,
355
+ to: str | None = None,
356
+ limit: int = 100,
357
+ offset: int = 0,
358
+ ) -> list[SkillStatsItem]:
359
+ """Get per-skill aggregated install/removal counts.
360
+
361
+ Args:
362
+ from_: ISO datetime lower bound (inclusive)
363
+ to: ISO datetime upper bound (inclusive)
364
+ limit: Maximum number of results
365
+ offset: Pagination offset
366
+
367
+ Returns:
368
+ List of skill stats items
369
+ """
370
+ params: dict[str, Any] = {"limit": limit, "offset": offset}
371
+ if from_ is not None:
372
+ params["from"] = from_
373
+ if to is not None:
374
+ params["to"] = to
375
+ return self._api.get(
376
+ "/v1/skills/events/stats", list[SkillStatsItem], params=params
377
+ )
378
+
379
+ def get_skill_stats(self, slug: str) -> SingleSkillStatsResponse:
380
+ """Get aggregated stats for a single skill.
381
+
382
+ Args:
383
+ slug: Skill slug identifier
384
+
385
+ Returns:
386
+ Single skill stats
387
+ """
388
+ return self._api.get(
389
+ f"/v1/skills/events/{slug}/stats", SingleSkillStatsResponse
390
+ )