codemie-sdk-python 0.1.705__tar.gz → 0.1.706__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.
- {codemie_sdk_python-0.1.705 → codemie_sdk_python-0.1.706}/PKG-INFO +1 -1
- {codemie_sdk_python-0.1.705 → codemie_sdk_python-0.1.706}/pyproject.toml +1 -1
- {codemie_sdk_python-0.1.705 → codemie_sdk_python-0.1.706}/src/codemie_sdk/__init__.py +18 -0
- {codemie_sdk_python-0.1.705 → codemie_sdk_python-0.1.706}/src/codemie_sdk/client/client.py +4 -0
- codemie_sdk_python-0.1.706/src/codemie_sdk/models/usage_attribution.py +124 -0
- codemie_sdk_python-0.1.706/src/codemie_sdk/services/usage_attribution.py +324 -0
- {codemie_sdk_python-0.1.705 → codemie_sdk_python-0.1.706}/README.md +0 -0
- {codemie_sdk_python-0.1.705 → codemie_sdk_python-0.1.706}/src/codemie_sdk/auth/__init__.py +0 -0
- {codemie_sdk_python-0.1.705 → codemie_sdk_python-0.1.706}/src/codemie_sdk/auth/credentials.py +0 -0
- {codemie_sdk_python-0.1.705 → codemie_sdk_python-0.1.706}/src/codemie_sdk/builders/__init__.py +0 -0
- {codemie_sdk_python-0.1.705 → codemie_sdk_python-0.1.706}/src/codemie_sdk/builders/workflow/__init__.py +0 -0
- {codemie_sdk_python-0.1.705 → codemie_sdk_python-0.1.706}/src/codemie_sdk/builders/workflow/builder.py +0 -0
- {codemie_sdk_python-0.1.705 → codemie_sdk_python-0.1.706}/src/codemie_sdk/builders/workflow/definition.py +0 -0
- {codemie_sdk_python-0.1.705 → codemie_sdk_python-0.1.706}/src/codemie_sdk/builders/workflow/publish.py +0 -0
- {codemie_sdk_python-0.1.705 → codemie_sdk_python-0.1.706}/src/codemie_sdk/client/__init__.py +0 -0
- {codemie_sdk_python-0.1.705 → codemie_sdk_python-0.1.706}/src/codemie_sdk/exceptions.py +0 -0
- {codemie_sdk_python-0.1.705 → codemie_sdk_python-0.1.706}/src/codemie_sdk/models/__init__.py +0 -0
- {codemie_sdk_python-0.1.705 → codemie_sdk_python-0.1.706}/src/codemie_sdk/models/a2a.py +0 -0
- {codemie_sdk_python-0.1.705 → codemie_sdk_python-0.1.706}/src/codemie_sdk/models/activity_event.py +0 -0
- {codemie_sdk_python-0.1.705 → codemie_sdk_python-0.1.706}/src/codemie_sdk/models/admin.py +0 -0
- {codemie_sdk_python-0.1.705 → codemie_sdk_python-0.1.706}/src/codemie_sdk/models/analytics.py +0 -0
- {codemie_sdk_python-0.1.705 → codemie_sdk_python-0.1.706}/src/codemie_sdk/models/assistant.py +0 -0
- {codemie_sdk_python-0.1.705 → codemie_sdk_python-0.1.706}/src/codemie_sdk/models/categories.py +0 -0
- {codemie_sdk_python-0.1.705 → codemie_sdk_python-0.1.706}/src/codemie_sdk/models/common.py +0 -0
- {codemie_sdk_python-0.1.705 → codemie_sdk_python-0.1.706}/src/codemie_sdk/models/conversation.py +0 -0
- {codemie_sdk_python-0.1.705 → codemie_sdk_python-0.1.706}/src/codemie_sdk/models/cost_center.py +0 -0
- {codemie_sdk_python-0.1.705 → codemie_sdk_python-0.1.706}/src/codemie_sdk/models/datasource.py +0 -0
- {codemie_sdk_python-0.1.705 → codemie_sdk_python-0.1.706}/src/codemie_sdk/models/errors.py +0 -0
- {codemie_sdk_python-0.1.705 → codemie_sdk_python-0.1.706}/src/codemie_sdk/models/file_operation.py +0 -0
- {codemie_sdk_python-0.1.705 → codemie_sdk_python-0.1.706}/src/codemie_sdk/models/guardrails.py +0 -0
- {codemie_sdk_python-0.1.705 → codemie_sdk_python-0.1.706}/src/codemie_sdk/models/integration.py +0 -0
- {codemie_sdk_python-0.1.705 → codemie_sdk_python-0.1.706}/src/codemie_sdk/models/llm.py +0 -0
- {codemie_sdk_python-0.1.705 → codemie_sdk_python-0.1.706}/src/codemie_sdk/models/mcp_config.py +0 -0
- {codemie_sdk_python-0.1.705 → codemie_sdk_python-0.1.706}/src/codemie_sdk/models/mermaid.py +0 -0
- {codemie_sdk_python-0.1.705 → codemie_sdk_python-0.1.706}/src/codemie_sdk/models/project.py +0 -0
- {codemie_sdk_python-0.1.705 → codemie_sdk_python-0.1.706}/src/codemie_sdk/models/servicenow_integration.py +0 -0
- {codemie_sdk_python-0.1.705 → codemie_sdk_python-0.1.706}/src/codemie_sdk/models/skill.py +0 -0
- {codemie_sdk_python-0.1.705 → codemie_sdk_python-0.1.706}/src/codemie_sdk/models/task.py +0 -0
- {codemie_sdk_python-0.1.705 → codemie_sdk_python-0.1.706}/src/codemie_sdk/models/user.py +0 -0
- {codemie_sdk_python-0.1.705 → codemie_sdk_python-0.1.706}/src/codemie_sdk/models/vendor_assistant.py +0 -0
- {codemie_sdk_python-0.1.705 → codemie_sdk_python-0.1.706}/src/codemie_sdk/models/vendor_guardrail.py +0 -0
- {codemie_sdk_python-0.1.705 → codemie_sdk_python-0.1.706}/src/codemie_sdk/models/vendor_knowledgebase.py +0 -0
- {codemie_sdk_python-0.1.705 → codemie_sdk_python-0.1.706}/src/codemie_sdk/models/vendor_runtime.py +0 -0
- {codemie_sdk_python-0.1.705 → codemie_sdk_python-0.1.706}/src/codemie_sdk/models/vendor_workflow.py +0 -0
- {codemie_sdk_python-0.1.705 → codemie_sdk_python-0.1.706}/src/codemie_sdk/models/workflow.py +0 -0
- {codemie_sdk_python-0.1.705 → codemie_sdk_python-0.1.706}/src/codemie_sdk/models/workflow_execution_payload.py +0 -0
- {codemie_sdk_python-0.1.705 → codemie_sdk_python-0.1.706}/src/codemie_sdk/models/workflow_state.py +0 -0
- {codemie_sdk_python-0.1.705 → codemie_sdk_python-0.1.706}/src/codemie_sdk/models/workflow_thoughts.py +0 -0
- {codemie_sdk_python-0.1.705 → codemie_sdk_python-0.1.706}/src/codemie_sdk/models/workflow_transition.py +0 -0
- {codemie_sdk_python-0.1.705 → codemie_sdk_python-0.1.706}/src/codemie_sdk/models/workspace.py +0 -0
- {codemie_sdk_python-0.1.705 → codemie_sdk_python-0.1.706}/src/codemie_sdk/services/a2a.py +0 -0
- {codemie_sdk_python-0.1.705 → codemie_sdk_python-0.1.706}/src/codemie_sdk/services/activity_event.py +0 -0
- {codemie_sdk_python-0.1.705 → codemie_sdk_python-0.1.706}/src/codemie_sdk/services/admin.py +0 -0
- {codemie_sdk_python-0.1.705 → codemie_sdk_python-0.1.706}/src/codemie_sdk/services/analytics.py +0 -0
- {codemie_sdk_python-0.1.705 → codemie_sdk_python-0.1.706}/src/codemie_sdk/services/assistant.py +0 -0
- {codemie_sdk_python-0.1.705 → codemie_sdk_python-0.1.706}/src/codemie_sdk/services/categories.py +0 -0
- {codemie_sdk_python-0.1.705 → codemie_sdk_python-0.1.706}/src/codemie_sdk/services/codemie_guardrails.py +0 -0
- {codemie_sdk_python-0.1.705 → codemie_sdk_python-0.1.706}/src/codemie_sdk/services/conversation.py +0 -0
- {codemie_sdk_python-0.1.705 → codemie_sdk_python-0.1.706}/src/codemie_sdk/services/cost_center.py +0 -0
- {codemie_sdk_python-0.1.705 → codemie_sdk_python-0.1.706}/src/codemie_sdk/services/customer_config_service.py +0 -0
- {codemie_sdk_python-0.1.705 → codemie_sdk_python-0.1.706}/src/codemie_sdk/services/datasource.py +0 -0
- {codemie_sdk_python-0.1.705 → codemie_sdk_python-0.1.706}/src/codemie_sdk/services/dynamic_config.py +0 -0
- {codemie_sdk_python-0.1.705 → codemie_sdk_python-0.1.706}/src/codemie_sdk/services/files.py +0 -0
- {codemie_sdk_python-0.1.705 → codemie_sdk_python-0.1.706}/src/codemie_sdk/services/integration.py +0 -0
- {codemie_sdk_python-0.1.705 → codemie_sdk_python-0.1.706}/src/codemie_sdk/services/llm.py +0 -0
- {codemie_sdk_python-0.1.705 → codemie_sdk_python-0.1.706}/src/codemie_sdk/services/mcp_configs.py +0 -0
- {codemie_sdk_python-0.1.705 → codemie_sdk_python-0.1.706}/src/codemie_sdk/services/mermaid.py +0 -0
- {codemie_sdk_python-0.1.705 → codemie_sdk_python-0.1.706}/src/codemie_sdk/services/project.py +0 -0
- {codemie_sdk_python-0.1.705 → codemie_sdk_python-0.1.706}/src/codemie_sdk/services/project_budget_groups.py +0 -0
- {codemie_sdk_python-0.1.705 → codemie_sdk_python-0.1.706}/src/codemie_sdk/services/servicenow_integration.py +0 -0
- {codemie_sdk_python-0.1.705 → codemie_sdk_python-0.1.706}/src/codemie_sdk/services/skill.py +0 -0
- {codemie_sdk_python-0.1.705 → codemie_sdk_python-0.1.706}/src/codemie_sdk/services/task.py +0 -0
- {codemie_sdk_python-0.1.705 → codemie_sdk_python-0.1.706}/src/codemie_sdk/services/user.py +0 -0
- {codemie_sdk_python-0.1.705 → codemie_sdk_python-0.1.706}/src/codemie_sdk/services/vendor_assistant.py +0 -0
- {codemie_sdk_python-0.1.705 → codemie_sdk_python-0.1.706}/src/codemie_sdk/services/vendor_guardrail.py +0 -0
- {codemie_sdk_python-0.1.705 → codemie_sdk_python-0.1.706}/src/codemie_sdk/services/vendor_knowledgebase.py +0 -0
- {codemie_sdk_python-0.1.705 → codemie_sdk_python-0.1.706}/src/codemie_sdk/services/vendor_runtime.py +0 -0
- {codemie_sdk_python-0.1.705 → codemie_sdk_python-0.1.706}/src/codemie_sdk/services/vendor_workflow.py +0 -0
- {codemie_sdk_python-0.1.705 → codemie_sdk_python-0.1.706}/src/codemie_sdk/services/webhook.py +0 -0
- {codemie_sdk_python-0.1.705 → codemie_sdk_python-0.1.706}/src/codemie_sdk/services/workflow.py +0 -0
- {codemie_sdk_python-0.1.705 → codemie_sdk_python-0.1.706}/src/codemie_sdk/services/workflow_execution.py +0 -0
- {codemie_sdk_python-0.1.705 → codemie_sdk_python-0.1.706}/src/codemie_sdk/services/workflow_execution_state.py +0 -0
- {codemie_sdk_python-0.1.705 → codemie_sdk_python-0.1.706}/src/codemie_sdk/services/workspace.py +0 -0
- {codemie_sdk_python-0.1.705 → codemie_sdk_python-0.1.706}/src/codemie_sdk/utils/__init__.py +0 -0
- {codemie_sdk_python-0.1.705 → codemie_sdk_python-0.1.706}/src/codemie_sdk/utils/http.py +0 -0
|
@@ -175,6 +175,16 @@ from .models.a2a import (
|
|
|
175
175
|
AgentSkill,
|
|
176
176
|
)
|
|
177
177
|
from .services.a2a import A2AService
|
|
178
|
+
from .models.usage_attribution import (
|
|
179
|
+
UsageAttributionQueryParams,
|
|
180
|
+
UsageAttributionRange,
|
|
181
|
+
UsageAttributionAnalysisSettings,
|
|
182
|
+
UsageAttributionAnalysis,
|
|
183
|
+
UsageAttributionResponse,
|
|
184
|
+
UsageAttributionTableResponse,
|
|
185
|
+
UsageAttributionSettingsResponse,
|
|
186
|
+
)
|
|
187
|
+
from .services.usage_attribution import UsageAttributionService
|
|
178
188
|
|
|
179
189
|
try:
|
|
180
190
|
__version__ = _pkg_version("codemie-sdk-python")
|
|
@@ -311,4 +321,12 @@ __all__ = [
|
|
|
311
321
|
"AgentCapabilities",
|
|
312
322
|
"AgentSkill",
|
|
313
323
|
"A2AService",
|
|
324
|
+
"UsageAttributionQueryParams",
|
|
325
|
+
"UsageAttributionRange",
|
|
326
|
+
"UsageAttributionAnalysisSettings",
|
|
327
|
+
"UsageAttributionAnalysis",
|
|
328
|
+
"UsageAttributionResponse",
|
|
329
|
+
"UsageAttributionTableResponse",
|
|
330
|
+
"UsageAttributionSettingsResponse",
|
|
331
|
+
"UsageAttributionService",
|
|
314
332
|
]
|
|
@@ -33,6 +33,7 @@ from ..services.mcp_configs import MCPConfigsService
|
|
|
33
33
|
from ..services.cost_center import CostCenterService
|
|
34
34
|
from ..services.customer_config_service import CustomerConfigService
|
|
35
35
|
from ..services.project_budget_groups import ProjectBudgetGroupsService
|
|
36
|
+
from ..services.usage_attribution import UsageAttributionService
|
|
36
37
|
from ..services.servicenow_integration import ServiceNowIntegrationService
|
|
37
38
|
|
|
38
39
|
|
|
@@ -193,6 +194,9 @@ class CodeMieClient:
|
|
|
193
194
|
self.workspaces = WorkspaceService(
|
|
194
195
|
self._api_domain, _token_source, verify_ssl=self._verify_ssl
|
|
195
196
|
)
|
|
197
|
+
self.usage_attribution = UsageAttributionService(
|
|
198
|
+
self._api_domain, _token_source, verify_ssl=self._verify_ssl
|
|
199
|
+
)
|
|
196
200
|
|
|
197
201
|
@property
|
|
198
202
|
def token(self) -> str:
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
# Copyright 2026 EPAM Systems, Inc. ("EPAM")
|
|
2
|
+
#
|
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
+
# you may not use this file except in compliance with the License.
|
|
5
|
+
# You may obtain a copy of the License at
|
|
6
|
+
#
|
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
#
|
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
+
# See the License for the specific language governing permissions and
|
|
13
|
+
# limitations under the License.
|
|
14
|
+
|
|
15
|
+
"""Usage Attribution analytics models for the CodeMie SDK."""
|
|
16
|
+
|
|
17
|
+
from typing import Any
|
|
18
|
+
|
|
19
|
+
from pydantic import BaseModel, ConfigDict, Field
|
|
20
|
+
|
|
21
|
+
from .analytics import PaginationMetadata
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
class UsageAttributionQueryParams(BaseModel):
|
|
25
|
+
"""Period parameters shared by the Usage Attribution read endpoints.
|
|
26
|
+
|
|
27
|
+
The endpoints take no project or user filter: they always attribute all usage.
|
|
28
|
+
"""
|
|
29
|
+
|
|
30
|
+
model_config = ConfigDict(extra="ignore")
|
|
31
|
+
|
|
32
|
+
time_period: str | None = Field(
|
|
33
|
+
None,
|
|
34
|
+
description='Time period: "last_hour", "last_6_hours", "last_24_hours", "last_7_days", "last_30_days", "last_60_days", "last_year"',
|
|
35
|
+
)
|
|
36
|
+
start_date: str | None = Field(
|
|
37
|
+
None, description="ISO 8601 start date (use with end_date)"
|
|
38
|
+
)
|
|
39
|
+
end_date: str | None = Field(
|
|
40
|
+
None, description="ISO 8601 end date (use with start_date)"
|
|
41
|
+
)
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
class UsageAttributionRange(BaseModel):
|
|
45
|
+
"""The effective range of a response; ranges longer than the maximum are clamped."""
|
|
46
|
+
|
|
47
|
+
model_config = ConfigDict(extra="ignore", populate_by_name=True)
|
|
48
|
+
|
|
49
|
+
from_: str = Field(alias="from", description="Effective start")
|
|
50
|
+
to: str = Field(description="Effective end")
|
|
51
|
+
days: float = Field(description="Length of the effective range in days")
|
|
52
|
+
clamped: bool = Field(description="The requested range was cut to the maximum")
|
|
53
|
+
requested_from: str | None = Field(None, description="Requested start")
|
|
54
|
+
requested_to: str | None = Field(None, description="Requested end")
|
|
55
|
+
evidence_from: str | None = Field(
|
|
56
|
+
None, description="Start of the evidence window used for categories"
|
|
57
|
+
)
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
class UsageAttributionAnalysisSettings(BaseModel):
|
|
61
|
+
"""The analysis settings behind a response."""
|
|
62
|
+
|
|
63
|
+
model_config = ConfigDict(extra="ignore")
|
|
64
|
+
|
|
65
|
+
hash: str | None = None
|
|
66
|
+
defaults_hash: str | None = None
|
|
67
|
+
schema_version: int | None = None
|
|
68
|
+
overridden: list[str] = Field(default_factory=list)
|
|
69
|
+
tier: str | None = None
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
class UsageAttributionAnalysis(BaseModel):
|
|
73
|
+
"""When and how the cached analysis behind a response was computed."""
|
|
74
|
+
|
|
75
|
+
model_config = ConfigDict(extra="ignore")
|
|
76
|
+
|
|
77
|
+
computed_at: str | None = None
|
|
78
|
+
duration_ms: float | None = None
|
|
79
|
+
cache: str = Field(description="hit, miss, shared or stale")
|
|
80
|
+
stale: bool = False
|
|
81
|
+
refreshing: bool = Field(False, description="A newer analysis is being computed")
|
|
82
|
+
error: str | None = None
|
|
83
|
+
ttl_s: int | None = None
|
|
84
|
+
window: dict[str, Any] | None = None
|
|
85
|
+
evidence_window: dict[str, Any] | None = None
|
|
86
|
+
coverage: dict[str, Any] | None = None
|
|
87
|
+
unclassified_reasons: dict[str, Any] | None = None
|
|
88
|
+
allocated: float | None = None
|
|
89
|
+
timings: dict[str, Any] = Field(default_factory=dict)
|
|
90
|
+
settings: UsageAttributionAnalysisSettings | None = None
|
|
91
|
+
|
|
92
|
+
|
|
93
|
+
class UsageAttributionResponse(BaseModel):
|
|
94
|
+
"""A composite view: totals, tiles, charts, a popup or How It Works."""
|
|
95
|
+
|
|
96
|
+
model_config = ConfigDict(extra="ignore")
|
|
97
|
+
|
|
98
|
+
data: dict[str, Any]
|
|
99
|
+
range: UsageAttributionRange | None = None
|
|
100
|
+
analysis: UsageAttributionAnalysis | None = Field(
|
|
101
|
+
None, description="Absent for the fast totals, which skip the analysis"
|
|
102
|
+
)
|
|
103
|
+
|
|
104
|
+
|
|
105
|
+
class UsageAttributionTableResponse(BaseModel):
|
|
106
|
+
"""A table page: rows of the page, totals over every matching row and filter counts."""
|
|
107
|
+
|
|
108
|
+
model_config = ConfigDict(extra="ignore")
|
|
109
|
+
|
|
110
|
+
data: dict[str, Any] = Field(description="rows and totals")
|
|
111
|
+
pagination: PaginationMetadata
|
|
112
|
+
counts: dict[str, int] = Field(default_factory=dict)
|
|
113
|
+
threshold: float | None = None
|
|
114
|
+
display: dict[str, float] | None = None
|
|
115
|
+
range: UsageAttributionRange
|
|
116
|
+
analysis: UsageAttributionAnalysis
|
|
117
|
+
|
|
118
|
+
|
|
119
|
+
class UsageAttributionSettingsResponse(BaseModel):
|
|
120
|
+
"""The tunable settings schema, the defaults and whether the caller may tune."""
|
|
121
|
+
|
|
122
|
+
model_config = ConfigDict(extra="ignore")
|
|
123
|
+
|
|
124
|
+
data: dict[str, Any]
|
|
@@ -0,0 +1,324 @@
|
|
|
1
|
+
# Copyright 2026 EPAM Systems, Inc. ("EPAM")
|
|
2
|
+
#
|
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
+
# you may not use this file except in compliance with the License.
|
|
5
|
+
# You may obtain a copy of the License at
|
|
6
|
+
#
|
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
#
|
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
+
# See the License for the specific language governing permissions and
|
|
13
|
+
# limitations under the License.
|
|
14
|
+
|
|
15
|
+
"""Usage Attribution analytics service for the CodeMie SDK.
|
|
16
|
+
|
|
17
|
+
Wraps the read endpoints under ``/v1/analytics/usage-attribution``, available to
|
|
18
|
+
admins, maintainers and auditors when the ``features:usageAttribution`` flag is on.
|
|
19
|
+
"""
|
|
20
|
+
|
|
21
|
+
from typing import Any
|
|
22
|
+
from urllib.parse import quote
|
|
23
|
+
|
|
24
|
+
from ..models.usage_attribution import (
|
|
25
|
+
UsageAttributionQueryParams,
|
|
26
|
+
UsageAttributionResponse,
|
|
27
|
+
UsageAttributionSettingsResponse,
|
|
28
|
+
UsageAttributionTableResponse,
|
|
29
|
+
)
|
|
30
|
+
from ..utils import ApiRequestHandler, TokenSource
|
|
31
|
+
|
|
32
|
+
_BASE = "/v1/analytics/usage-attribution"
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
class UsageAttributionService:
|
|
36
|
+
"""Service for reading Usage Attribution analytics: who pays for Web Platform and CLI usage."""
|
|
37
|
+
|
|
38
|
+
def __init__(self, api_domain: str, token: TokenSource, verify_ssl: bool = True):
|
|
39
|
+
"""Initialize the usage attribution service.
|
|
40
|
+
|
|
41
|
+
Args:
|
|
42
|
+
api_domain: Base URL for the CodeMie API
|
|
43
|
+
token: Authentication token
|
|
44
|
+
verify_ssl: Whether to verify SSL certificates
|
|
45
|
+
"""
|
|
46
|
+
self._api = ApiRequestHandler(api_domain, token, verify_ssl)
|
|
47
|
+
|
|
48
|
+
@staticmethod
|
|
49
|
+
def _query(
|
|
50
|
+
params: UsageAttributionQueryParams | None, **extra: Any
|
|
51
|
+
) -> dict[str, Any]:
|
|
52
|
+
"""Period parameters plus the extra ones that were given (None means the server default)."""
|
|
53
|
+
query = params.model_dump(exclude_none=True) if params else {}
|
|
54
|
+
query.update({key: value for key, value in extra.items() if value is not None})
|
|
55
|
+
return query
|
|
56
|
+
|
|
57
|
+
def _get_view(
|
|
58
|
+
self,
|
|
59
|
+
path: str,
|
|
60
|
+
params: UsageAttributionQueryParams | None = None,
|
|
61
|
+
**extra: Any,
|
|
62
|
+
) -> UsageAttributionResponse:
|
|
63
|
+
return self._api.get(
|
|
64
|
+
f"{_BASE}{path}",
|
|
65
|
+
UsageAttributionResponse,
|
|
66
|
+
params=self._query(params, **extra),
|
|
67
|
+
wrap_response=False,
|
|
68
|
+
)
|
|
69
|
+
|
|
70
|
+
def _get_table(
|
|
71
|
+
self,
|
|
72
|
+
path: str,
|
|
73
|
+
params: UsageAttributionQueryParams | None = None,
|
|
74
|
+
**extra: Any,
|
|
75
|
+
) -> UsageAttributionTableResponse:
|
|
76
|
+
return self._api.get(
|
|
77
|
+
f"{_BASE}{path}",
|
|
78
|
+
UsageAttributionTableResponse,
|
|
79
|
+
params=self._query(params, **extra),
|
|
80
|
+
wrap_response=False,
|
|
81
|
+
)
|
|
82
|
+
|
|
83
|
+
def get_totals(
|
|
84
|
+
self, params: UsageAttributionQueryParams | None = None
|
|
85
|
+
) -> UsageAttributionResponse:
|
|
86
|
+
"""Get the fast totals: Total, Web Platform, CLI, Charged Back and Who Pays.
|
|
87
|
+
|
|
88
|
+
Args:
|
|
89
|
+
params: Period parameters
|
|
90
|
+
|
|
91
|
+
Returns:
|
|
92
|
+
UsageAttributionResponse whose data holds the amounts. The analysis
|
|
93
|
+
block is absent for this view.
|
|
94
|
+
|
|
95
|
+
Raises:
|
|
96
|
+
requests.HTTPError: 403 without an allowed role, 404 when the feature is off
|
|
97
|
+
"""
|
|
98
|
+
return self._get_view("/totals", params)
|
|
99
|
+
|
|
100
|
+
def get_status(
|
|
101
|
+
self, params: UsageAttributionQueryParams | None = None
|
|
102
|
+
) -> UsageAttributionResponse:
|
|
103
|
+
"""Get How It Works: coverage, data quality, run details and the settings in effect.
|
|
104
|
+
|
|
105
|
+
Args:
|
|
106
|
+
params: Period parameters
|
|
107
|
+
|
|
108
|
+
Returns:
|
|
109
|
+
UsageAttributionResponse with the analysis block
|
|
110
|
+
"""
|
|
111
|
+
return self._get_view("/status", params)
|
|
112
|
+
|
|
113
|
+
def get_cli_summary(
|
|
114
|
+
self, params: UsageAttributionQueryParams | None = None
|
|
115
|
+
) -> UsageAttributionResponse:
|
|
116
|
+
"""Get the CLI categories: tiles, Who Pays and CLI spend by category.
|
|
117
|
+
|
|
118
|
+
Args:
|
|
119
|
+
params: Period parameters
|
|
120
|
+
|
|
121
|
+
Returns:
|
|
122
|
+
UsageAttributionResponse with tiles, who_pays, categories and the analysis block
|
|
123
|
+
"""
|
|
124
|
+
return self._get_view("/cli-summary", params)
|
|
125
|
+
|
|
126
|
+
def get_settings(self) -> UsageAttributionSettingsResponse:
|
|
127
|
+
"""Get the analysis settings: defaults, tunable schema and what the caller may do.
|
|
128
|
+
|
|
129
|
+
Returns:
|
|
130
|
+
UsageAttributionSettingsResponse, whose data carries ``can_tune`` and ``can_refresh``
|
|
131
|
+
"""
|
|
132
|
+
return self._api.get(
|
|
133
|
+
f"{_BASE}/settings",
|
|
134
|
+
UsageAttributionSettingsResponse,
|
|
135
|
+
wrap_response=False,
|
|
136
|
+
)
|
|
137
|
+
|
|
138
|
+
def get_shared_projects(
|
|
139
|
+
self,
|
|
140
|
+
params: UsageAttributionQueryParams | None = None,
|
|
141
|
+
scope: str | None = None,
|
|
142
|
+
search: str | None = None,
|
|
143
|
+
page: int | None = None,
|
|
144
|
+
per_page: int | None = None,
|
|
145
|
+
sort_by: str | None = None,
|
|
146
|
+
sort_order: str | None = None,
|
|
147
|
+
) -> UsageAttributionTableResponse:
|
|
148
|
+
"""List shared projects without a budget.
|
|
149
|
+
|
|
150
|
+
Args:
|
|
151
|
+
params: Period parameters
|
|
152
|
+
scope: "threshold" (default) or "all"
|
|
153
|
+
search: Case-insensitive text to find in the project name
|
|
154
|
+
page: Zero-indexed page number
|
|
155
|
+
per_page: Items per page
|
|
156
|
+
sort_by: Column to sort by
|
|
157
|
+
sort_order: "asc" or "desc"
|
|
158
|
+
|
|
159
|
+
Returns:
|
|
160
|
+
UsageAttributionTableResponse with the rows of the page and the filter counts
|
|
161
|
+
"""
|
|
162
|
+
return self._get_table(
|
|
163
|
+
"/shared-projects",
|
|
164
|
+
params,
|
|
165
|
+
scope=scope,
|
|
166
|
+
search=search,
|
|
167
|
+
page=page,
|
|
168
|
+
per_page=per_page,
|
|
169
|
+
sort_by=sort_by,
|
|
170
|
+
sort_order=sort_order,
|
|
171
|
+
)
|
|
172
|
+
|
|
173
|
+
def get_shared_project(
|
|
174
|
+
self,
|
|
175
|
+
project_name: str,
|
|
176
|
+
params: UsageAttributionQueryParams | None = None,
|
|
177
|
+
) -> UsageAttributionResponse:
|
|
178
|
+
"""Get the popup of one shared project.
|
|
179
|
+
|
|
180
|
+
Args:
|
|
181
|
+
project_name: Name of the project
|
|
182
|
+
params: Period parameters
|
|
183
|
+
|
|
184
|
+
Returns:
|
|
185
|
+
UsageAttributionResponse whose data holds ``row`` and ``detail``
|
|
186
|
+
|
|
187
|
+
Raises:
|
|
188
|
+
requests.HTTPError: 404 when the project is not in the analysis of the period
|
|
189
|
+
"""
|
|
190
|
+
return self._get_view(
|
|
191
|
+
f"/shared-projects/{quote(project_name, safe='')}", params
|
|
192
|
+
)
|
|
193
|
+
|
|
194
|
+
def get_repository_groups(
|
|
195
|
+
self,
|
|
196
|
+
params: UsageAttributionQueryParams | None = None,
|
|
197
|
+
scope: str | None = None,
|
|
198
|
+
search: str | None = None,
|
|
199
|
+
page: int | None = None,
|
|
200
|
+
per_page: int | None = None,
|
|
201
|
+
sort_by: str | None = None,
|
|
202
|
+
sort_order: str | None = None,
|
|
203
|
+
) -> UsageAttributionTableResponse:
|
|
204
|
+
"""List repository groups in personal projects.
|
|
205
|
+
|
|
206
|
+
Args:
|
|
207
|
+
params: Period parameters
|
|
208
|
+
scope: "threshold" (default) or "all"
|
|
209
|
+
search: Case-insensitive text to find in the group name or its repositories
|
|
210
|
+
page: Zero-indexed page number
|
|
211
|
+
per_page: Items per page
|
|
212
|
+
sort_by: Column to sort by
|
|
213
|
+
sort_order: "asc" or "desc"
|
|
214
|
+
|
|
215
|
+
Returns:
|
|
216
|
+
UsageAttributionTableResponse with the rows of the page and the filter counts
|
|
217
|
+
"""
|
|
218
|
+
return self._get_table(
|
|
219
|
+
"/repository-groups",
|
|
220
|
+
params,
|
|
221
|
+
scope=scope,
|
|
222
|
+
search=search,
|
|
223
|
+
page=page,
|
|
224
|
+
per_page=per_page,
|
|
225
|
+
sort_by=sort_by,
|
|
226
|
+
sort_order=sort_order,
|
|
227
|
+
)
|
|
228
|
+
|
|
229
|
+
def get_repository_group(
|
|
230
|
+
self,
|
|
231
|
+
group_id: str,
|
|
232
|
+
params: UsageAttributionQueryParams | None = None,
|
|
233
|
+
) -> UsageAttributionResponse:
|
|
234
|
+
"""Get the popup of one repository group.
|
|
235
|
+
|
|
236
|
+
Args:
|
|
237
|
+
group_id: Group id as listed by get_repository_groups
|
|
238
|
+
params: Period parameters
|
|
239
|
+
|
|
240
|
+
Returns:
|
|
241
|
+
UsageAttributionResponse whose data holds ``row`` and ``detail``
|
|
242
|
+
|
|
243
|
+
Raises:
|
|
244
|
+
requests.HTTPError: 404 when the group is not in the analysis of the period
|
|
245
|
+
"""
|
|
246
|
+
return self._get_view(f"/repository-groups/{quote(group_id, safe='')}", params)
|
|
247
|
+
|
|
248
|
+
def get_people(
|
|
249
|
+
self,
|
|
250
|
+
params: UsageAttributionQueryParams | None = None,
|
|
251
|
+
filter: str | None = None,
|
|
252
|
+
search: str | None = None,
|
|
253
|
+
page: int | None = None,
|
|
254
|
+
per_page: int | None = None,
|
|
255
|
+
sort_by: str | None = None,
|
|
256
|
+
sort_order: str | None = None,
|
|
257
|
+
) -> UsageAttributionTableResponse:
|
|
258
|
+
"""List people with their spend.
|
|
259
|
+
|
|
260
|
+
Args:
|
|
261
|
+
params: Period parameters
|
|
262
|
+
filter: "all" (default), "cand", "prod", "exp", "shared" or "platform"
|
|
263
|
+
search: Case-insensitive text to find in the name, e-mail or main repository
|
|
264
|
+
page: Zero-indexed page number
|
|
265
|
+
per_page: Items per page
|
|
266
|
+
sort_by: Column to sort by
|
|
267
|
+
sort_order: "asc" or "desc"
|
|
268
|
+
|
|
269
|
+
Returns:
|
|
270
|
+
UsageAttributionTableResponse with the rows of the page and a count per filter
|
|
271
|
+
"""
|
|
272
|
+
return self._get_table(
|
|
273
|
+
"/people",
|
|
274
|
+
params,
|
|
275
|
+
filter=filter,
|
|
276
|
+
search=search,
|
|
277
|
+
page=page,
|
|
278
|
+
per_page=per_page,
|
|
279
|
+
sort_by=sort_by,
|
|
280
|
+
sort_order=sort_order,
|
|
281
|
+
)
|
|
282
|
+
|
|
283
|
+
def get_person(
|
|
284
|
+
self,
|
|
285
|
+
user_id: str,
|
|
286
|
+
params: UsageAttributionQueryParams | None = None,
|
|
287
|
+
) -> UsageAttributionResponse:
|
|
288
|
+
"""Get the popup of one person.
|
|
289
|
+
|
|
290
|
+
Args:
|
|
291
|
+
user_id: User id as listed by get_people
|
|
292
|
+
params: Period parameters
|
|
293
|
+
|
|
294
|
+
Returns:
|
|
295
|
+
UsageAttributionResponse whose data holds ``row`` and ``detail``
|
|
296
|
+
|
|
297
|
+
Raises:
|
|
298
|
+
requests.HTTPError: 404 when the person is not in the analysis of the period
|
|
299
|
+
"""
|
|
300
|
+
return self._get_view(f"/people/{quote(user_id, safe='')}", params)
|
|
301
|
+
|
|
302
|
+
def get_breakdown(
|
|
303
|
+
self,
|
|
304
|
+
params: UsageAttributionQueryParams | None = None,
|
|
305
|
+
dimension: str | None = None,
|
|
306
|
+
category: str | None = None,
|
|
307
|
+
) -> UsageAttributionResponse:
|
|
308
|
+
"""Get CLI spend paid from personal budgets, by country or job title group.
|
|
309
|
+
|
|
310
|
+
Args:
|
|
311
|
+
params: Period parameters
|
|
312
|
+
dimension: "country" (default) or "job"
|
|
313
|
+
category: "production" (default), "learning", "testing", "experimental",
|
|
314
|
+
"pet_project" or "unclassified"
|
|
315
|
+
|
|
316
|
+
Returns:
|
|
317
|
+
UsageAttributionResponse whose data holds ``rows`` (label and spend) and ``total``
|
|
318
|
+
|
|
319
|
+
Raises:
|
|
320
|
+
requests.HTTPError: 404 when user enrichment is disabled
|
|
321
|
+
"""
|
|
322
|
+
return self._get_view(
|
|
323
|
+
"/breakdown", params, dimension=dimension, category=category
|
|
324
|
+
)
|
|
File without changes
|
|
File without changes
|
{codemie_sdk_python-0.1.705 → codemie_sdk_python-0.1.706}/src/codemie_sdk/auth/credentials.py
RENAMED
|
File without changes
|
{codemie_sdk_python-0.1.705 → codemie_sdk_python-0.1.706}/src/codemie_sdk/builders/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{codemie_sdk_python-0.1.705 → codemie_sdk_python-0.1.706}/src/codemie_sdk/client/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
{codemie_sdk_python-0.1.705 → codemie_sdk_python-0.1.706}/src/codemie_sdk/models/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
{codemie_sdk_python-0.1.705 → codemie_sdk_python-0.1.706}/src/codemie_sdk/models/activity_event.py
RENAMED
|
File without changes
|
|
File without changes
|
{codemie_sdk_python-0.1.705 → codemie_sdk_python-0.1.706}/src/codemie_sdk/models/analytics.py
RENAMED
|
File without changes
|
{codemie_sdk_python-0.1.705 → codemie_sdk_python-0.1.706}/src/codemie_sdk/models/assistant.py
RENAMED
|
File without changes
|
{codemie_sdk_python-0.1.705 → codemie_sdk_python-0.1.706}/src/codemie_sdk/models/categories.py
RENAMED
|
File without changes
|
|
File without changes
|
{codemie_sdk_python-0.1.705 → codemie_sdk_python-0.1.706}/src/codemie_sdk/models/conversation.py
RENAMED
|
File without changes
|
{codemie_sdk_python-0.1.705 → codemie_sdk_python-0.1.706}/src/codemie_sdk/models/cost_center.py
RENAMED
|
File without changes
|
{codemie_sdk_python-0.1.705 → codemie_sdk_python-0.1.706}/src/codemie_sdk/models/datasource.py
RENAMED
|
File without changes
|
|
File without changes
|
{codemie_sdk_python-0.1.705 → codemie_sdk_python-0.1.706}/src/codemie_sdk/models/file_operation.py
RENAMED
|
File without changes
|
{codemie_sdk_python-0.1.705 → codemie_sdk_python-0.1.706}/src/codemie_sdk/models/guardrails.py
RENAMED
|
File without changes
|
{codemie_sdk_python-0.1.705 → codemie_sdk_python-0.1.706}/src/codemie_sdk/models/integration.py
RENAMED
|
File without changes
|
|
File without changes
|
{codemie_sdk_python-0.1.705 → codemie_sdk_python-0.1.706}/src/codemie_sdk/models/mcp_config.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{codemie_sdk_python-0.1.705 → codemie_sdk_python-0.1.706}/src/codemie_sdk/models/vendor_assistant.py
RENAMED
|
File without changes
|
{codemie_sdk_python-0.1.705 → codemie_sdk_python-0.1.706}/src/codemie_sdk/models/vendor_guardrail.py
RENAMED
|
File without changes
|
|
File without changes
|
{codemie_sdk_python-0.1.705 → codemie_sdk_python-0.1.706}/src/codemie_sdk/models/vendor_runtime.py
RENAMED
|
File without changes
|
{codemie_sdk_python-0.1.705 → codemie_sdk_python-0.1.706}/src/codemie_sdk/models/vendor_workflow.py
RENAMED
|
File without changes
|
{codemie_sdk_python-0.1.705 → codemie_sdk_python-0.1.706}/src/codemie_sdk/models/workflow.py
RENAMED
|
File without changes
|
|
File without changes
|
{codemie_sdk_python-0.1.705 → codemie_sdk_python-0.1.706}/src/codemie_sdk/models/workflow_state.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{codemie_sdk_python-0.1.705 → codemie_sdk_python-0.1.706}/src/codemie_sdk/models/workspace.py
RENAMED
|
File without changes
|
|
File without changes
|
{codemie_sdk_python-0.1.705 → codemie_sdk_python-0.1.706}/src/codemie_sdk/services/activity_event.py
RENAMED
|
File without changes
|
|
File without changes
|
{codemie_sdk_python-0.1.705 → codemie_sdk_python-0.1.706}/src/codemie_sdk/services/analytics.py
RENAMED
|
File without changes
|
{codemie_sdk_python-0.1.705 → codemie_sdk_python-0.1.706}/src/codemie_sdk/services/assistant.py
RENAMED
|
File without changes
|
{codemie_sdk_python-0.1.705 → codemie_sdk_python-0.1.706}/src/codemie_sdk/services/categories.py
RENAMED
|
File without changes
|
|
File without changes
|
{codemie_sdk_python-0.1.705 → codemie_sdk_python-0.1.706}/src/codemie_sdk/services/conversation.py
RENAMED
|
File without changes
|
{codemie_sdk_python-0.1.705 → codemie_sdk_python-0.1.706}/src/codemie_sdk/services/cost_center.py
RENAMED
|
File without changes
|
|
File without changes
|
{codemie_sdk_python-0.1.705 → codemie_sdk_python-0.1.706}/src/codemie_sdk/services/datasource.py
RENAMED
|
File without changes
|
{codemie_sdk_python-0.1.705 → codemie_sdk_python-0.1.706}/src/codemie_sdk/services/dynamic_config.py
RENAMED
|
File without changes
|
|
File without changes
|
{codemie_sdk_python-0.1.705 → codemie_sdk_python-0.1.706}/src/codemie_sdk/services/integration.py
RENAMED
|
File without changes
|
|
File without changes
|
{codemie_sdk_python-0.1.705 → codemie_sdk_python-0.1.706}/src/codemie_sdk/services/mcp_configs.py
RENAMED
|
File without changes
|
{codemie_sdk_python-0.1.705 → codemie_sdk_python-0.1.706}/src/codemie_sdk/services/mermaid.py
RENAMED
|
File without changes
|
{codemie_sdk_python-0.1.705 → codemie_sdk_python-0.1.706}/src/codemie_sdk/services/project.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{codemie_sdk_python-0.1.705 → codemie_sdk_python-0.1.706}/src/codemie_sdk/services/vendor_runtime.py
RENAMED
|
File without changes
|
|
File without changes
|
{codemie_sdk_python-0.1.705 → codemie_sdk_python-0.1.706}/src/codemie_sdk/services/webhook.py
RENAMED
|
File without changes
|
{codemie_sdk_python-0.1.705 → codemie_sdk_python-0.1.706}/src/codemie_sdk/services/workflow.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{codemie_sdk_python-0.1.705 → codemie_sdk_python-0.1.706}/src/codemie_sdk/services/workspace.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|