diff --git a/.release-please-manifest.json b/.release-please-manifest.json
index 6b7b74c..da59f99 100644
--- a/.release-please-manifest.json
+++ b/.release-please-manifest.json
@@ -1,3 +1,3 @@
{
- ".": "0.3.0"
+ ".": "0.4.0"
}
\ No newline at end of file
diff --git a/.stats.yml b/.stats.yml
index d4f19f2..bc3166c 100644
--- a/.stats.yml
+++ b/.stats.yml
@@ -1,4 +1,4 @@
configured_endpoints: 32
-openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/dedalus-labs/dedalus-8618662d24c795caf31ecb2b62c603c5cb1002386003f3a40854664da766eef4.yml
-openapi_spec_hash: 4dd9388612970bff30995d2a4f53fa59
-config_hash: 1459e41df47cbb91484141371c74dba9
+openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/dedalus-labs/dedalus-a63ad804ae8ee532d57afae307595dae02d2a6924f83657430b3579193560775.yml
+openapi_spec_hash: ccb02923079d91569a17162c88da590b
+config_hash: 0e31b0b75cafdbc25febc2b7ca219799
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 09496f8..f7ec47b 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,13 @@
# Changelog
+## 0.4.0 (2026-05-12)
+
+Full Changelog: [v0.3.0...v0.4.0](https://github.com/dedalus-labs/dedalus-python/compare/v0.3.0...v0.4.0)
+
+### Features
+
+* **api:** add usage endpoints/autosleep ([3ebb476](https://github.com/dedalus-labs/dedalus-python/commit/3ebb476fd66187dce852e6efc8c5ea80d095e0dd))
+
## 0.3.0 (2026-05-12)
Full Changelog: [v0.2.0...v0.3.0](https://github.com/dedalus-labs/dedalus-python/compare/v0.2.0...v0.3.0)
diff --git a/api.md b/api.md
index 4e35082..0f1d5dd 100644
--- a/api.md
+++ b/api.md
@@ -1,24 +1,22 @@
-# Orgs
-
-## Usage
+# Usage
Types:
```python
-from dedalus_sdk.types.orgs import (
+from dedalus_sdk.types import (
+ MachineComputeUsage,
+ MachineComputeUsageRow,
MachineStorageUsage,
- MachineStorageUsageEvidence,
- MachineUsage,
- MachineUsageEvidence,
+ MachineStorageUsageRow,
OrgUsage,
)
```
Methods:
-- client.orgs.usage.retrieve(\*, org_id, \*\*params) -> OrgUsage
-- client.orgs.usage.get_machine_storage_usage(\*, org_id, \*\*params) -> MachineStorageUsage
-- client.orgs.usage.get_machine_usage(\*, org_id, \*\*params) -> MachineUsage
+- client.usage.retrieve(\*\*params) -> OrgUsage
+- client.usage.machine_compute(\*\*params) -> MachineComputeUsage
+- client.usage.machine_storage(\*\*params) -> MachineStorageUsage
# Machines
diff --git a/pyproject.toml b/pyproject.toml
index e76fef6..9fa189c 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -1,6 +1,6 @@
[project]
name = "dedalus-sdk"
-version = "0.3.0"
+version = "0.4.0"
description = "The official Python library for the Dedalus API"
dynamic = ["readme"]
license = "MIT"
diff --git a/src/dedalus_sdk/_client.py b/src/dedalus_sdk/_client.py
index 899c34c..c6dc994 100644
--- a/src/dedalus_sdk/_client.py
+++ b/src/dedalus_sdk/_client.py
@@ -37,8 +37,8 @@
)
if TYPE_CHECKING:
- from .resources import orgs, machines
- from .resources.orgs.orgs import OrgsResource, AsyncOrgsResource
+ from .resources import usage, machines
+ from .resources.usage import UsageResource, AsyncUsageResource
from .resources.machines.machines import MachinesResource, AsyncMachinesResource
__all__ = ["Timeout", "Transport", "ProxiesTypes", "RequestOptions", "Dedalus", "AsyncDedalus", "Client", "AsyncClient"]
@@ -135,10 +135,10 @@ def __init__(
self._default_stream_cls = Stream
@cached_property
- def orgs(self) -> OrgsResource:
- from .resources.orgs import OrgsResource
+ def usage(self) -> UsageResource:
+ from .resources.usage import UsageResource
- return OrgsResource(self)
+ return UsageResource(self)
@cached_property
def machines(self) -> MachinesResource:
@@ -384,10 +384,10 @@ def __init__(
self._default_stream_cls = AsyncStream
@cached_property
- def orgs(self) -> AsyncOrgsResource:
- from .resources.orgs import AsyncOrgsResource
+ def usage(self) -> AsyncUsageResource:
+ from .resources.usage import AsyncUsageResource
- return AsyncOrgsResource(self)
+ return AsyncUsageResource(self)
@cached_property
def machines(self) -> AsyncMachinesResource:
@@ -549,10 +549,10 @@ def __init__(self, client: Dedalus) -> None:
self._client = client
@cached_property
- def orgs(self) -> orgs.OrgsResourceWithRawResponse:
- from .resources.orgs import OrgsResourceWithRawResponse
+ def usage(self) -> usage.UsageResourceWithRawResponse:
+ from .resources.usage import UsageResourceWithRawResponse
- return OrgsResourceWithRawResponse(self._client.orgs)
+ return UsageResourceWithRawResponse(self._client.usage)
@cached_property
def machines(self) -> machines.MachinesResourceWithRawResponse:
@@ -568,10 +568,10 @@ def __init__(self, client: AsyncDedalus) -> None:
self._client = client
@cached_property
- def orgs(self) -> orgs.AsyncOrgsResourceWithRawResponse:
- from .resources.orgs import AsyncOrgsResourceWithRawResponse
+ def usage(self) -> usage.AsyncUsageResourceWithRawResponse:
+ from .resources.usage import AsyncUsageResourceWithRawResponse
- return AsyncOrgsResourceWithRawResponse(self._client.orgs)
+ return AsyncUsageResourceWithRawResponse(self._client.usage)
@cached_property
def machines(self) -> machines.AsyncMachinesResourceWithRawResponse:
@@ -587,10 +587,10 @@ def __init__(self, client: Dedalus) -> None:
self._client = client
@cached_property
- def orgs(self) -> orgs.OrgsResourceWithStreamingResponse:
- from .resources.orgs import OrgsResourceWithStreamingResponse
+ def usage(self) -> usage.UsageResourceWithStreamingResponse:
+ from .resources.usage import UsageResourceWithStreamingResponse
- return OrgsResourceWithStreamingResponse(self._client.orgs)
+ return UsageResourceWithStreamingResponse(self._client.usage)
@cached_property
def machines(self) -> machines.MachinesResourceWithStreamingResponse:
@@ -606,10 +606,10 @@ def __init__(self, client: AsyncDedalus) -> None:
self._client = client
@cached_property
- def orgs(self) -> orgs.AsyncOrgsResourceWithStreamingResponse:
- from .resources.orgs import AsyncOrgsResourceWithStreamingResponse
+ def usage(self) -> usage.AsyncUsageResourceWithStreamingResponse:
+ from .resources.usage import AsyncUsageResourceWithStreamingResponse
- return AsyncOrgsResourceWithStreamingResponse(self._client.orgs)
+ return AsyncUsageResourceWithStreamingResponse(self._client.usage)
@cached_property
def machines(self) -> machines.AsyncMachinesResourceWithStreamingResponse:
diff --git a/src/dedalus_sdk/_version.py b/src/dedalus_sdk/_version.py
index 5167202..ff44f48 100644
--- a/src/dedalus_sdk/_version.py
+++ b/src/dedalus_sdk/_version.py
@@ -1,4 +1,4 @@
# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
__title__ = "dedalus_sdk"
-__version__ = "0.3.0" # x-release-please-version
+__version__ = "0.4.0" # x-release-please-version
diff --git a/src/dedalus_sdk/resources/__init__.py b/src/dedalus_sdk/resources/__init__.py
index 5b131fd..5365a1e 100644
--- a/src/dedalus_sdk/resources/__init__.py
+++ b/src/dedalus_sdk/resources/__init__.py
@@ -1,12 +1,12 @@
# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
-from .orgs import (
- OrgsResource,
- AsyncOrgsResource,
- OrgsResourceWithRawResponse,
- AsyncOrgsResourceWithRawResponse,
- OrgsResourceWithStreamingResponse,
- AsyncOrgsResourceWithStreamingResponse,
+from .usage import (
+ UsageResource,
+ AsyncUsageResource,
+ UsageResourceWithRawResponse,
+ AsyncUsageResourceWithRawResponse,
+ UsageResourceWithStreamingResponse,
+ AsyncUsageResourceWithStreamingResponse,
)
from .machines import (
MachinesResource,
@@ -18,12 +18,12 @@
)
__all__ = [
- "OrgsResource",
- "AsyncOrgsResource",
- "OrgsResourceWithRawResponse",
- "AsyncOrgsResourceWithRawResponse",
- "OrgsResourceWithStreamingResponse",
- "AsyncOrgsResourceWithStreamingResponse",
+ "UsageResource",
+ "AsyncUsageResource",
+ "UsageResourceWithRawResponse",
+ "AsyncUsageResourceWithRawResponse",
+ "UsageResourceWithStreamingResponse",
+ "AsyncUsageResourceWithStreamingResponse",
"MachinesResource",
"AsyncMachinesResource",
"MachinesResourceWithRawResponse",
diff --git a/src/dedalus_sdk/resources/orgs/__init__.py b/src/dedalus_sdk/resources/orgs/__init__.py
deleted file mode 100644
index beaab70..0000000
--- a/src/dedalus_sdk/resources/orgs/__init__.py
+++ /dev/null
@@ -1,33 +0,0 @@
-# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
-
-from .orgs import (
- OrgsResource,
- AsyncOrgsResource,
- OrgsResourceWithRawResponse,
- AsyncOrgsResourceWithRawResponse,
- OrgsResourceWithStreamingResponse,
- AsyncOrgsResourceWithStreamingResponse,
-)
-from .usage import (
- UsageResource,
- AsyncUsageResource,
- UsageResourceWithRawResponse,
- AsyncUsageResourceWithRawResponse,
- UsageResourceWithStreamingResponse,
- AsyncUsageResourceWithStreamingResponse,
-)
-
-__all__ = [
- "UsageResource",
- "AsyncUsageResource",
- "UsageResourceWithRawResponse",
- "AsyncUsageResourceWithRawResponse",
- "UsageResourceWithStreamingResponse",
- "AsyncUsageResourceWithStreamingResponse",
- "OrgsResource",
- "AsyncOrgsResource",
- "OrgsResourceWithRawResponse",
- "AsyncOrgsResourceWithRawResponse",
- "OrgsResourceWithStreamingResponse",
- "AsyncOrgsResourceWithStreamingResponse",
-]
diff --git a/src/dedalus_sdk/resources/orgs/orgs.py b/src/dedalus_sdk/resources/orgs/orgs.py
deleted file mode 100644
index ed577bb..0000000
--- a/src/dedalus_sdk/resources/orgs/orgs.py
+++ /dev/null
@@ -1,102 +0,0 @@
-# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
-
-from __future__ import annotations
-
-from .usage import (
- UsageResource,
- AsyncUsageResource,
- UsageResourceWithRawResponse,
- AsyncUsageResourceWithRawResponse,
- UsageResourceWithStreamingResponse,
- AsyncUsageResourceWithStreamingResponse,
-)
-from ..._compat import cached_property
-from ..._resource import SyncAPIResource, AsyncAPIResource
-
-__all__ = ["OrgsResource", "AsyncOrgsResource"]
-
-
-class OrgsResource(SyncAPIResource):
- @cached_property
- def usage(self) -> UsageResource:
- return UsageResource(self._client)
-
- @cached_property
- def with_raw_response(self) -> OrgsResourceWithRawResponse:
- """
- This property can be used as a prefix for any HTTP method call to return
- the raw response object instead of the parsed content.
-
- For more information, see https://www.github.com/dedalus-labs/dedalus-python#accessing-raw-response-data-eg-headers
- """
- return OrgsResourceWithRawResponse(self)
-
- @cached_property
- def with_streaming_response(self) -> OrgsResourceWithStreamingResponse:
- """
- An alternative to `.with_raw_response` that doesn't eagerly read the response body.
-
- For more information, see https://www.github.com/dedalus-labs/dedalus-python#with_streaming_response
- """
- return OrgsResourceWithStreamingResponse(self)
-
-
-class AsyncOrgsResource(AsyncAPIResource):
- @cached_property
- def usage(self) -> AsyncUsageResource:
- return AsyncUsageResource(self._client)
-
- @cached_property
- def with_raw_response(self) -> AsyncOrgsResourceWithRawResponse:
- """
- This property can be used as a prefix for any HTTP method call to return
- the raw response object instead of the parsed content.
-
- For more information, see https://www.github.com/dedalus-labs/dedalus-python#accessing-raw-response-data-eg-headers
- """
- return AsyncOrgsResourceWithRawResponse(self)
-
- @cached_property
- def with_streaming_response(self) -> AsyncOrgsResourceWithStreamingResponse:
- """
- An alternative to `.with_raw_response` that doesn't eagerly read the response body.
-
- For more information, see https://www.github.com/dedalus-labs/dedalus-python#with_streaming_response
- """
- return AsyncOrgsResourceWithStreamingResponse(self)
-
-
-class OrgsResourceWithRawResponse:
- def __init__(self, orgs: OrgsResource) -> None:
- self._orgs = orgs
-
- @cached_property
- def usage(self) -> UsageResourceWithRawResponse:
- return UsageResourceWithRawResponse(self._orgs.usage)
-
-
-class AsyncOrgsResourceWithRawResponse:
- def __init__(self, orgs: AsyncOrgsResource) -> None:
- self._orgs = orgs
-
- @cached_property
- def usage(self) -> AsyncUsageResourceWithRawResponse:
- return AsyncUsageResourceWithRawResponse(self._orgs.usage)
-
-
-class OrgsResourceWithStreamingResponse:
- def __init__(self, orgs: OrgsResource) -> None:
- self._orgs = orgs
-
- @cached_property
- def usage(self) -> UsageResourceWithStreamingResponse:
- return UsageResourceWithStreamingResponse(self._orgs.usage)
-
-
-class AsyncOrgsResourceWithStreamingResponse:
- def __init__(self, orgs: AsyncOrgsResource) -> None:
- self._orgs = orgs
-
- @cached_property
- def usage(self) -> AsyncUsageResourceWithStreamingResponse:
- return AsyncUsageResourceWithStreamingResponse(self._orgs.usage)
diff --git a/src/dedalus_sdk/resources/orgs/usage.py b/src/dedalus_sdk/resources/usage.py
similarity index 71%
rename from src/dedalus_sdk/resources/orgs/usage.py
rename to src/dedalus_sdk/resources/usage.py
index dd9bf29..b55009d 100644
--- a/src/dedalus_sdk/resources/orgs/usage.py
+++ b/src/dedalus_sdk/resources/usage.py
@@ -4,21 +4,21 @@
import httpx
-from ..._types import Body, Omit, Query, Headers, NotGiven, omit, not_given
-from ..._utils import path_template, maybe_transform, async_maybe_transform
-from ..._compat import cached_property
-from ..._resource import SyncAPIResource, AsyncAPIResource
-from ..._response import (
+from ..types import usage_retrieve_params, usage_machine_compute_params, usage_machine_storage_params
+from .._types import Body, Omit, Query, Headers, NotGiven, omit, not_given
+from .._utils import maybe_transform, async_maybe_transform
+from .._compat import cached_property
+from .._resource import SyncAPIResource, AsyncAPIResource
+from .._response import (
to_raw_response_wrapper,
to_streamed_response_wrapper,
async_to_raw_response_wrapper,
async_to_streamed_response_wrapper,
)
-from ...types.orgs import usage_retrieve_params, usage_get_machine_usage_params, usage_get_machine_storage_usage_params
-from ..._base_client import make_request_options
-from ...types.orgs.org_usage import OrgUsage
-from ...types.orgs.machine_usage import MachineUsage
-from ...types.orgs.machine_storage_usage import MachineStorageUsage
+from .._base_client import make_request_options
+from ..types.org_usage import OrgUsage
+from ..types.machine_compute_usage import MachineComputeUsage
+from ..types.machine_storage_usage import MachineStorageUsage
__all__ = ["UsageResource", "AsyncUsageResource"]
@@ -46,7 +46,6 @@ def with_streaming_response(self) -> UsageResourceWithStreamingResponse:
def retrieve(
self,
*,
- org_id: str,
period_start: str | Omit = omit,
# Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
# The extra values given here take precedence over values defined on the client or passed to this method.
@@ -55,11 +54,12 @@ def retrieve(
extra_body: Body | None = None,
timeout: float | httpx.Timeout | None | NotGiven = not_given,
) -> OrgUsage:
- """
- Get org billed machine usage
+ """Get usage summary
Args:
- period_start: Billing period start (YYYY-MM-DD). Defaults to first of current month.
+ period_start: Billing period start (YYYY-MM-DD).
+
+ Defaults to first of current month.
extra_headers: Send extra headers
@@ -69,10 +69,8 @@ def retrieve(
timeout: Override the client-level default timeout for this request, in seconds
"""
- if not org_id:
- raise ValueError(f"Expected a non-empty value for `org_id` but received {org_id!r}")
return self._get(
- path_template("/v1/orgs/{org_id}/usage", org_id=org_id),
+ "/v1/usage",
options=make_request_options(
extra_headers=extra_headers,
extra_query=extra_query,
@@ -83,10 +81,10 @@ def retrieve(
cast_to=OrgUsage,
)
- def get_machine_storage_usage(
+ def machine_compute(
self,
*,
- org_id: str,
+ granularity: str | Omit = omit,
machine_id: str | Omit = omit,
period_end: str | Omit = omit,
period_start: str | Omit = omit,
@@ -96,16 +94,18 @@ def get_machine_storage_usage(
extra_query: Query | None = None,
extra_body: Body | None = None,
timeout: float | httpx.Timeout | None | NotGiven = not_given,
- ) -> MachineStorageUsage:
+ ) -> MachineComputeUsage:
"""
- List machine storage usage evidence
+ List machine compute usage breakdown
Args:
+ granularity: Usage breakdown granularity: hour or day. Defaults to hour.
+
machine_id: Optional machine ID filter.
- period_end: Last UTC evidence date to include (YYYY-MM-DD). Defaults to current time.
+ period_end: Last UTC usage date to include (YYYY-MM-DD). Defaults to current time.
- period_start: Evidence period start (YYYY-MM-DD). Defaults to first of current month.
+ period_start: Usage period start (YYYY-MM-DD). Defaults to first of current month.
extra_headers: Send extra headers
@@ -115,10 +115,8 @@ def get_machine_storage_usage(
timeout: Override the client-level default timeout for this request, in seconds
"""
- if not org_id:
- raise ValueError(f"Expected a non-empty value for `org_id` but received {org_id!r}")
return self._get(
- path_template("/v1/orgs/{org_id}/usage/storage/machines", org_id=org_id),
+ "/v1/usage/machines/compute",
options=make_request_options(
extra_headers=extra_headers,
extra_query=extra_query,
@@ -126,21 +124,20 @@ def get_machine_storage_usage(
timeout=timeout,
query=maybe_transform(
{
+ "granularity": granularity,
"machine_id": machine_id,
"period_end": period_end,
"period_start": period_start,
},
- usage_get_machine_storage_usage_params.UsageGetMachineStorageUsageParams,
+ usage_machine_compute_params.UsageMachineComputeParams,
),
),
- cast_to=MachineStorageUsage,
+ cast_to=MachineComputeUsage,
)
- def get_machine_usage(
+ def machine_storage(
self,
*,
- org_id: str,
- granularity: str | Omit = omit,
machine_id: str | Omit = omit,
period_end: str | Omit = omit,
period_start: str | Omit = omit,
@@ -150,18 +147,16 @@ def get_machine_usage(
extra_query: Query | None = None,
extra_body: Body | None = None,
timeout: float | httpx.Timeout | None | NotGiven = not_given,
- ) -> MachineUsage:
+ ) -> MachineStorageUsage:
"""
- List machine usage evidence
+ List machine storage usage breakdown
Args:
- granularity: Evidence granularity: hour or day. Defaults to hour.
-
machine_id: Optional machine ID filter.
- period_end: Last UTC evidence date to include (YYYY-MM-DD). Defaults to current time.
+ period_end: Last UTC usage date to include (YYYY-MM-DD). Defaults to current time.
- period_start: Evidence period start (YYYY-MM-DD). Defaults to first of current month.
+ period_start: Usage period start (YYYY-MM-DD). Defaults to first of current month.
extra_headers: Send extra headers
@@ -171,10 +166,8 @@ def get_machine_usage(
timeout: Override the client-level default timeout for this request, in seconds
"""
- if not org_id:
- raise ValueError(f"Expected a non-empty value for `org_id` but received {org_id!r}")
return self._get(
- path_template("/v1/orgs/{org_id}/usage/machines", org_id=org_id),
+ "/v1/usage/machines/storage",
options=make_request_options(
extra_headers=extra_headers,
extra_query=extra_query,
@@ -182,15 +175,14 @@ def get_machine_usage(
timeout=timeout,
query=maybe_transform(
{
- "granularity": granularity,
"machine_id": machine_id,
"period_end": period_end,
"period_start": period_start,
},
- usage_get_machine_usage_params.UsageGetMachineUsageParams,
+ usage_machine_storage_params.UsageMachineStorageParams,
),
),
- cast_to=MachineUsage,
+ cast_to=MachineStorageUsage,
)
@@ -217,7 +209,6 @@ def with_streaming_response(self) -> AsyncUsageResourceWithStreamingResponse:
async def retrieve(
self,
*,
- org_id: str,
period_start: str | Omit = omit,
# Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
# The extra values given here take precedence over values defined on the client or passed to this method.
@@ -226,11 +217,12 @@ async def retrieve(
extra_body: Body | None = None,
timeout: float | httpx.Timeout | None | NotGiven = not_given,
) -> OrgUsage:
- """
- Get org billed machine usage
+ """Get usage summary
Args:
- period_start: Billing period start (YYYY-MM-DD). Defaults to first of current month.
+ period_start: Billing period start (YYYY-MM-DD).
+
+ Defaults to first of current month.
extra_headers: Send extra headers
@@ -240,10 +232,8 @@ async def retrieve(
timeout: Override the client-level default timeout for this request, in seconds
"""
- if not org_id:
- raise ValueError(f"Expected a non-empty value for `org_id` but received {org_id!r}")
return await self._get(
- path_template("/v1/orgs/{org_id}/usage", org_id=org_id),
+ "/v1/usage",
options=make_request_options(
extra_headers=extra_headers,
extra_query=extra_query,
@@ -256,10 +246,10 @@ async def retrieve(
cast_to=OrgUsage,
)
- async def get_machine_storage_usage(
+ async def machine_compute(
self,
*,
- org_id: str,
+ granularity: str | Omit = omit,
machine_id: str | Omit = omit,
period_end: str | Omit = omit,
period_start: str | Omit = omit,
@@ -269,16 +259,18 @@ async def get_machine_storage_usage(
extra_query: Query | None = None,
extra_body: Body | None = None,
timeout: float | httpx.Timeout | None | NotGiven = not_given,
- ) -> MachineStorageUsage:
+ ) -> MachineComputeUsage:
"""
- List machine storage usage evidence
+ List machine compute usage breakdown
Args:
+ granularity: Usage breakdown granularity: hour or day. Defaults to hour.
+
machine_id: Optional machine ID filter.
- period_end: Last UTC evidence date to include (YYYY-MM-DD). Defaults to current time.
+ period_end: Last UTC usage date to include (YYYY-MM-DD). Defaults to current time.
- period_start: Evidence period start (YYYY-MM-DD). Defaults to first of current month.
+ period_start: Usage period start (YYYY-MM-DD). Defaults to first of current month.
extra_headers: Send extra headers
@@ -288,10 +280,8 @@ async def get_machine_storage_usage(
timeout: Override the client-level default timeout for this request, in seconds
"""
- if not org_id:
- raise ValueError(f"Expected a non-empty value for `org_id` but received {org_id!r}")
return await self._get(
- path_template("/v1/orgs/{org_id}/usage/storage/machines", org_id=org_id),
+ "/v1/usage/machines/compute",
options=make_request_options(
extra_headers=extra_headers,
extra_query=extra_query,
@@ -299,21 +289,20 @@ async def get_machine_storage_usage(
timeout=timeout,
query=await async_maybe_transform(
{
+ "granularity": granularity,
"machine_id": machine_id,
"period_end": period_end,
"period_start": period_start,
},
- usage_get_machine_storage_usage_params.UsageGetMachineStorageUsageParams,
+ usage_machine_compute_params.UsageMachineComputeParams,
),
),
- cast_to=MachineStorageUsage,
+ cast_to=MachineComputeUsage,
)
- async def get_machine_usage(
+ async def machine_storage(
self,
*,
- org_id: str,
- granularity: str | Omit = omit,
machine_id: str | Omit = omit,
period_end: str | Omit = omit,
period_start: str | Omit = omit,
@@ -323,18 +312,16 @@ async def get_machine_usage(
extra_query: Query | None = None,
extra_body: Body | None = None,
timeout: float | httpx.Timeout | None | NotGiven = not_given,
- ) -> MachineUsage:
+ ) -> MachineStorageUsage:
"""
- List machine usage evidence
+ List machine storage usage breakdown
Args:
- granularity: Evidence granularity: hour or day. Defaults to hour.
-
machine_id: Optional machine ID filter.
- period_end: Last UTC evidence date to include (YYYY-MM-DD). Defaults to current time.
+ period_end: Last UTC usage date to include (YYYY-MM-DD). Defaults to current time.
- period_start: Evidence period start (YYYY-MM-DD). Defaults to first of current month.
+ period_start: Usage period start (YYYY-MM-DD). Defaults to first of current month.
extra_headers: Send extra headers
@@ -344,10 +331,8 @@ async def get_machine_usage(
timeout: Override the client-level default timeout for this request, in seconds
"""
- if not org_id:
- raise ValueError(f"Expected a non-empty value for `org_id` but received {org_id!r}")
return await self._get(
- path_template("/v1/orgs/{org_id}/usage/machines", org_id=org_id),
+ "/v1/usage/machines/storage",
options=make_request_options(
extra_headers=extra_headers,
extra_query=extra_query,
@@ -355,15 +340,14 @@ async def get_machine_usage(
timeout=timeout,
query=await async_maybe_transform(
{
- "granularity": granularity,
"machine_id": machine_id,
"period_end": period_end,
"period_start": period_start,
},
- usage_get_machine_usage_params.UsageGetMachineUsageParams,
+ usage_machine_storage_params.UsageMachineStorageParams,
),
),
- cast_to=MachineUsage,
+ cast_to=MachineStorageUsage,
)
@@ -374,11 +358,11 @@ def __init__(self, usage: UsageResource) -> None:
self.retrieve = to_raw_response_wrapper(
usage.retrieve,
)
- self.get_machine_storage_usage = to_raw_response_wrapper(
- usage.get_machine_storage_usage,
+ self.machine_compute = to_raw_response_wrapper(
+ usage.machine_compute,
)
- self.get_machine_usage = to_raw_response_wrapper(
- usage.get_machine_usage,
+ self.machine_storage = to_raw_response_wrapper(
+ usage.machine_storage,
)
@@ -389,11 +373,11 @@ def __init__(self, usage: AsyncUsageResource) -> None:
self.retrieve = async_to_raw_response_wrapper(
usage.retrieve,
)
- self.get_machine_storage_usage = async_to_raw_response_wrapper(
- usage.get_machine_storage_usage,
+ self.machine_compute = async_to_raw_response_wrapper(
+ usage.machine_compute,
)
- self.get_machine_usage = async_to_raw_response_wrapper(
- usage.get_machine_usage,
+ self.machine_storage = async_to_raw_response_wrapper(
+ usage.machine_storage,
)
@@ -404,11 +388,11 @@ def __init__(self, usage: UsageResource) -> None:
self.retrieve = to_streamed_response_wrapper(
usage.retrieve,
)
- self.get_machine_storage_usage = to_streamed_response_wrapper(
- usage.get_machine_storage_usage,
+ self.machine_compute = to_streamed_response_wrapper(
+ usage.machine_compute,
)
- self.get_machine_usage = to_streamed_response_wrapper(
- usage.get_machine_usage,
+ self.machine_storage = to_streamed_response_wrapper(
+ usage.machine_storage,
)
@@ -419,9 +403,9 @@ def __init__(self, usage: AsyncUsageResource) -> None:
self.retrieve = async_to_streamed_response_wrapper(
usage.retrieve,
)
- self.get_machine_storage_usage = async_to_streamed_response_wrapper(
- usage.get_machine_storage_usage,
+ self.machine_compute = async_to_streamed_response_wrapper(
+ usage.machine_compute,
)
- self.get_machine_usage = async_to_streamed_response_wrapper(
- usage.get_machine_usage,
+ self.machine_storage = async_to_streamed_response_wrapper(
+ usage.machine_storage,
)
diff --git a/src/dedalus_sdk/types/__init__.py b/src/dedalus_sdk/types/__init__.py
index f4d8525..446e783 100644
--- a/src/dedalus_sdk/types/__init__.py
+++ b/src/dedalus_sdk/types/__init__.py
@@ -3,14 +3,22 @@
from __future__ import annotations
from .machine import Machine as Machine
+from .org_usage import OrgUsage as OrgUsage
from .machine_list import MachineList as MachineList
from .lifecycle_status import LifecycleStatus as LifecycleStatus
from .machine_list_item import MachineListItem as MachineListItem
from .machine_list_params import MachineListParams as MachineListParams
+from .machine_compute_usage import MachineComputeUsage as MachineComputeUsage
from .machine_create_params import MachineCreateParams as MachineCreateParams
+from .machine_storage_usage import MachineStorageUsage as MachineStorageUsage
from .machine_update_params import MachineUpdateParams as MachineUpdateParams
+from .usage_retrieve_params import UsageRetrieveParams as UsageRetrieveParams
from .websocket_reconnection import (
ReconnectingEvent as ReconnectingEvent,
ReconnectingOverrides as ReconnectingOverrides,
)
+from .machine_compute_usage_row import MachineComputeUsageRow as MachineComputeUsageRow
+from .machine_storage_usage_row import MachineStorageUsageRow as MachineStorageUsageRow
+from .usage_machine_compute_params import UsageMachineComputeParams as UsageMachineComputeParams
+from .usage_machine_storage_params import UsageMachineStorageParams as UsageMachineStorageParams
from .websocket_connection_options import WebSocketConnectionOptions as WebSocketConnectionOptions
diff --git a/src/dedalus_sdk/types/machine_compute_usage.py b/src/dedalus_sdk/types/machine_compute_usage.py
new file mode 100644
index 0000000..d762f4f
--- /dev/null
+++ b/src/dedalus_sdk/types/machine_compute_usage.py
@@ -0,0 +1,23 @@
+# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
+
+from typing import List, Optional
+from datetime import datetime
+
+from .._models import BaseModel
+from .machine_compute_usage_row import MachineComputeUsageRow
+
+__all__ = ["MachineComputeUsage"]
+
+
+class MachineComputeUsage(BaseModel):
+ granularity: str
+ """Usage breakdown granularity used for rows: hour or day."""
+
+ period_end: datetime
+ """Exclusive usage period end."""
+
+ period_start: datetime
+ """Inclusive usage period start."""
+
+ rows: Optional[List[MachineComputeUsageRow]] = None
+ """Machine-level compute usage breakdown rows."""
diff --git a/src/dedalus_sdk/types/orgs/machine_usage_evidence.py b/src/dedalus_sdk/types/machine_compute_usage_row.py
similarity index 73%
rename from src/dedalus_sdk/types/orgs/machine_usage_evidence.py
rename to src/dedalus_sdk/types/machine_compute_usage_row.py
index 805d147..dad85a9 100644
--- a/src/dedalus_sdk/types/orgs/machine_usage_evidence.py
+++ b/src/dedalus_sdk/types/machine_compute_usage_row.py
@@ -3,23 +3,23 @@
from typing import List, Optional
from datetime import datetime
-from ..._models import BaseModel
+from .._models import BaseModel
-__all__ = ["MachineUsageEvidence"]
+__all__ = ["MachineComputeUsageRow"]
-class MachineUsageEvidence(BaseModel):
+class MachineComputeUsageRow(BaseModel):
awake_seconds: int
"""Machine-awake seconds in this bucket."""
bucket_end: datetime
- """Exclusive evidence bucket end."""
+ """Exclusive usage bucket end."""
bucket_start: datetime
- """Inclusive evidence bucket start."""
+ """Inclusive usage bucket start."""
cpu_millicore_seconds: int
- """Requested vCPU millicores multiplied by active CPU seconds."""
+ """Requested vCPU millicores multiplied by guest-owned active CPU seconds."""
last_window_end: datetime
"""Latest raw window_end represented by this row."""
@@ -28,10 +28,10 @@ class MachineUsageEvidence(BaseModel):
"""Machine identifier."""
memory_mib_seconds: int
- """Requested memory MiB multiplied by awake seconds."""
+ """Requested memory MiB multiplied by running allocation seconds."""
org_metering_bucket_ids: Optional[List[str]] = None
- """Org compute bucket IDs this evidence row contributes to."""
+ """Org compute bucket IDs this row contributes to."""
requested_memory_mib: int
"""Requested memory for this shape, in MiB."""
@@ -52,7 +52,7 @@ class MachineUsageEvidence(BaseModel):
"""Stripe memory meter event identifiers linked to those org buckets."""
window_count: int
- """Raw usage windows compacted into this evidence row."""
+ """Raw usage windows compacted into this row."""
latest_stripe_emitted_at: Optional[datetime] = None
"""Latest Stripe emission timestamp for linked org buckets, when emitted."""
diff --git a/src/dedalus_sdk/types/machine_storage_usage.py b/src/dedalus_sdk/types/machine_storage_usage.py
new file mode 100644
index 0000000..795d271
--- /dev/null
+++ b/src/dedalus_sdk/types/machine_storage_usage.py
@@ -0,0 +1,20 @@
+# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
+
+from typing import List, Optional
+from datetime import datetime
+
+from .._models import BaseModel
+from .machine_storage_usage_row import MachineStorageUsageRow
+
+__all__ = ["MachineStorageUsage"]
+
+
+class MachineStorageUsage(BaseModel):
+ period_end: datetime
+ """Exclusive usage period end."""
+
+ period_start: datetime
+ """Inclusive usage period start."""
+
+ rows: Optional[List[MachineStorageUsageRow]] = None
+ """Machine-level storage usage breakdown rows."""
diff --git a/src/dedalus_sdk/types/orgs/machine_storage_usage_evidence.py b/src/dedalus_sdk/types/machine_storage_usage_row.py
similarity index 72%
rename from src/dedalus_sdk/types/orgs/machine_storage_usage_evidence.py
rename to src/dedalus_sdk/types/machine_storage_usage_row.py
index f38c2b2..88becc2 100644
--- a/src/dedalus_sdk/types/orgs/machine_storage_usage_evidence.py
+++ b/src/dedalus_sdk/types/machine_storage_usage_row.py
@@ -3,17 +3,17 @@
from typing import Optional
from datetime import datetime
-from ..._models import BaseModel
+from .._models import BaseModel
-__all__ = ["MachineStorageUsageEvidence"]
+__all__ = ["MachineStorageUsageRow"]
-class MachineStorageUsageEvidence(BaseModel):
+class MachineStorageUsageRow(BaseModel):
bucket_end: datetime
- """Exclusive evidence bucket end."""
+ """Exclusive usage bucket end."""
bucket_start: datetime
- """Inclusive evidence bucket start."""
+ """Inclusive usage bucket start."""
logical_storage_bytes: int
"""Machine logical bytes observed for storage allocation."""
@@ -22,7 +22,7 @@ class MachineStorageUsageEvidence(BaseModel):
"""Machine identifier."""
org_metering_bucket_id: str
- """Org storage bucket ID this evidence row contributes to."""
+ """Org storage bucket ID this row contributes to."""
storage_mib_seconds: int
"""Allocated logical MiB-seconds for this machine."""
diff --git a/src/dedalus_sdk/types/orgs/org_usage.py b/src/dedalus_sdk/types/org_usage.py
similarity index 77%
rename from src/dedalus_sdk/types/orgs/org_usage.py
rename to src/dedalus_sdk/types/org_usage.py
index d61ee23..482c546 100644
--- a/src/dedalus_sdk/types/orgs/org_usage.py
+++ b/src/dedalus_sdk/types/org_usage.py
@@ -1,6 +1,6 @@
# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
-from ..._models import BaseModel
+from .._models import BaseModel
__all__ = ["OrgUsage"]
@@ -11,8 +11,8 @@ class OrgUsage(BaseModel):
billed_cpu_millicore_seconds: int
"""
- Closed requested vCPU millicores multiplied by active CPU seconds for the
- period.
+ Closed requested vCPU millicores multiplied by guest-owned active CPU seconds
+ for the period.
"""
billed_logical_storage_mib_seconds: int
@@ -22,7 +22,10 @@ class OrgUsage(BaseModel):
"""
billed_memory_mib_seconds: int
- """Closed requested memory MiB multiplied by awake seconds for the period."""
+ """
+ Closed requested memory MiB multiplied by running allocation seconds for the
+ period.
+ """
included_storage_gib: int
"""Plan-included storage in GiB, used as a local guardrail only."""
diff --git a/src/dedalus_sdk/types/orgs/__init__.py b/src/dedalus_sdk/types/orgs/__init__.py
deleted file mode 100644
index d788a05..0000000
--- a/src/dedalus_sdk/types/orgs/__init__.py
+++ /dev/null
@@ -1,14 +0,0 @@
-# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
-
-from __future__ import annotations
-
-from .org_usage import OrgUsage as OrgUsage
-from .machine_usage import MachineUsage as MachineUsage
-from .machine_storage_usage import MachineStorageUsage as MachineStorageUsage
-from .usage_retrieve_params import UsageRetrieveParams as UsageRetrieveParams
-from .machine_usage_evidence import MachineUsageEvidence as MachineUsageEvidence
-from .machine_storage_usage_evidence import MachineStorageUsageEvidence as MachineStorageUsageEvidence
-from .usage_get_machine_usage_params import UsageGetMachineUsageParams as UsageGetMachineUsageParams
-from .usage_get_machine_storage_usage_params import (
- UsageGetMachineStorageUsageParams as UsageGetMachineStorageUsageParams,
-)
diff --git a/src/dedalus_sdk/types/orgs/machine_storage_usage.py b/src/dedalus_sdk/types/orgs/machine_storage_usage.py
deleted file mode 100644
index 60d25f4..0000000
--- a/src/dedalus_sdk/types/orgs/machine_storage_usage.py
+++ /dev/null
@@ -1,20 +0,0 @@
-# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
-
-from typing import List, Optional
-from datetime import datetime
-
-from ..._models import BaseModel
-from .machine_storage_usage_evidence import MachineStorageUsageEvidence
-
-__all__ = ["MachineStorageUsage"]
-
-
-class MachineStorageUsage(BaseModel):
- period_end: datetime
- """Exclusive evidence period end."""
-
- period_start: datetime
- """Inclusive evidence period start."""
-
- rows: Optional[List[MachineStorageUsageEvidence]] = None
- """Machine-level storage usage evidence rows."""
diff --git a/src/dedalus_sdk/types/orgs/machine_usage.py b/src/dedalus_sdk/types/orgs/machine_usage.py
deleted file mode 100644
index 0f40345..0000000
--- a/src/dedalus_sdk/types/orgs/machine_usage.py
+++ /dev/null
@@ -1,23 +0,0 @@
-# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
-
-from typing import List, Optional
-from datetime import datetime
-
-from ..._models import BaseModel
-from .machine_usage_evidence import MachineUsageEvidence
-
-__all__ = ["MachineUsage"]
-
-
-class MachineUsage(BaseModel):
- granularity: str
- """Evidence granularity used for rows: hour or day."""
-
- period_end: datetime
- """Exclusive evidence period end."""
-
- period_start: datetime
- """Inclusive evidence period start."""
-
- rows: Optional[List[MachineUsageEvidence]] = None
- """Machine-level usage evidence rows."""
diff --git a/src/dedalus_sdk/types/orgs/usage_get_machine_storage_usage_params.py b/src/dedalus_sdk/types/orgs/usage_get_machine_storage_usage_params.py
deleted file mode 100644
index 1e8b263..0000000
--- a/src/dedalus_sdk/types/orgs/usage_get_machine_storage_usage_params.py
+++ /dev/null
@@ -1,20 +0,0 @@
-# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
-
-from __future__ import annotations
-
-from typing_extensions import Required, TypedDict
-
-__all__ = ["UsageGetMachineStorageUsageParams"]
-
-
-class UsageGetMachineStorageUsageParams(TypedDict, total=False):
- org_id: Required[str]
-
- machine_id: str
- """Optional machine ID filter."""
-
- period_end: str
- """Last UTC evidence date to include (YYYY-MM-DD). Defaults to current time."""
-
- period_start: str
- """Evidence period start (YYYY-MM-DD). Defaults to first of current month."""
diff --git a/src/dedalus_sdk/types/orgs/usage_get_machine_usage_params.py b/src/dedalus_sdk/types/orgs/usage_get_machine_usage_params.py
deleted file mode 100644
index bafc90c..0000000
--- a/src/dedalus_sdk/types/orgs/usage_get_machine_usage_params.py
+++ /dev/null
@@ -1,23 +0,0 @@
-# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
-
-from __future__ import annotations
-
-from typing_extensions import Required, TypedDict
-
-__all__ = ["UsageGetMachineUsageParams"]
-
-
-class UsageGetMachineUsageParams(TypedDict, total=False):
- org_id: Required[str]
-
- granularity: str
- """Evidence granularity: hour or day. Defaults to hour."""
-
- machine_id: str
- """Optional machine ID filter."""
-
- period_end: str
- """Last UTC evidence date to include (YYYY-MM-DD). Defaults to current time."""
-
- period_start: str
- """Evidence period start (YYYY-MM-DD). Defaults to first of current month."""
diff --git a/src/dedalus_sdk/types/usage_machine_compute_params.py b/src/dedalus_sdk/types/usage_machine_compute_params.py
new file mode 100644
index 0000000..9cc30c0
--- /dev/null
+++ b/src/dedalus_sdk/types/usage_machine_compute_params.py
@@ -0,0 +1,21 @@
+# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
+
+from __future__ import annotations
+
+from typing_extensions import TypedDict
+
+__all__ = ["UsageMachineComputeParams"]
+
+
+class UsageMachineComputeParams(TypedDict, total=False):
+ granularity: str
+ """Usage breakdown granularity: hour or day. Defaults to hour."""
+
+ machine_id: str
+ """Optional machine ID filter."""
+
+ period_end: str
+ """Last UTC usage date to include (YYYY-MM-DD). Defaults to current time."""
+
+ period_start: str
+ """Usage period start (YYYY-MM-DD). Defaults to first of current month."""
diff --git a/src/dedalus_sdk/types/usage_machine_storage_params.py b/src/dedalus_sdk/types/usage_machine_storage_params.py
new file mode 100644
index 0000000..35d8e07
--- /dev/null
+++ b/src/dedalus_sdk/types/usage_machine_storage_params.py
@@ -0,0 +1,18 @@
+# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
+
+from __future__ import annotations
+
+from typing_extensions import TypedDict
+
+__all__ = ["UsageMachineStorageParams"]
+
+
+class UsageMachineStorageParams(TypedDict, total=False):
+ machine_id: str
+ """Optional machine ID filter."""
+
+ period_end: str
+ """Last UTC usage date to include (YYYY-MM-DD). Defaults to current time."""
+
+ period_start: str
+ """Usage period start (YYYY-MM-DD). Defaults to first of current month."""
diff --git a/src/dedalus_sdk/types/orgs/usage_retrieve_params.py b/src/dedalus_sdk/types/usage_retrieve_params.py
similarity index 80%
rename from src/dedalus_sdk/types/orgs/usage_retrieve_params.py
rename to src/dedalus_sdk/types/usage_retrieve_params.py
index 429b805..5170bf1 100644
--- a/src/dedalus_sdk/types/orgs/usage_retrieve_params.py
+++ b/src/dedalus_sdk/types/usage_retrieve_params.py
@@ -2,13 +2,11 @@
from __future__ import annotations
-from typing_extensions import Required, TypedDict
+from typing_extensions import TypedDict
__all__ = ["UsageRetrieveParams"]
class UsageRetrieveParams(TypedDict, total=False):
- org_id: Required[str]
-
period_start: str
"""Billing period start (YYYY-MM-DD). Defaults to first of current month."""
diff --git a/tests/api_resources/orgs/__init__.py b/tests/api_resources/orgs/__init__.py
deleted file mode 100644
index fd8019a..0000000
--- a/tests/api_resources/orgs/__init__.py
+++ /dev/null
@@ -1 +0,0 @@
-# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
diff --git a/tests/api_resources/orgs/test_usage.py b/tests/api_resources/orgs/test_usage.py
deleted file mode 100644
index 1d6d9d1..0000000
--- a/tests/api_resources/orgs/test_usage.py
+++ /dev/null
@@ -1,314 +0,0 @@
-# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
-
-from __future__ import annotations
-
-import os
-from typing import Any, cast
-
-import pytest
-
-from dedalus_sdk import Dedalus, AsyncDedalus
-from tests.utils import assert_matches_type
-from dedalus_sdk.types.orgs import (
- OrgUsage,
- MachineUsage,
- MachineStorageUsage,
-)
-
-base_url = os.environ.get("TEST_API_BASE_URL", "http://127.0.0.1:4010")
-
-
-class TestUsage:
- parametrize = pytest.mark.parametrize("client", [False, True], indirect=True, ids=["loose", "strict"])
-
- @parametrize
- def test_method_retrieve(self, client: Dedalus) -> None:
- usage = client.orgs.usage.retrieve(
- org_id="org_id",
- )
- assert_matches_type(OrgUsage, usage, path=["response"])
-
- @parametrize
- def test_method_retrieve_with_all_params(self, client: Dedalus) -> None:
- usage = client.orgs.usage.retrieve(
- org_id="org_id",
- period_start="period_start",
- )
- assert_matches_type(OrgUsage, usage, path=["response"])
-
- @parametrize
- def test_raw_response_retrieve(self, client: Dedalus) -> None:
- response = client.orgs.usage.with_raw_response.retrieve(
- org_id="org_id",
- )
-
- assert response.is_closed is True
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
- usage = response.parse()
- assert_matches_type(OrgUsage, usage, path=["response"])
-
- @parametrize
- def test_streaming_response_retrieve(self, client: Dedalus) -> None:
- with client.orgs.usage.with_streaming_response.retrieve(
- org_id="org_id",
- ) as response:
- assert not response.is_closed
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-
- usage = response.parse()
- assert_matches_type(OrgUsage, usage, path=["response"])
-
- assert cast(Any, response.is_closed) is True
-
- @parametrize
- def test_path_params_retrieve(self, client: Dedalus) -> None:
- with pytest.raises(ValueError, match=r"Expected a non-empty value for `org_id` but received ''"):
- client.orgs.usage.with_raw_response.retrieve(
- org_id="",
- )
-
- @parametrize
- def test_method_get_machine_storage_usage(self, client: Dedalus) -> None:
- usage = client.orgs.usage.get_machine_storage_usage(
- org_id="org_id",
- )
- assert_matches_type(MachineStorageUsage, usage, path=["response"])
-
- @parametrize
- def test_method_get_machine_storage_usage_with_all_params(self, client: Dedalus) -> None:
- usage = client.orgs.usage.get_machine_storage_usage(
- org_id="org_id",
- machine_id="machine_id",
- period_end="period_end",
- period_start="period_start",
- )
- assert_matches_type(MachineStorageUsage, usage, path=["response"])
-
- @parametrize
- def test_raw_response_get_machine_storage_usage(self, client: Dedalus) -> None:
- response = client.orgs.usage.with_raw_response.get_machine_storage_usage(
- org_id="org_id",
- )
-
- assert response.is_closed is True
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
- usage = response.parse()
- assert_matches_type(MachineStorageUsage, usage, path=["response"])
-
- @parametrize
- def test_streaming_response_get_machine_storage_usage(self, client: Dedalus) -> None:
- with client.orgs.usage.with_streaming_response.get_machine_storage_usage(
- org_id="org_id",
- ) as response:
- assert not response.is_closed
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-
- usage = response.parse()
- assert_matches_type(MachineStorageUsage, usage, path=["response"])
-
- assert cast(Any, response.is_closed) is True
-
- @parametrize
- def test_path_params_get_machine_storage_usage(self, client: Dedalus) -> None:
- with pytest.raises(ValueError, match=r"Expected a non-empty value for `org_id` but received ''"):
- client.orgs.usage.with_raw_response.get_machine_storage_usage(
- org_id="",
- )
-
- @parametrize
- def test_method_get_machine_usage(self, client: Dedalus) -> None:
- usage = client.orgs.usage.get_machine_usage(
- org_id="org_id",
- )
- assert_matches_type(MachineUsage, usage, path=["response"])
-
- @parametrize
- def test_method_get_machine_usage_with_all_params(self, client: Dedalus) -> None:
- usage = client.orgs.usage.get_machine_usage(
- org_id="org_id",
- granularity="granularity",
- machine_id="machine_id",
- period_end="period_end",
- period_start="period_start",
- )
- assert_matches_type(MachineUsage, usage, path=["response"])
-
- @parametrize
- def test_raw_response_get_machine_usage(self, client: Dedalus) -> None:
- response = client.orgs.usage.with_raw_response.get_machine_usage(
- org_id="org_id",
- )
-
- assert response.is_closed is True
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
- usage = response.parse()
- assert_matches_type(MachineUsage, usage, path=["response"])
-
- @parametrize
- def test_streaming_response_get_machine_usage(self, client: Dedalus) -> None:
- with client.orgs.usage.with_streaming_response.get_machine_usage(
- org_id="org_id",
- ) as response:
- assert not response.is_closed
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-
- usage = response.parse()
- assert_matches_type(MachineUsage, usage, path=["response"])
-
- assert cast(Any, response.is_closed) is True
-
- @parametrize
- def test_path_params_get_machine_usage(self, client: Dedalus) -> None:
- with pytest.raises(ValueError, match=r"Expected a non-empty value for `org_id` but received ''"):
- client.orgs.usage.with_raw_response.get_machine_usage(
- org_id="",
- )
-
-
-class TestAsyncUsage:
- parametrize = pytest.mark.parametrize(
- "async_client", [False, True, {"http_client": "aiohttp"}], indirect=True, ids=["loose", "strict", "aiohttp"]
- )
-
- @parametrize
- async def test_method_retrieve(self, async_client: AsyncDedalus) -> None:
- usage = await async_client.orgs.usage.retrieve(
- org_id="org_id",
- )
- assert_matches_type(OrgUsage, usage, path=["response"])
-
- @parametrize
- async def test_method_retrieve_with_all_params(self, async_client: AsyncDedalus) -> None:
- usage = await async_client.orgs.usage.retrieve(
- org_id="org_id",
- period_start="period_start",
- )
- assert_matches_type(OrgUsage, usage, path=["response"])
-
- @parametrize
- async def test_raw_response_retrieve(self, async_client: AsyncDedalus) -> None:
- response = await async_client.orgs.usage.with_raw_response.retrieve(
- org_id="org_id",
- )
-
- assert response.is_closed is True
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
- usage = await response.parse()
- assert_matches_type(OrgUsage, usage, path=["response"])
-
- @parametrize
- async def test_streaming_response_retrieve(self, async_client: AsyncDedalus) -> None:
- async with async_client.orgs.usage.with_streaming_response.retrieve(
- org_id="org_id",
- ) as response:
- assert not response.is_closed
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-
- usage = await response.parse()
- assert_matches_type(OrgUsage, usage, path=["response"])
-
- assert cast(Any, response.is_closed) is True
-
- @parametrize
- async def test_path_params_retrieve(self, async_client: AsyncDedalus) -> None:
- with pytest.raises(ValueError, match=r"Expected a non-empty value for `org_id` but received ''"):
- await async_client.orgs.usage.with_raw_response.retrieve(
- org_id="",
- )
-
- @parametrize
- async def test_method_get_machine_storage_usage(self, async_client: AsyncDedalus) -> None:
- usage = await async_client.orgs.usage.get_machine_storage_usage(
- org_id="org_id",
- )
- assert_matches_type(MachineStorageUsage, usage, path=["response"])
-
- @parametrize
- async def test_method_get_machine_storage_usage_with_all_params(self, async_client: AsyncDedalus) -> None:
- usage = await async_client.orgs.usage.get_machine_storage_usage(
- org_id="org_id",
- machine_id="machine_id",
- period_end="period_end",
- period_start="period_start",
- )
- assert_matches_type(MachineStorageUsage, usage, path=["response"])
-
- @parametrize
- async def test_raw_response_get_machine_storage_usage(self, async_client: AsyncDedalus) -> None:
- response = await async_client.orgs.usage.with_raw_response.get_machine_storage_usage(
- org_id="org_id",
- )
-
- assert response.is_closed is True
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
- usage = await response.parse()
- assert_matches_type(MachineStorageUsage, usage, path=["response"])
-
- @parametrize
- async def test_streaming_response_get_machine_storage_usage(self, async_client: AsyncDedalus) -> None:
- async with async_client.orgs.usage.with_streaming_response.get_machine_storage_usage(
- org_id="org_id",
- ) as response:
- assert not response.is_closed
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-
- usage = await response.parse()
- assert_matches_type(MachineStorageUsage, usage, path=["response"])
-
- assert cast(Any, response.is_closed) is True
-
- @parametrize
- async def test_path_params_get_machine_storage_usage(self, async_client: AsyncDedalus) -> None:
- with pytest.raises(ValueError, match=r"Expected a non-empty value for `org_id` but received ''"):
- await async_client.orgs.usage.with_raw_response.get_machine_storage_usage(
- org_id="",
- )
-
- @parametrize
- async def test_method_get_machine_usage(self, async_client: AsyncDedalus) -> None:
- usage = await async_client.orgs.usage.get_machine_usage(
- org_id="org_id",
- )
- assert_matches_type(MachineUsage, usage, path=["response"])
-
- @parametrize
- async def test_method_get_machine_usage_with_all_params(self, async_client: AsyncDedalus) -> None:
- usage = await async_client.orgs.usage.get_machine_usage(
- org_id="org_id",
- granularity="granularity",
- machine_id="machine_id",
- period_end="period_end",
- period_start="period_start",
- )
- assert_matches_type(MachineUsage, usage, path=["response"])
-
- @parametrize
- async def test_raw_response_get_machine_usage(self, async_client: AsyncDedalus) -> None:
- response = await async_client.orgs.usage.with_raw_response.get_machine_usage(
- org_id="org_id",
- )
-
- assert response.is_closed is True
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
- usage = await response.parse()
- assert_matches_type(MachineUsage, usage, path=["response"])
-
- @parametrize
- async def test_streaming_response_get_machine_usage(self, async_client: AsyncDedalus) -> None:
- async with async_client.orgs.usage.with_streaming_response.get_machine_usage(
- org_id="org_id",
- ) as response:
- assert not response.is_closed
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-
- usage = await response.parse()
- assert_matches_type(MachineUsage, usage, path=["response"])
-
- assert cast(Any, response.is_closed) is True
-
- @parametrize
- async def test_path_params_get_machine_usage(self, async_client: AsyncDedalus) -> None:
- with pytest.raises(ValueError, match=r"Expected a non-empty value for `org_id` but received ''"):
- await async_client.orgs.usage.with_raw_response.get_machine_usage(
- org_id="",
- )
diff --git a/tests/api_resources/test_usage.py b/tests/api_resources/test_usage.py
new file mode 100644
index 0000000..ca8aa7e
--- /dev/null
+++ b/tests/api_resources/test_usage.py
@@ -0,0 +1,230 @@
+# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
+
+from __future__ import annotations
+
+import os
+from typing import Any, cast
+
+import pytest
+
+from dedalus_sdk import Dedalus, AsyncDedalus
+from tests.utils import assert_matches_type
+from dedalus_sdk.types import (
+ OrgUsage,
+ MachineComputeUsage,
+ MachineStorageUsage,
+)
+
+base_url = os.environ.get("TEST_API_BASE_URL", "http://127.0.0.1:4010")
+
+
+class TestUsage:
+ parametrize = pytest.mark.parametrize("client", [False, True], indirect=True, ids=["loose", "strict"])
+
+ @parametrize
+ def test_method_retrieve(self, client: Dedalus) -> None:
+ usage = client.usage.retrieve()
+ assert_matches_type(OrgUsage, usage, path=["response"])
+
+ @parametrize
+ def test_method_retrieve_with_all_params(self, client: Dedalus) -> None:
+ usage = client.usage.retrieve(
+ period_start="period_start",
+ )
+ assert_matches_type(OrgUsage, usage, path=["response"])
+
+ @parametrize
+ def test_raw_response_retrieve(self, client: Dedalus) -> None:
+ response = client.usage.with_raw_response.retrieve()
+
+ assert response.is_closed is True
+ assert response.http_request.headers.get("X-Stainless-Lang") == "python"
+ usage = response.parse()
+ assert_matches_type(OrgUsage, usage, path=["response"])
+
+ @parametrize
+ def test_streaming_response_retrieve(self, client: Dedalus) -> None:
+ with client.usage.with_streaming_response.retrieve() as response:
+ assert not response.is_closed
+ assert response.http_request.headers.get("X-Stainless-Lang") == "python"
+
+ usage = response.parse()
+ assert_matches_type(OrgUsage, usage, path=["response"])
+
+ assert cast(Any, response.is_closed) is True
+
+ @parametrize
+ def test_method_machine_compute(self, client: Dedalus) -> None:
+ usage = client.usage.machine_compute()
+ assert_matches_type(MachineComputeUsage, usage, path=["response"])
+
+ @parametrize
+ def test_method_machine_compute_with_all_params(self, client: Dedalus) -> None:
+ usage = client.usage.machine_compute(
+ granularity="granularity",
+ machine_id="machine_id",
+ period_end="period_end",
+ period_start="period_start",
+ )
+ assert_matches_type(MachineComputeUsage, usage, path=["response"])
+
+ @parametrize
+ def test_raw_response_machine_compute(self, client: Dedalus) -> None:
+ response = client.usage.with_raw_response.machine_compute()
+
+ assert response.is_closed is True
+ assert response.http_request.headers.get("X-Stainless-Lang") == "python"
+ usage = response.parse()
+ assert_matches_type(MachineComputeUsage, usage, path=["response"])
+
+ @parametrize
+ def test_streaming_response_machine_compute(self, client: Dedalus) -> None:
+ with client.usage.with_streaming_response.machine_compute() as response:
+ assert not response.is_closed
+ assert response.http_request.headers.get("X-Stainless-Lang") == "python"
+
+ usage = response.parse()
+ assert_matches_type(MachineComputeUsage, usage, path=["response"])
+
+ assert cast(Any, response.is_closed) is True
+
+ @parametrize
+ def test_method_machine_storage(self, client: Dedalus) -> None:
+ usage = client.usage.machine_storage()
+ assert_matches_type(MachineStorageUsage, usage, path=["response"])
+
+ @parametrize
+ def test_method_machine_storage_with_all_params(self, client: Dedalus) -> None:
+ usage = client.usage.machine_storage(
+ machine_id="machine_id",
+ period_end="period_end",
+ period_start="period_start",
+ )
+ assert_matches_type(MachineStorageUsage, usage, path=["response"])
+
+ @parametrize
+ def test_raw_response_machine_storage(self, client: Dedalus) -> None:
+ response = client.usage.with_raw_response.machine_storage()
+
+ assert response.is_closed is True
+ assert response.http_request.headers.get("X-Stainless-Lang") == "python"
+ usage = response.parse()
+ assert_matches_type(MachineStorageUsage, usage, path=["response"])
+
+ @parametrize
+ def test_streaming_response_machine_storage(self, client: Dedalus) -> None:
+ with client.usage.with_streaming_response.machine_storage() as response:
+ assert not response.is_closed
+ assert response.http_request.headers.get("X-Stainless-Lang") == "python"
+
+ usage = response.parse()
+ assert_matches_type(MachineStorageUsage, usage, path=["response"])
+
+ assert cast(Any, response.is_closed) is True
+
+
+class TestAsyncUsage:
+ parametrize = pytest.mark.parametrize(
+ "async_client", [False, True, {"http_client": "aiohttp"}], indirect=True, ids=["loose", "strict", "aiohttp"]
+ )
+
+ @parametrize
+ async def test_method_retrieve(self, async_client: AsyncDedalus) -> None:
+ usage = await async_client.usage.retrieve()
+ assert_matches_type(OrgUsage, usage, path=["response"])
+
+ @parametrize
+ async def test_method_retrieve_with_all_params(self, async_client: AsyncDedalus) -> None:
+ usage = await async_client.usage.retrieve(
+ period_start="period_start",
+ )
+ assert_matches_type(OrgUsage, usage, path=["response"])
+
+ @parametrize
+ async def test_raw_response_retrieve(self, async_client: AsyncDedalus) -> None:
+ response = await async_client.usage.with_raw_response.retrieve()
+
+ assert response.is_closed is True
+ assert response.http_request.headers.get("X-Stainless-Lang") == "python"
+ usage = await response.parse()
+ assert_matches_type(OrgUsage, usage, path=["response"])
+
+ @parametrize
+ async def test_streaming_response_retrieve(self, async_client: AsyncDedalus) -> None:
+ async with async_client.usage.with_streaming_response.retrieve() as response:
+ assert not response.is_closed
+ assert response.http_request.headers.get("X-Stainless-Lang") == "python"
+
+ usage = await response.parse()
+ assert_matches_type(OrgUsage, usage, path=["response"])
+
+ assert cast(Any, response.is_closed) is True
+
+ @parametrize
+ async def test_method_machine_compute(self, async_client: AsyncDedalus) -> None:
+ usage = await async_client.usage.machine_compute()
+ assert_matches_type(MachineComputeUsage, usage, path=["response"])
+
+ @parametrize
+ async def test_method_machine_compute_with_all_params(self, async_client: AsyncDedalus) -> None:
+ usage = await async_client.usage.machine_compute(
+ granularity="granularity",
+ machine_id="machine_id",
+ period_end="period_end",
+ period_start="period_start",
+ )
+ assert_matches_type(MachineComputeUsage, usage, path=["response"])
+
+ @parametrize
+ async def test_raw_response_machine_compute(self, async_client: AsyncDedalus) -> None:
+ response = await async_client.usage.with_raw_response.machine_compute()
+
+ assert response.is_closed is True
+ assert response.http_request.headers.get("X-Stainless-Lang") == "python"
+ usage = await response.parse()
+ assert_matches_type(MachineComputeUsage, usage, path=["response"])
+
+ @parametrize
+ async def test_streaming_response_machine_compute(self, async_client: AsyncDedalus) -> None:
+ async with async_client.usage.with_streaming_response.machine_compute() as response:
+ assert not response.is_closed
+ assert response.http_request.headers.get("X-Stainless-Lang") == "python"
+
+ usage = await response.parse()
+ assert_matches_type(MachineComputeUsage, usage, path=["response"])
+
+ assert cast(Any, response.is_closed) is True
+
+ @parametrize
+ async def test_method_machine_storage(self, async_client: AsyncDedalus) -> None:
+ usage = await async_client.usage.machine_storage()
+ assert_matches_type(MachineStorageUsage, usage, path=["response"])
+
+ @parametrize
+ async def test_method_machine_storage_with_all_params(self, async_client: AsyncDedalus) -> None:
+ usage = await async_client.usage.machine_storage(
+ machine_id="machine_id",
+ period_end="period_end",
+ period_start="period_start",
+ )
+ assert_matches_type(MachineStorageUsage, usage, path=["response"])
+
+ @parametrize
+ async def test_raw_response_machine_storage(self, async_client: AsyncDedalus) -> None:
+ response = await async_client.usage.with_raw_response.machine_storage()
+
+ assert response.is_closed is True
+ assert response.http_request.headers.get("X-Stainless-Lang") == "python"
+ usage = await response.parse()
+ assert_matches_type(MachineStorageUsage, usage, path=["response"])
+
+ @parametrize
+ async def test_streaming_response_machine_storage(self, async_client: AsyncDedalus) -> None:
+ async with async_client.usage.with_streaming_response.machine_storage() as response:
+ assert not response.is_closed
+ assert response.http_request.headers.get("X-Stainless-Lang") == "python"
+
+ usage = await response.parse()
+ assert_matches_type(MachineStorageUsage, usage, path=["response"])
+
+ assert cast(Any, response.is_closed) is True