Skip to content

Commit 2ed7f56

Browse files
release: 0.3.0 (#8)
Co-authored-by: stainless-app[bot] <142633134+stainless-app[bot]@users.noreply.github.com>
1 parent e4a0cf2 commit 2ed7f56

45 files changed

Lines changed: 1733 additions & 312 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.github/workflows/ci.yml

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -21,10 +21,10 @@ jobs:
2121
runs-on: ${{ github.repository == 'stainless-sdks/dedalus-python' && 'depot-ubuntu-24.04' || 'ubuntu-latest' }}
2222
if: (github.event_name == 'push' || github.event.pull_request.head.repo.fork) && (github.event_name != 'push' || github.event.head_commit.message != 'codegen metadata')
2323
steps:
24-
- uses: actions/checkout@v6
24+
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
2525

2626
- name: Install uv
27-
uses: astral-sh/setup-uv@v5
27+
uses: astral-sh/setup-uv@d4b2f3b6ecc6e67c4457f6d3e41ec42d3d0fcb86 # v5.4.2
2828
with:
2929
version: '0.10.2'
3030

@@ -43,10 +43,10 @@ jobs:
4343
id-token: write
4444
runs-on: ${{ github.repository == 'stainless-sdks/dedalus-python' && 'depot-ubuntu-24.04' || 'ubuntu-latest' }}
4545
steps:
46-
- uses: actions/checkout@v6
46+
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
4747

4848
- name: Install uv
49-
uses: astral-sh/setup-uv@v5
49+
uses: astral-sh/setup-uv@d4b2f3b6ecc6e67c4457f6d3e41ec42d3d0fcb86 # v5.4.2
5050
with:
5151
version: '0.10.2'
5252

@@ -61,7 +61,7 @@ jobs:
6161
github.repository == 'stainless-sdks/dedalus-python' &&
6262
!startsWith(github.ref, 'refs/heads/stl/')
6363
id: github-oidc
64-
uses: actions/github-script@v8
64+
uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8.0.0
6565
with:
6666
script: core.setOutput('github_token', await core.getIDToken());
6767

@@ -81,10 +81,10 @@ jobs:
8181
runs-on: ${{ github.repository == 'stainless-sdks/dedalus-python' && 'depot-ubuntu-24.04' || 'ubuntu-latest' }}
8282
if: github.event_name == 'push' || github.event.pull_request.head.repo.fork
8383
steps:
84-
- uses: actions/checkout@v6
84+
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
8585

8686
- name: Install uv
87-
uses: astral-sh/setup-uv@v5
87+
uses: astral-sh/setup-uv@d4b2f3b6ecc6e67c4457f6d3e41ec42d3d0fcb86 # v5.4.2
8888
with:
8989
version: '0.10.2'
9090

.github/workflows/publish-pypi.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,10 @@ jobs:
1818
id-token: write
1919

2020
steps:
21-
- uses: actions/checkout@v6
21+
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
2222

2323
- name: Install uv
24-
uses: astral-sh/setup-uv@v5
24+
uses: astral-sh/setup-uv@d4b2f3b6ecc6e67c4457f6d3e41ec42d3d0fcb86 # v5.4.2
2525
with:
2626
version: '0.9.13'
2727

.release-please-manifest.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
{
2-
".": "0.2.0"
2+
".": "0.3.0"
33
}

.stats.yml

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
configured_endpoints: 29
2-
openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/dedalus-labs%2Fdedalus-018f649c40452f64a7454d2841a410297ef931793d4f6dbfebab541b060a2b21.yml
3-
openapi_spec_hash: 7fd462f39c9dcf835904c06fea51ef46
4-
config_hash: 816359ffd81767484efabdc39744bf77
1+
configured_endpoints: 32
2+
openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/dedalus-labs/dedalus-8618662d24c795caf31ecb2b62c603c5cb1002386003f3a40854664da766eef4.yml
3+
openapi_spec_hash: 4dd9388612970bff30995d2a4f53fa59
4+
config_hash: 1459e41df47cbb91484141371c74dba9

CHANGELOG.md

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,27 @@
11
# Changelog
22

3+
## 0.3.0 (2026-05-12)
4+
5+
Full Changelog: [v0.2.0...v0.3.0](https://github.com/dedalus-labs/dedalus-python/compare/v0.2.0...v0.3.0)
6+
7+
### Features
8+
9+
* **api:** add orgs usage endpoints, autosleep to machines, remove if_match parameters ([3ecc5f7](https://github.com/dedalus-labs/dedalus-python/commit/3ecc5f71350a236eeb38b6ca1116146378ea7f20))
10+
* **internal/types:** support eagerly validating pydantic iterators ([d2686f3](https://github.com/dedalus-labs/dedalus-python/commit/d2686f3ea4d92a9b4c1ab211f62483dd2cdfc712))
11+
* support setting headers via env ([31654ea](https://github.com/dedalus-labs/dedalus-python/commit/31654ea7dba81fd19b0c334846eb4bf988035224))
12+
13+
14+
### Bug Fixes
15+
16+
* **client:** add missing f-string prefix in file type error message ([aa1c869](https://github.com/dedalus-labs/dedalus-python/commit/aa1c869547ee96d99910ac50f0962c02812cf844))
17+
* use correct field name format for multipart file arrays ([09bc433](https://github.com/dedalus-labs/dedalus-python/commit/09bc4338396af1f0a28df189bd026ce052554532))
18+
19+
20+
### Chores
21+
22+
* **internal:** reformat pyproject.toml ([6a4934a](https://github.com/dedalus-labs/dedalus-python/commit/6a4934a311b675e0b59dfe5e1d521e2d9405b62f))
23+
* remove custom code ([e296321](https://github.com/dedalus-labs/dedalus-python/commit/e2963215b941cf1f14c44215f4c5ba8427ea00d4))
24+
325
## 0.2.0 (2026-04-22)
426

527
Full Changelog: [v0.1.0...v0.2.0](https://github.com/dedalus-labs/dedalus-python/compare/v0.1.0...v0.2.0)

README.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,7 @@ from dedalus_sdk import Dedalus
128128
client = Dedalus()
129129

130130
stream = client.machines.watch(
131-
machine_id="machine_id",
131+
machine_id="dm-3",
132132
)
133133
for machine in stream:
134134
print(machine.machine_id)
@@ -142,7 +142,7 @@ from dedalus_sdk import AsyncDedalus
142142
client = AsyncDedalus()
143143

144144
stream = await client.machines.watch(
145-
machine_id="machine_id",
145+
machine_id="dm-3",
146146
)
147147
async for machine in stream:
148148
print(machine.machine_id)

api.md

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,25 @@
1+
# Orgs
2+
3+
## Usage
4+
5+
Types:
6+
7+
```python
8+
from dedalus_sdk.types.orgs import (
9+
MachineStorageUsage,
10+
MachineStorageUsageEvidence,
11+
MachineUsage,
12+
MachineUsageEvidence,
13+
OrgUsage,
14+
)
15+
```
16+
17+
Methods:
18+
19+
- <code title="get /v1/orgs/{org_id}/usage">client.orgs.usage.<a href="./src/dedalus_sdk/resources/orgs/usage.py">retrieve</a>(\*, org_id, \*\*<a href="src/dedalus_sdk/types/orgs/usage_retrieve_params.py">params</a>) -> <a href="./src/dedalus_sdk/types/orgs/org_usage.py">OrgUsage</a></code>
20+
- <code title="get /v1/orgs/{org_id}/usage/storage/machines">client.orgs.usage.<a href="./src/dedalus_sdk/resources/orgs/usage.py">get_machine_storage_usage</a>(\*, org_id, \*\*<a href="src/dedalus_sdk/types/orgs/usage_get_machine_storage_usage_params.py">params</a>) -> <a href="./src/dedalus_sdk/types/orgs/machine_storage_usage.py">MachineStorageUsage</a></code>
21+
- <code title="get /v1/orgs/{org_id}/usage/machines">client.orgs.usage.<a href="./src/dedalus_sdk/resources/orgs/usage.py">get_machine_usage</a>(\*, org_id, \*\*<a href="src/dedalus_sdk/types/orgs/usage_get_machine_usage_params.py">params</a>) -> <a href="./src/dedalus_sdk/types/orgs/machine_usage.py">MachineUsage</a></code>
22+
123
# Machines
224

325
Types:

pyproject.toml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[project]
22
name = "dedalus-sdk"
3-
version = "0.2.0"
3+
version = "0.3.0"
44
description = "The official Python library for the Dedalus API"
55
dynamic = ["readme"]
66
license = "MIT"
@@ -155,7 +155,7 @@ show_error_codes = true
155155
#
156156
# We also exclude our `tests` as mypy doesn't always infer
157157
# types correctly and Pyright will still catch any type errors.
158-
exclude = ['src/dedalus_sdk/_files.py', '_dev/.*.py', 'tests/.*']
158+
exclude = ["src/dedalus_sdk/_files.py", "_dev/.*.py", "tests/.*"]
159159

160160
strict_equality = true
161161
implicit_reexport = true

src/dedalus_sdk/_client.py

Lines changed: 61 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,11 @@
2020
RequestOptions,
2121
not_given,
2222
)
23-
from ._utils import is_given, get_async_library
23+
from ._utils import (
24+
is_given,
25+
is_mapping_t,
26+
get_async_library,
27+
)
2428
from ._compat import cached_property
2529
from ._models import SecurityOptions
2630
from ._version import __version__
@@ -33,7 +37,8 @@
3337
)
3438

3539
if TYPE_CHECKING:
36-
from .resources import machines
40+
from .resources import orgs, machines
41+
from .resources.orgs.orgs import OrgsResource, AsyncOrgsResource
3742
from .resources.machines.machines import MachinesResource, AsyncMachinesResource
3843

3944
__all__ = ["Timeout", "Transport", "ProxiesTypes", "RequestOptions", "Dedalus", "AsyncDedalus", "Client", "AsyncClient"]
@@ -105,6 +110,15 @@ def __init__(
105110
if base_url is None:
106111
base_url = f"https://dcs.dedaluslabs.ai"
107112

113+
custom_headers_env = os.environ.get("DEDALUS_CUSTOM_HEADERS")
114+
if custom_headers_env is not None:
115+
parsed: dict[str, str] = {}
116+
for line in custom_headers_env.split("\n"):
117+
colon = line.find(":")
118+
if colon >= 0:
119+
parsed[line[:colon].strip()] = line[colon + 1 :].strip()
120+
default_headers = {**parsed, **(default_headers if is_mapping_t(default_headers) else {})}
121+
108122
super().__init__(
109123
version=__version__,
110124
base_url=base_url,
@@ -120,6 +134,12 @@ def __init__(
120134

121135
self._default_stream_cls = Stream
122136

137+
@cached_property
138+
def orgs(self) -> OrgsResource:
139+
from .resources.orgs import OrgsResource
140+
141+
return OrgsResource(self)
142+
123143
@cached_property
124144
def machines(self) -> MachinesResource:
125145
from .resources.machines import MachinesResource
@@ -339,6 +359,15 @@ def __init__(
339359
if base_url is None:
340360
base_url = f"https://dcs.dedaluslabs.ai"
341361

362+
custom_headers_env = os.environ.get("DEDALUS_CUSTOM_HEADERS")
363+
if custom_headers_env is not None:
364+
parsed: dict[str, str] = {}
365+
for line in custom_headers_env.split("\n"):
366+
colon = line.find(":")
367+
if colon >= 0:
368+
parsed[line[:colon].strip()] = line[colon + 1 :].strip()
369+
default_headers = {**parsed, **(default_headers if is_mapping_t(default_headers) else {})}
370+
342371
super().__init__(
343372
version=__version__,
344373
base_url=base_url,
@@ -354,6 +383,12 @@ def __init__(
354383

355384
self._default_stream_cls = AsyncStream
356385

386+
@cached_property
387+
def orgs(self) -> AsyncOrgsResource:
388+
from .resources.orgs import AsyncOrgsResource
389+
390+
return AsyncOrgsResource(self)
391+
357392
@cached_property
358393
def machines(self) -> AsyncMachinesResource:
359394
from .resources.machines import AsyncMachinesResource
@@ -513,6 +548,12 @@ class DedalusWithRawResponse:
513548
def __init__(self, client: Dedalus) -> None:
514549
self._client = client
515550

551+
@cached_property
552+
def orgs(self) -> orgs.OrgsResourceWithRawResponse:
553+
from .resources.orgs import OrgsResourceWithRawResponse
554+
555+
return OrgsResourceWithRawResponse(self._client.orgs)
556+
516557
@cached_property
517558
def machines(self) -> machines.MachinesResourceWithRawResponse:
518559
from .resources.machines import MachinesResourceWithRawResponse
@@ -526,6 +567,12 @@ class AsyncDedalusWithRawResponse:
526567
def __init__(self, client: AsyncDedalus) -> None:
527568
self._client = client
528569

570+
@cached_property
571+
def orgs(self) -> orgs.AsyncOrgsResourceWithRawResponse:
572+
from .resources.orgs import AsyncOrgsResourceWithRawResponse
573+
574+
return AsyncOrgsResourceWithRawResponse(self._client.orgs)
575+
529576
@cached_property
530577
def machines(self) -> machines.AsyncMachinesResourceWithRawResponse:
531578
from .resources.machines import AsyncMachinesResourceWithRawResponse
@@ -539,6 +586,12 @@ class DedalusWithStreamedResponse:
539586
def __init__(self, client: Dedalus) -> None:
540587
self._client = client
541588

589+
@cached_property
590+
def orgs(self) -> orgs.OrgsResourceWithStreamingResponse:
591+
from .resources.orgs import OrgsResourceWithStreamingResponse
592+
593+
return OrgsResourceWithStreamingResponse(self._client.orgs)
594+
542595
@cached_property
543596
def machines(self) -> machines.MachinesResourceWithStreamingResponse:
544597
from .resources.machines import MachinesResourceWithStreamingResponse
@@ -552,6 +605,12 @@ class AsyncDedalusWithStreamedResponse:
552605
def __init__(self, client: AsyncDedalus) -> None:
553606
self._client = client
554607

608+
@cached_property
609+
def orgs(self) -> orgs.AsyncOrgsResourceWithStreamingResponse:
610+
from .resources.orgs import AsyncOrgsResourceWithStreamingResponse
611+
612+
return AsyncOrgsResourceWithStreamingResponse(self._client.orgs)
613+
555614
@cached_property
556615
def machines(self) -> machines.AsyncMachinesResourceWithStreamingResponse:
557616
from .resources.machines import AsyncMachinesResourceWithStreamingResponse

src/dedalus_sdk/_files.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,7 @@ async def async_to_httpx_files(files: RequestFiles | None) -> HttpxRequestFiles
9999
elif is_sequence_t(files):
100100
files = [(key, await _async_transform_file(file)) for key, file in files]
101101
else:
102-
raise TypeError("Unexpected file type input {type(files)}, expected mapping or sequence")
102+
raise TypeError(f"Unexpected file type input {type(files)}, expected mapping or sequence")
103103

104104
return files
105105

0 commit comments

Comments
 (0)